launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 20 Oct 2013 20:36:03 +0200
changeset 1375 a6c71e376889
parent 1371 fd2d4ca28bd3
child 1389 6a41a849ea6b
permissions -rw-r--r--
Can load multiple resources of the same name even in testing and development mode
jaroslav@1033
     1
/**
jaroslav@1033
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1033
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1033
     4
 *
jaroslav@1033
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1033
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1033
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1033
     8
 *
jaroslav@1033
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1033
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1033
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1033
    12
 * GNU General Public License for more details.
jaroslav@1033
    13
 *
jaroslav@1033
    14
 * You should have received a copy of the GNU General Public License
jaroslav@1033
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1033
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@1033
    17
 */
jaroslav@1033
    18
package org.apidesign.bck2brwsr.launcher;
jaroslav@1033
    19
jaroslav@1371
    20
import java.io.File;
jaroslav@1371
    21
import java.io.FileReader;
jaroslav@1033
    22
import java.io.IOException;
jaroslav@1033
    23
import java.io.InputStream;
jaroslav@1371
    24
import java.io.InputStreamReader;
jaroslav@1371
    25
import java.io.Reader;
jaroslav@1371
    26
import java.net.URL;
jaroslav@1371
    27
import java.util.logging.Level;
jaroslav@1033
    28
import org.apidesign.vm4brwsr.Bck2Brwsr;
jaroslav@1033
    29
jaroslav@1033
    30
/**
jaroslav@1033
    31
 * Lightweight server to launch Bck2Brwsr applications and tests.
jaroslav@1033
    32
 * Supports execution in native browser as well as Java's internal 
jaroslav@1033
    33
 * execution engine.
jaroslav@1033
    34
 */
jaroslav@1088
    35
final class Bck2BrwsrLauncher extends BaseHTTPLauncher {
jaroslav@1033
    36
    
jaroslav@1033
    37
    public Bck2BrwsrLauncher(String cmd) {
jaroslav@1088
    38
        super(cmd);
jaroslav@1033
    39
    }
jaroslav@1033
    40
    
jaroslav@1033
    41
    @Override
jaroslav@1088
    42
    String harnessResource() {
jaroslav@1088
    43
        return "org/apidesign/bck2brwsr/launcher/harness.xhtml";
jaroslav@1033
    44
    }
jaroslav@1033
    45
    
jaroslav@1033
    46
    @Override
jaroslav@1088
    47
    void generateBck2BrwsrJS(StringBuilder sb, final Res loader) throws IOException {
jaroslav@1088
    48
        class R implements Bck2Brwsr.Resources {
jaroslav@1088
    49
            @Override
jaroslav@1088
    50
            public InputStream get(String resource) throws IOException {
jaroslav@1375
    51
                return loader.get(resource, 0);
jaroslav@1033
    52
            }
jaroslav@1033
    53
        }
jaroslav@1371
    54
        String b2b = System.getProperty("bck2brwsr.js");
jaroslav@1371
    55
        if (b2b != null) {
jaroslav@1371
    56
            LOG.log(Level.INFO, "Serving bck2brwsr.js from {0}", b2b);
jaroslav@1371
    57
            try (Reader r = new InputStreamReader(new URL(b2b).openStream())) {
jaroslav@1371
    58
                char[] arr = new char[4096];
jaroslav@1371
    59
                for (;;) {
jaroslav@1371
    60
                   int len = r.read(arr);
jaroslav@1371
    61
                   if (len == -1) {
jaroslav@1371
    62
                       break;
jaroslav@1371
    63
                   }
jaroslav@1371
    64
                   sb.append(arr, 0, len);
jaroslav@1371
    65
                }
jaroslav@1371
    66
            }
jaroslav@1371
    67
        } else {
jaroslav@1371
    68
            LOG.log(Level.INFO, "Generating bck2brwsr.js from scratch", b2b);
jaroslav@1371
    69
            Bck2Brwsr.generate(sb, new R());
jaroslav@1371
    70
        }
jaroslav@1088
    71
        sb.append(
jaroslav@1088
    72
              "(function WrapperVM(global) {"
jaroslav@1375
    73
            + "  function ldCls(res, skip) {\n"
jaroslav@1088
    74
            + "    var request = new XMLHttpRequest();\n"
jaroslav@1375
    75
            + "    request.open('GET', '/classes/' + res + '?skip=' + skip, false);\n"
jaroslav@1088
    76
            + "    request.send();\n"
jtulach@1336
    77
            + "    if (request.status !== 200) return null;\n"
jaroslav@1088
    78
            + "    var arr = eval('(' + request.responseText + ')');\n"
jaroslav@1088
    79
            + "    return arr;\n"
jaroslav@1088
    80
            + "  }\n"
jaroslav@1088
    81
            + "  var prevvm = global.bck2brwsr;\n"
jaroslav@1088
    82
            + "  global.bck2brwsr = function() {\n"
jaroslav@1088
    83
            + "    var args = Array.prototype.slice.apply(arguments);\n"
jaroslav@1088
    84
            + "    args.unshift(ldCls);\n"
jaroslav@1088
    85
            + "    return prevvm.apply(null, args);\n"
jaroslav@1088
    86
            + "  };\n"
jaroslav@1088
    87
            + "})(this);\n"
jaroslav@1088
    88
        );
jaroslav@1371
    89
        LOG.log(Level.INFO, "Serving bck2brwsr.js", b2b);
jaroslav@1033
    90
    }
jaroslav@1033
    91
jaroslav@1033
    92
}