launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
branchclosure
changeset 1513 ba912ef24b27
parent 1505 706b66d8c481
parent 1390 fe8f6b27c702
child 1525 777bd3ed81ba
     1.1 --- a/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Tue Apr 29 14:59:40 2014 +0200
     1.2 +++ b/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Wed Apr 30 15:04:10 2014 +0200
     1.3 @@ -17,9 +17,17 @@
     1.4   */
     1.5  package org.apidesign.bck2brwsr.launcher;
     1.6  
     1.7 +import java.io.File;
     1.8 +import java.io.FileReader;
     1.9  import java.io.IOException;
    1.10 +import java.io.InputStream;
    1.11 +import java.io.InputStreamReader;
    1.12 +import java.io.Reader;
    1.13 +import java.net.MalformedURLException;
    1.14  import java.net.URL;
    1.15  import java.util.jar.JarFile;
    1.16 +import java.util.logging.Level;
    1.17 +import org.apidesign.vm4brwsr.Bck2Brwsr;
    1.18  
    1.19  /**
    1.20   * Lightweight server to launch Bck2Brwsr applications and tests.
    1.21 @@ -48,15 +56,54 @@
    1.22      
    1.23      @Override
    1.24      void generateBck2BrwsrJS(StringBuilder sb, final Res loader) throws IOException {
    1.25 -        CompileCP.compileVM(sb, loader);
    1.26 +        String b2b = System.getProperty("bck2brwsr.js");
    1.27 +        if (b2b != null) {
    1.28 +            LOG.log(Level.INFO, "Serving bck2brwsr.js from {0}", b2b);
    1.29 +            URL bu;
    1.30 +            try {
    1.31 +                bu = new URL(b2b);
    1.32 +            } catch (MalformedURLException ex) {
    1.33 +                File f = new File(b2b);
    1.34 +                if (f.exists()) {
    1.35 +                    bu = f.toURI().toURL();
    1.36 +                } else {
    1.37 +                    throw ex;
    1.38 +                }
    1.39 +            }
    1.40 +            try (Reader r = new InputStreamReader(bu.openStream())) {
    1.41 +                char[] arr = new char[4096];
    1.42 +                for (;;) {
    1.43 +                   int len = r.read(arr);
    1.44 +                   if (len == -1) {
    1.45 +                       break;
    1.46 +                   }
    1.47 +                   sb.append(arr, 0, len);
    1.48 +                }
    1.49 +            }
    1.50 +        } else {
    1.51 +            LOG.log(Level.INFO, "Generating bck2brwsr.js from scratch", b2b);
    1.52 +            CompileCP.compileVM(sb, loader);
    1.53 +        }
    1.54          sb.append(
    1.55 -              "(function WrapperVM(global) {"
    1.56 -            + "  function ldCls(res) {\n"
    1.57 +              "(function WrapperVM(global) {\n"
    1.58 +            + "  var cache = {};\n"
    1.59 +            + "  function ldCls(res, skip) {\n"
    1.60 +            + "    var c = cache[res];\n"
    1.61 +            + "    if (c) {\n"
    1.62 +            + "      if (c[skip]) return c[skip];\n"
    1.63 +            + "      if (c[skip] === null) return null;\n"
    1.64 +            + "    } else {\n"
    1.65 +            + "      cache[res] = c = new Array();\n"
    1.66 +            + "    }\n"
    1.67              + "    var request = new XMLHttpRequest();\n"
    1.68 -            + "    request.open('GET', '/classes/' + res, false);\n"
    1.69 +            + "    request.open('GET', '/classes/' + res + '?skip=' + skip, false);\n"
    1.70              + "    request.send();\n"
    1.71 -            + "    if (request.status !== 200) return null;\n"
    1.72 +            + "    if (request.status !== 200) {\n"
    1.73 +            + "      c[skip] = null;\n"
    1.74 +            + "      return null;\n"
    1.75 +            + "    }\n"
    1.76              + "    var arr = eval(request.responseText);\n"
    1.77 +            + "    c[skip] = arr;\n"
    1.78              + "    return arr;\n"
    1.79              + "  }\n"
    1.80              + "  var prevvm = global.bck2brwsr;\n"
    1.81 @@ -68,6 +115,7 @@
    1.82              + "  global.bck2brwsr.registerExtension = prevvm.registerExtension;\n"
    1.83              + "})(this);\n"
    1.84          );
    1.85 +        LOG.log(Level.INFO, "Serving bck2brwsr.js", b2b);
    1.86      }
    1.87  
    1.88  }