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