xref: /aosp_15_r20/external/javassist/sample/evolve/DemoServer.java (revision f1fbf3c2ab775ce834e0af96b7a85bdc7a0eac65)
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