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; } } }