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