launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
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 }