package sample.evolve;
import javassist.tools.web.*;
import java.io.*;
/**
* A web server for demonstrating class evolution. It must be
* run with a DemoLoader.
*
* If a html file /java.html is requested, this web server calls
* WebPage.show() for constructing the contents of that html file
* So if a DemoLoader changes the definition of WebPage, then
* the image of /java.html is also changed.
* Note that WebPage is not an applet. It is rather
* similar to a CGI script or a servlet. The web server never
* sends the class file of WebPage to web browsers.
*
* Furthermore, if a html file /update.html is requested, this web
* server overwrites WebPage.class (class file) and calls update()
* in VersionManager so that WebPage.class is loaded into the JVM
* again. The new contents of WebPage.class are copied from
* either sample/evolve/WebPage.class
* or sample/evolve/sample/evolve/WebPage.class.
*/
public class DemoServer extends Webserver {
public static void main(String[] args) throws IOException
{
if (args.length == 1) {
DemoServer web = new DemoServer(Integer.parseInt(args[0]));
web.run();
}
else
System.err.println(
"Usage: java sample.evolve.DemoServer <port number>");
}
public DemoServer(int port) throws IOException {
super(port);
htmlfileBase = "sample/evolve/";
}
private static final String ver0 = "sample/evolve/WebPage.class.0";
private static final String ver1 = "sample/evolve/WebPage.class.1";
private String currentVersion = ver0;
public void doReply(InputStream in, OutputStream out, String cmd)
throws IOException, BadHttpRequest
{
if (cmd.startsWith("GET /java.html ")) {
runJava(out);
return;
}
else if (cmd.startsWith("GET /update.html ")) {
try {
if (currentVersion == ver0)
currentVersion = ver1;
else
currentVersion = ver0;
updateClassfile(currentVersion);
VersionManager.update("sample.evolve.WebPage");
}
catch (CannotUpdateException e) {
logging(e.toString());
}
catch (FileNotFoundException e) {
logging(e.toString());
}
}
super.doReply(in, out, cmd);
}
private void runJava(OutputStream outs) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(outs);
out.write("HTTP/1.0 200 OK\r\n\r\n");
WebPage page = new WebPage();
page.show(out);
out.close();
}
/* updateClassfile() copies the specified file to WebPage.class.
*/
private void updateClassfile(String filename)
throws IOException, FileNotFoundException
{
byte[] buf = new byte[1024];
FileInputStream fin
= new FileInputStream(filename);
FileOutputStream fout
= new FileOutputStream("sample/evolve/WebPage.class");
for (;;) {
int len = fin.read(buf);
if (len >= 0)
fout.write(buf, 0, len);
else
break;
}
}
}