1*f1fbf3c2SXin Li package sample.evolve; 2*f1fbf3c2SXin Li 3*f1fbf3c2SXin Li import javassist.tools.web.*; 4*f1fbf3c2SXin Li import java.io.*; 5*f1fbf3c2SXin Li 6*f1fbf3c2SXin Li /** 7*f1fbf3c2SXin Li * A web server for demonstrating class evolution. It must be 8*f1fbf3c2SXin Li * run with a DemoLoader. 9*f1fbf3c2SXin Li * 10*f1fbf3c2SXin Li * If a html file /java.html is requested, this web server calls 11*f1fbf3c2SXin Li * WebPage.show() for constructing the contents of that html file 12*f1fbf3c2SXin Li * So if a DemoLoader changes the definition of WebPage, then 13*f1fbf3c2SXin Li * the image of /java.html is also changed. 14*f1fbf3c2SXin Li * Note that WebPage is not an applet. It is rather 15*f1fbf3c2SXin Li * similar to a CGI script or a servlet. The web server never 16*f1fbf3c2SXin Li * sends the class file of WebPage to web browsers. 17*f1fbf3c2SXin Li * 18*f1fbf3c2SXin Li * Furthermore, if a html file /update.html is requested, this web 19*f1fbf3c2SXin Li * server overwrites WebPage.class (class file) and calls update() 20*f1fbf3c2SXin Li * in VersionManager so that WebPage.class is loaded into the JVM 21*f1fbf3c2SXin Li * again. The new contents of WebPage.class are copied from 22*f1fbf3c2SXin Li * either sample/evolve/WebPage.class 23*f1fbf3c2SXin Li * or sample/evolve/sample/evolve/WebPage.class. 24*f1fbf3c2SXin Li */ 25*f1fbf3c2SXin Li public class DemoServer extends Webserver { 26*f1fbf3c2SXin Li main(String[] args)27*f1fbf3c2SXin Li public static void main(String[] args) throws IOException 28*f1fbf3c2SXin Li { 29*f1fbf3c2SXin Li if (args.length == 1) { 30*f1fbf3c2SXin Li DemoServer web = new DemoServer(Integer.parseInt(args[0])); 31*f1fbf3c2SXin Li web.run(); 32*f1fbf3c2SXin Li } 33*f1fbf3c2SXin Li else 34*f1fbf3c2SXin Li System.err.println( 35*f1fbf3c2SXin Li "Usage: java sample.evolve.DemoServer <port number>"); 36*f1fbf3c2SXin Li } 37*f1fbf3c2SXin Li DemoServer(int port)38*f1fbf3c2SXin Li public DemoServer(int port) throws IOException { 39*f1fbf3c2SXin Li super(port); 40*f1fbf3c2SXin Li htmlfileBase = "sample/evolve/"; 41*f1fbf3c2SXin Li } 42*f1fbf3c2SXin Li 43*f1fbf3c2SXin Li private static final String ver0 = "sample/evolve/WebPage.class.0"; 44*f1fbf3c2SXin Li private static final String ver1 = "sample/evolve/WebPage.class.1"; 45*f1fbf3c2SXin Li private String currentVersion = ver0; 46*f1fbf3c2SXin Li doReply(InputStream in, OutputStream out, String cmd)47*f1fbf3c2SXin Li public void doReply(InputStream in, OutputStream out, String cmd) 48*f1fbf3c2SXin Li throws IOException, BadHttpRequest 49*f1fbf3c2SXin Li { 50*f1fbf3c2SXin Li if (cmd.startsWith("GET /java.html ")) { 51*f1fbf3c2SXin Li runJava(out); 52*f1fbf3c2SXin Li return; 53*f1fbf3c2SXin Li } 54*f1fbf3c2SXin Li else if (cmd.startsWith("GET /update.html ")) { 55*f1fbf3c2SXin Li try { 56*f1fbf3c2SXin Li if (currentVersion == ver0) 57*f1fbf3c2SXin Li currentVersion = ver1; 58*f1fbf3c2SXin Li else 59*f1fbf3c2SXin Li currentVersion = ver0; 60*f1fbf3c2SXin Li 61*f1fbf3c2SXin Li updateClassfile(currentVersion); 62*f1fbf3c2SXin Li VersionManager.update("sample.evolve.WebPage"); 63*f1fbf3c2SXin Li } 64*f1fbf3c2SXin Li catch (CannotUpdateException e) { 65*f1fbf3c2SXin Li logging(e.toString()); 66*f1fbf3c2SXin Li } 67*f1fbf3c2SXin Li catch (FileNotFoundException e) { 68*f1fbf3c2SXin Li logging(e.toString()); 69*f1fbf3c2SXin Li } 70*f1fbf3c2SXin Li } 71*f1fbf3c2SXin Li 72*f1fbf3c2SXin Li super.doReply(in, out, cmd); 73*f1fbf3c2SXin Li } 74*f1fbf3c2SXin Li runJava(OutputStream outs)75*f1fbf3c2SXin Li private void runJava(OutputStream outs) throws IOException { 76*f1fbf3c2SXin Li OutputStreamWriter out = new OutputStreamWriter(outs); 77*f1fbf3c2SXin Li out.write("HTTP/1.0 200 OK\r\n\r\n"); 78*f1fbf3c2SXin Li WebPage page = new WebPage(); 79*f1fbf3c2SXin Li page.show(out); 80*f1fbf3c2SXin Li out.close(); 81*f1fbf3c2SXin Li } 82*f1fbf3c2SXin Li 83*f1fbf3c2SXin Li /* updateClassfile() copies the specified file to WebPage.class. 84*f1fbf3c2SXin Li */ updateClassfile(String filename)85*f1fbf3c2SXin Li private void updateClassfile(String filename) 86*f1fbf3c2SXin Li throws IOException, FileNotFoundException 87*f1fbf3c2SXin Li { 88*f1fbf3c2SXin Li byte[] buf = new byte[1024]; 89*f1fbf3c2SXin Li 90*f1fbf3c2SXin Li FileInputStream fin 91*f1fbf3c2SXin Li = new FileInputStream(filename); 92*f1fbf3c2SXin Li FileOutputStream fout 93*f1fbf3c2SXin Li = new FileOutputStream("sample/evolve/WebPage.class"); 94*f1fbf3c2SXin Li for (;;) { 95*f1fbf3c2SXin Li int len = fin.read(buf); 96*f1fbf3c2SXin Li if (len >= 0) 97*f1fbf3c2SXin Li fout.write(buf, 0, len); 98*f1fbf3c2SXin Li else 99*f1fbf3c2SXin Li break; 100*f1fbf3c2SXin Li } 101*f1fbf3c2SXin Li } 102*f1fbf3c2SXin Li } 103