aboutsummaryrefslogtreecommitdiffstats
path: root/tools/control
diff options
context:
space:
mode:
authorrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-09 16:58:33 +0000
committerrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-09 16:58:33 +0000
commit84c2a732dece7e1cb5a3026c1f12b03e80b99b95 (patch)
tree53c2c1d0273f3ae8911c74ebd1d8e399809878ee /tools/control
parent3b29584f2d1db02aca1ee7a3dbca8ce7053cd116 (diff)
downloadxen-84c2a732dece7e1cb5a3026c1f12b03e80b99b95.tar.gz
xen-84c2a732dece7e1cb5a3026c1f12b03e80b99b95.tar.bz2
xen-84c2a732dece7e1cb5a3026c1f12b03e80b99b95.zip
bitkeeper revision 1.319.1.2 (3f0c49b9kvjGDv1bC1QhQNwfEHw9kw)
Port of web-based virtual disk manager complete.
Diffstat (limited to 'tools/control')
-rw-r--r--tools/control/src/org/xenoserver/web/RootBean.java141
-rw-r--r--tools/control/web/tmpl/vd-fv.tmpl28
-rw-r--r--tools/control/web/tmpl/vd-pa.tmpl6
-rw-r--r--tools/control/web/tmpl/vd-par.tmpl2
-rw-r--r--tools/control/web/tmpl/vd-pv.tmpl6
-rw-r--r--tools/control/web/tmpl/vd-vbdc.tmpl14
-rw-r--r--tools/control/web/tmpl/vd-vbdcr.tmpl11
-rw-r--r--tools/control/web/tmpl/vd-vbdf.tmpl9
-rw-r--r--tools/control/web/tmpl/vd-vbdfr.tmpl2
-rw-r--r--tools/control/web/tmpl/vd-vbdv.tmpl10
-rw-r--r--tools/control/web/tmpl/vd-vdcr.tmpl4
-rw-r--r--tools/control/web/tmpl/vd-vdd.tmpl10
-rw-r--r--tools/control/web/tmpl/vd-vddr.tmpl2
-rw-r--r--tools/control/web/tmpl/vd-vdr.tmpl10
-rw-r--r--tools/control/web/tmpl/vd-vdrr.tmpl4
-rw-r--r--tools/control/web/tmpl/vd-vdv.tmpl10
-rw-r--r--tools/control/web/tmpl/xenohead.def1
17 files changed, 80 insertions, 190 deletions
diff --git a/tools/control/src/org/xenoserver/web/RootBean.java b/tools/control/src/org/xenoserver/web/RootBean.java
index cf65a8f0e1..858ee9e3ad 100644
--- a/tools/control/src/org/xenoserver/web/RootBean.java
+++ b/tools/control/src/org/xenoserver/web/RootBean.java
@@ -14,10 +14,6 @@ import org.xenoserver.control.VirtualDiskManager;
import org.xenoserver.control.XML;
public class RootBean implements HttpSessionBindingListener {
- static String state_filename_out = "/var/lib/xen/vdstate.xml";
- static String partition_filename = "/proc/partitions";
- static int default_sector_size = 512;
-
PartitionManager pm;
VirtualDiskManager vdm;
@@ -34,140 +30,15 @@ public class RootBean implements HttpSessionBindingListener {
public void valueUnbound(HttpSessionBindingEvent event) {
doFlushState();
}
-
-/*
- public int getPartitionCount() {
- return pm.getPartitionCount();
- }
-
- public Partition getPartition(int index) {
- return pm.getPartition(index);
- }
-
- public String doAddPartition(String partition, String chunksize) {
- Partition p = pm.get_partition(partition);
- String result = "done";
- int loop;
- long size;
-
- if (p == null) {
- return (" eh? what partition: " + partition);
- }
-
- size = Library.parse_size(chunksize) / default_sector_size;
- if (size == 0) {
- return ("error: invalid chunk size");
- }
- vdm.add_xeno_partition(p, size);
- pm.add_xeno_partition(p);
-
- return "done";
- }
-
- public int getVirtualDiskCount() {
- return vdm.getVirtualDiskCount();
- }
-
- public VirtualDisk getVirtualDisk(int index) {
- return vdm.getVirtualDisk(index);
- }
-
- public VirtualDisk getVirtualDiskKey(String key) {
- return vdm.get_virtual_disk_key(key);
+
+ public PartitionManager pm() {
+ return pm;
}
-
- public String doCreateVirtualDisk(String name, String size, long expiry) {
- VirtualDisk vd;
- Date date = new Date();
- long parse_size;
-
- parse_size = Library.parse_size(size) / default_sector_size;
- if (parse_size == 0) {
- return ("error: invalid size");
- }
- vd =
- vdm.create_virtual_disk(
- name,
- parse_size,
- new Date(date.getTime() + expiry));
-
- return ("Virtual Disk created with key: " + vd.get_key());
-
+
+ public VirtualDiskManager vdm() {
+ return vdm;
}
- public String doDeleteVirtualDisk(String key) {
- if (key == null || key.trim().equals("")) {
- return ("error: no virtual disk specified");
- }
- vdm.delete_virtual_disk(key);
-
- return ("okay");
- }
-
- public String doRefreshVirtualDisk(String key, long expiry) {
- VirtualDisk vd = vdm.get_virtual_disk_key(key);
- Date date;
- String s = "";
-
- if (vd == null) {
- return ("disk not found: " + key);
- }
- s = vd.get_expiry().toString();
- date = new Date(vd.get_expiry().getTime() + expiry);
- vd.set_expiry(date);
-
- return ("okay " + expiry + " " + s + " " + date.toString());
- }
-
- public int getFreeExtentCount() {
- VirtualDisk free = vdm.getFreeVirtualDisk();
- return free.getExtentCount();
- }
-
- public Extent getFreeExtent(int index) {
- VirtualDisk free = vdm.getFreeVirtualDisk();
- return free.getExtent(index);
- }
-
- public Enumeration getVirtualBlockDevices() {
- return vdm.getVirtualBlockDevices();
- }
-
- public String doCreateVirtualBlockDevice(
- String vd_key,
- int domain,
- int vbd_num,
- String mode) {
- VirtualBlockDevice vbd;
- VirtualDisk vd;
-
- vbd = vdm.create_virtual_block_device(vd_key, domain, vbd_num, mode);
- if (vbd != null) {
- String command;
- FileWriter fw;
-
- vd = vdm.get_virtual_disk_key(vd_key);
- command = vd.dump_xen(vbd);
-
- try {
- fw = new FileWriter("/proc/xeno/dom0/vhd");
- fw.write(command);
- fw.flush();
- fw.close();
- } catch (Exception e) {
- return (e.toString());
- }
- return command;
- } else {
- return "Error encountered";
- }
- }
-
- public String doFlushVirtualBlockDevices() {
- vdm.flush_virtual_block_devices();
- return "done";
- }
-*/
public void doFlushState() {
XML.saveState(pm, vdm, Settings.STATE_OUTPUT_FILE);
}
diff --git a/tools/control/web/tmpl/vd-fv.tmpl b/tools/control/web/tmpl/vd-fv.tmpl
index e8b41a2bb5..fa9ee1f838 100644
--- a/tools/control/web/tmpl/vd-fv.tmpl
+++ b/tools/control/web/tmpl/vd-fv.tmpl
@@ -10,25 +10,32 @@ BREADCRUMB&Virtual Disk Manager&vd.jsp
INCLUDE&vdmenu.tmpl
<td valign="top">
+<%
+ VirtualDisk free = root.vdm().getFreeDisk();
+%>
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td>
+Total available free space: <%= Library.formatSize(free.getSize() * Settings.SECTOR_SIZE,8,true) %>
+</td></tr>
+
+
+##WHITESPACE## ##GREYLINE1## ##WHITESPACE##
+
+<tr><td>
<table cellpadding="2" cellspacing="0" border="0">
<tbody>
- <tr class="vdh"><td>idx</td><td>disk</td><td>offset</td><td>size </td></tr>
+ <tr class="vdh"><td>disk</td><td>offset</td><td>size </td></tr>
<%
- long space = 0;
- int count = root.getFreeExtentCount();
- for (int loop = 0; loop < count; loop++)
+ Iterator i = free.extents();
+ while (i.hasNext())
{
- Extent e = root.getFreeExtent(loop);
- space += e.getSize();
+ Extent e = (Extent) i.next();
%>
<tr class="vdt">
- <td ><%= loop %></td>
<td ><%= e.getDisk() %></td>
<td align="right"><%= e.getOffset() %> </td>
<td align="right"><%= e.getSize() %> </td>
@@ -40,13 +47,6 @@ INCLUDE&vdmenu.tmpl
</table>
</td></tr>
-
-##WHITESPACE## ##GREYLINE1## ##WHITESPACE##
-
-<tr><td>
-Total available freespace: <%= space * 512 / (1024 * 1024) %> MB
-</td></tr>
-
</tbody>
</table>
diff --git a/tools/control/web/tmpl/vd-pa.tmpl b/tools/control/web/tmpl/vd-pa.tmpl
index e71a6bf195..9b8ec98c60 100644
--- a/tools/control/web/tmpl/vd-pa.tmpl
+++ b/tools/control/web/tmpl/vd-pa.tmpl
@@ -20,11 +20,11 @@ INCLUDE&vdmenu.tmpl
<tbody>
<tr class="vdh"><td></td><td>maj:min</td><td>blocks</td><td>start sect</td><td>num sects</td><td>name</td></tr>
<%
- int count = root.getPartitionCount();
+ int count = root.pm().getPartitionCount();
for (int loop = 0; loop < count; loop++)
{
- Partition p = root.getPartition(loop);
- if (p.getIsXeno() == true)
+ Partition p = root.pm().getPartition(loop);
+ if (p.isXeno() == true)
{
%>
<tr class="vds"><td></td>
diff --git a/tools/control/web/tmpl/vd-par.tmpl b/tools/control/web/tmpl/vd-par.tmpl
index b72e99b814..a88602441a 100644
--- a/tools/control/web/tmpl/vd-par.tmpl
+++ b/tools/control/web/tmpl/vd-par.tmpl
@@ -40,7 +40,7 @@ Error: chunk size not specified.<br>
{
%>
output[<%= i %>] =<br>
-<%= root.doAddPartition(partitions[i], size) %> <br>
+<%= new CommandPartitionAdd(partitions[i], Library.parseSize(size), false).execute() %> <br>
<%
}
}
diff --git a/tools/control/web/tmpl/vd-pv.tmpl b/tools/control/web/tmpl/vd-pv.tmpl
index 8195f82964..4647f337a5 100644
--- a/tools/control/web/tmpl/vd-pv.tmpl
+++ b/tools/control/web/tmpl/vd-pv.tmpl
@@ -16,11 +16,11 @@ note: highlighted entries are currently being used as xeno partitions.
<tbody>
<tr class="vdh"><td>maj:min</td><td>blocks</td><td>start sect</td><td>num sects</td><td>name</td></tr>
<%
- int count = root.getPartitionCount();
+ int count = root.pm().getPartitionCount();
for (int loop = 0; loop < count; loop++)
{
- Partition p = root.getPartition(loop);
- if (p.getIsXeno() == true)
+ Partition p = root.pm().getPartition(loop);
+ if (p.isXeno() == true)
{
%>
<tr class="vds">
diff --git a/tools/control/web/tmpl/vd-vbdc.tmpl b/tools/control/web/tmpl/vd-vbdc.tmpl
index e6952182b8..f6b560badc 100644
--- a/tools/control/web/tmpl/vd-vbdc.tmpl
+++ b/tools/control/web/tmpl/vd-vbdc.tmpl
@@ -16,25 +16,25 @@ INCLUDE&vdmenu.tmpl
<tr><td>
<table cellpadding="2" cellspacing="0" border="0">
<tbody>
- <tr class="vdh"><td></td><td>vd key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td></tr>
+ <tr class="vdh"><td></td><td>vd key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td><td width="5"></td><td>size</td></tr>
<%
- int count = root.getVirtualDiskCount();
- for (int loop = 0; loop < count; loop++)
+ Iterator i = root.vdm().getVirtualDisks();
+ while (i.hasNext())
{
- VirtualDisk vd = root.getVirtualDisk(loop);
+ VirtualDisk vd = (VirtualDisk) i.next();
%>
<tr class="vdt">
<td>
- <input type="radio" name="vd"
- <% if (loop == 0) { %> checked <% } %>
- value="<%= vd.getKey() %>">
+ <input type="radio" name="vd" value="<%= vd.getKey() %>">
</td>
<td><%= vd.getKey() %></td>
<td></td>
<td><%= vd.getName() %></td>
<td></td>
<td><%= vd.getExpiry() %></td>
+ <td></td>
+ <td><%= Library.formatSize(vd.getSize()*Settings.SECTOR_SIZE,8,false) %></td>
</tr>
<%
}
diff --git a/tools/control/web/tmpl/vd-vbdcr.tmpl b/tools/control/web/tmpl/vd-vbdcr.tmpl
index 656be575fc..05bd41992b 100644
--- a/tools/control/web/tmpl/vd-vbdcr.tmpl
+++ b/tools/control/web/tmpl/vd-vbdcr.tmpl
@@ -46,11 +46,18 @@ Error: No virtual block device number specified.<br>
{
domain = Integer.decode(hsrw.getParameter("domain")).intValue();
vbd = Integer.decode(hsrw.getParameter("vbd")).intValue();
+ Mode mode;
+ if (hsrw.getParameter("mode").equals("rw")) {
+ mode = Mode.READ_WRITE;
+ } else {
+ mode = Mode.READ_ONLY;
+ }
+
%>
output =<br>
-<%= root.doCreateVirtualBlockDevice(hsrw.getParameter("vd"),
+<%= new CommandVbdCreate(hsrw.getParameter("vd"),
domain, vbd,
- hsrw.getParameter("mode")) %>
+ mode).execute() %>
<%
}
catch (NumberFormatException e)
diff --git a/tools/control/web/tmpl/vd-vbdf.tmpl b/tools/control/web/tmpl/vd-vbdf.tmpl
index 0dbcc8d93d..eb46b158d6 100644
--- a/tools/control/web/tmpl/vd-vbdf.tmpl
+++ b/tools/control/web/tmpl/vd-vbdf.tmpl
@@ -20,14 +20,15 @@ INCLUDE&vdmenu.tmpl
<tr class="vdh"><td>vd key</td><td>dom</td><td>vbd</td><td>mode</td></tr>
<%
- for (Enumeration e = root.getVirtualBlockDevices(); e.hasMoreElements();)
+ for (Iterator i = root.vdm().getVirtualBlockDevices(); i.hasNext();)
{
- VirtualBlockDevice vbd = (VirtualBlockDevice) e.nextElement();
+ VirtualBlockDevice vbd = (VirtualBlockDevice) i.next();
+ VirtualDisk vd = vbd.getVirtualDisk();
%>
<tr class="vdt">
- <td><%= vbd.getKey() %></td>
+ <td><%= vd.getKey() %></td>
<td><%= vbd.getDomain() %></td>
- <td><%= vbd.getVBDNum() %></td>
+ <td><%= vbd.getVbdNum() %></td>
<td><%= vbd.getMode().toString() %></td>
</tr>
<%
diff --git a/tools/control/web/tmpl/vd-vbdfr.tmpl b/tools/control/web/tmpl/vd-vbdfr.tmpl
index 566f4cb038..0d172923bd 100644
--- a/tools/control/web/tmpl/vd-vbdfr.tmpl
+++ b/tools/control/web/tmpl/vd-vbdfr.tmpl
@@ -17,7 +17,7 @@ INCLUDE&vdmenu.tmpl
<%
HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request);
%>
-output = <%= root.doFlushVirtualBlockDevices() %>
+output = <%= new CommandVbdFlush().execute() %>
<%
root.doFlushState();
%>
diff --git a/tools/control/web/tmpl/vd-vbdv.tmpl b/tools/control/web/tmpl/vd-vbdv.tmpl
index 306372e2bb..6a0a03947c 100644
--- a/tools/control/web/tmpl/vd-vbdv.tmpl
+++ b/tools/control/web/tmpl/vd-vbdv.tmpl
@@ -16,16 +16,16 @@ INCLUDE&vdmenu.tmpl
<%
- for (Enumeration e = root.getVirtualBlockDevices(); e.hasMoreElements();)
+ for (Iterator i = root.vdm().getVirtualBlockDevices(); i.hasNext();)
{
- VirtualBlockDevice vbd = (VirtualBlockDevice) e.nextElement();
- VirtualDisk vd = root.getVirtualDiskKey(vbd.getKey());
+ VirtualBlockDevice vbd = (VirtualBlockDevice) i.next();
+ VirtualDisk vd = vbd.getVirtualDisk();
%>
<tr class="vdt">
<td><%= vbd.getDomain() %></td>
- <td><%= vbd.getVBDNum() %></td>
+ <td><%= vbd.getVbdNum() %></td>
<td><%= vbd.getMode().toString() %></td>
- <td><%= vbd.getKey() %></td>
+ <td><%= vd.getKey() %></td>
<td><%= vd.getName() %></td>
</tr>
<%
diff --git a/tools/control/web/tmpl/vd-vdcr.tmpl b/tools/control/web/tmpl/vd-vdcr.tmpl
index 08e63b2e90..9550407a1b 100644
--- a/tools/control/web/tmpl/vd-vdcr.tmpl
+++ b/tools/control/web/tmpl/vd-vdcr.tmpl
@@ -60,9 +60,11 @@ Error: expiry time not specified.<br>
{
expiry *= 24 * 60 * 60 * 1000 * 365;
}
+
+ expiry += System.currentTimeMillis();
%>
output =<br>
-<%= root.doCreateVirtualDisk( hsrw.getParameter("name"), size, expiry) %>
+<%= new CommandVdCreate( hsrw.getParameter("name"), Library.parseSize(size), new Date(expiry)).execute() %>
<br>
<%
}
diff --git a/tools/control/web/tmpl/vd-vdd.tmpl b/tools/control/web/tmpl/vd-vdd.tmpl
index 920899b1b2..3b50e1450c 100644
--- a/tools/control/web/tmpl/vd-vdd.tmpl
+++ b/tools/control/web/tmpl/vd-vdd.tmpl
@@ -16,13 +16,13 @@ INCLUDE&vdmenu.tmpl
<tr><td>
<table cellpadding="2" cellspacing="0" border="0">
<tbody>
- <tr class="vdh"><td></td><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td></tr>
+ <tr class="vdh"><td></td><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td><td width="5"></td><td>size</td></tr>
<%
- int count = root.getVirtualDiskCount();
- for (int loop = 0; loop < count; loop++)
+ Iterator i = root.vdm().getVirtualDisks();
+ while (i.hasNext())
{
- VirtualDisk vd = root.getVirtualDisk(loop);
+ VirtualDisk vd = (VirtualDisk) i.next();
%>
<tr class="vdt">
<td><input type="checkbox" name="vd" value="<%= vd.getKey() %>"></td>
@@ -31,6 +31,8 @@ INCLUDE&vdmenu.tmpl
<td><%= vd.getName() %></td>
<td></td>
<td><%= vd.getExpiry() %></td>
+ <td></td>
+ <td><%= Library.formatSize(vd.getSize()*Settings.SECTOR_SIZE,8,false) %></td>
</tr>
<%
}
diff --git a/tools/control/web/tmpl/vd-vddr.tmpl b/tools/control/web/tmpl/vd-vddr.tmpl
index 13925ebb8b..355c111e81 100644
--- a/tools/control/web/tmpl/vd-vddr.tmpl
+++ b/tools/control/web/tmpl/vd-vddr.tmpl
@@ -18,7 +18,7 @@ INCLUDE&vdmenu.tmpl
vd= <%= hsrw.getParameter("vd") %>
-vd= <%= root.doDeleteVirtualDisk(hsrw.getParameter("vd")) %>
+vd= <%= new CommandVdDelete(hsrw.getParameter("vd")).execute() %>
<%
root.doFlushState();
diff --git a/tools/control/web/tmpl/vd-vdr.tmpl b/tools/control/web/tmpl/vd-vdr.tmpl
index 551d230ceb..df9c20abf6 100644
--- a/tools/control/web/tmpl/vd-vdr.tmpl
+++ b/tools/control/web/tmpl/vd-vdr.tmpl
@@ -16,13 +16,13 @@ INCLUDE&vdmenu.tmpl
<tr><td>
<table cellpadding="2" cellspacing="0" border="0">
<tbody>
- <tr class="vdh"><td></td><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td></tr>
+ <tr class="vdh"><td></td><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td><td width="5"></td><td>size</td></tr>
<%
- int count = root.getVirtualDiskCount();
- for (int loop = 0; loop < count; loop++)
+ Iterator i = root.vdm().getVirtualDisks();
+ while (i.hasNext())
{
- VirtualDisk vd = root.getVirtualDisk(loop);
+ VirtualDisk vd = (VirtualDisk) i.next();
%>
<tr class="vdt">
<td><input type="checkbox" name="vd" value="<%= vd.getKey() %>"></td>
@@ -31,6 +31,8 @@ INCLUDE&vdmenu.tmpl
<td><%= vd.getName() %></td>
<td></td>
<td><%= vd.getExpiry() %></td>
+ <td></td>
+ <td><%= Library.formatSize(vd.getSize()*Settings.SECTOR_SIZE,8,false) %></td>
</tr>
<%
}
diff --git a/tools/control/web/tmpl/vd-vdrr.tmpl b/tools/control/web/tmpl/vd-vdrr.tmpl
index 068b283056..bca0dccf87 100644
--- a/tools/control/web/tmpl/vd-vdrr.tmpl
+++ b/tools/control/web/tmpl/vd-vdrr.tmpl
@@ -51,10 +51,12 @@ Error: expiry time not specified.<br>
expiry *= 24 * 60 * 60 * 1000 * 365;
}
+ expiry += System.currentTimeMillis();
+
for (int i = 0; i < vds.length; i++)
{
%>
-vd = <%= root.doRefreshVirtualDisk(vds[i], expiry) %> <br>
+vd = <%= new CommandVdRefresh(vds[i], new Date(expiry)).execute() %> <br>
<%
}
}
diff --git a/tools/control/web/tmpl/vd-vdv.tmpl b/tools/control/web/tmpl/vd-vdv.tmpl
index e03cd6959f..78a6f9b774 100644
--- a/tools/control/web/tmpl/vd-vdv.tmpl
+++ b/tools/control/web/tmpl/vd-vdv.tmpl
@@ -12,13 +12,13 @@ INCLUDE&vdmenu.tmpl
<table cellpadding="2" cellspacing="0" border="0">
<tbody>
- <tr class="vdh"><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td></tr>
+ <tr class="vdh"><td>key</td><td width="5"></td><td>name</td><td width="5"></td><td>expiry</td><td width="5"></td><td>size</td></tr>
<%
- int count = root.getVirtualDiskCount();
- for (int loop = 0; loop < count; loop++)
+ Iterator i = root.vdm().getVirtualDisks();
+ while (i.hasNext())
{
- VirtualDisk vd = root.getVirtualDisk(loop);
+ VirtualDisk vd = (VirtualDisk) i.next();
%>
<tr class="vdt">
<td><%= vd.getKey() %></td>
@@ -26,6 +26,8 @@ INCLUDE&vdmenu.tmpl
<td><%= vd.getName() %></td>
<td></td>
<td><%= vd.getExpiry() %></td>
+ <td></td>
+ <td><%= Library.formatSize(vd.getSize()*Settings.SECTOR_SIZE,8,false) %></td>
</tr>
<%
}
diff --git a/tools/control/web/tmpl/xenohead.def b/tools/control/web/tmpl/xenohead.def
index 5b0934a051..12b957a1df 100644
--- a/tools/control/web/tmpl/xenohead.def
+++ b/tools/control/web/tmpl/xenohead.def
@@ -8,6 +8,7 @@
<%@ page import="org.xenoserver.web.*" %>
<%@ page import="org.xenoserver.control.*" %>
<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.Date" %>
<%@ page import="javax.servlet.http.HttpServletRequestWrapper" %>
<html lang="en">