01: package sample.evolve;
02:
03: import javassist.tools.web.*;
04: import java.io.*;
05:
06: /**
07: * A web server for demonstrating class evolution. It must be
08: * run with a DemoLoader.
09: *
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:
27: public static void main(String[] args) throws IOException {
28: if (args.length == 1) {
29: DemoServer web = new DemoServer(Integer.parseInt(args[0]));
30: web.run();
31: } else
32: System.err
33: .println("Usage: java sample.evolve.DemoServer <port number>");
34: }
35:
36: public DemoServer(int port) throws IOException {
37: super (port);
38: htmlfileBase = "sample/evolve/";
39: }
40:
41: private static final String ver0 = "sample/evolve/WebPage.class.0";
42: private static final String ver1 = "sample/evolve/WebPage.class.1";
43: private String currentVersion = ver0;
44:
45: public void doReply(InputStream in, OutputStream out, String cmd)
46: throws IOException, BadHttpRequest {
47: if (cmd.startsWith("GET /java.html ")) {
48: runJava(out);
49: return;
50: } else if (cmd.startsWith("GET /update.html ")) {
51: try {
52: if (currentVersion == ver0)
53: currentVersion = ver1;
54: else
55: currentVersion = ver0;
56:
57: updateClassfile(currentVersion);
58: VersionManager.update("sample.evolve.WebPage");
59: } catch (CannotUpdateException e) {
60: logging(e.toString());
61: } catch (FileNotFoundException e) {
62: logging(e.toString());
63: }
64: }
65:
66: super .doReply(in, out, cmd);
67: }
68:
69: private void runJava(OutputStream outs) throws IOException {
70: OutputStreamWriter out = new OutputStreamWriter(outs);
71: out.write("HTTP/1.0 200 OK\r\n\r\n");
72: WebPage page = new WebPage();
73: page.show(out);
74: out.close();
75: }
76:
77: /* updateClassfile() copies the specified file to WebPage.class.
78: */
79: private void updateClassfile(String filename) throws IOException,
80: FileNotFoundException {
81: byte[] buf = new byte[1024];
82:
83: FileInputStream fin = new FileInputStream(filename);
84: FileOutputStream fout = new FileOutputStream(
85: "sample/evolve/WebPage.class");
86: for (;;) {
87: int len = fin.read(buf);
88: if (len >= 0)
89: fout.write(buf, 0, len);
90: else
91: break;
92: }
93: }
94: }
|