launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 15 Dec 2012 22:15:53 +0100
branchlauncher
changeset 330 ee4e8ba0a847
parent 323 d41cfd77842d
child 331 7328b7ba2fa4
permissions -rw-r--r--
Refactoring anonymous handlers to named inner classes
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.launcher;
    19 
    20 import java.awt.Desktop;
    21 import java.io.InputStream;
    22 import java.io.OutputStream;
    23 import java.io.Writer;
    24 import java.net.URI;
    25 import java.net.URL;
    26 import java.util.Enumeration;
    27 import org.apidesign.vm4brwsr.Bck2Brwsr;
    28 import org.glassfish.grizzly.PortRange;
    29 import org.glassfish.grizzly.http.server.HttpHandler;
    30 import org.glassfish.grizzly.http.server.HttpServer;
    31 import org.glassfish.grizzly.http.server.NetworkListener;
    32 import org.glassfish.grizzly.http.server.Request;
    33 import org.glassfish.grizzly.http.server.Response;
    34 import org.glassfish.grizzly.http.server.ServerConfiguration;
    35 
    36 /**
    37  * Lightweight server to launch Bck2Brwsr applications in real browser.
    38  */
    39 public class Bck2BrwsrLauncher {
    40     public static void main( String[] args ) throws Exception {
    41         HttpServer server = HttpServer.createSimpleServer(".", new PortRange(8080, 65535));
    42         final ClassLoader loader = Bck2BrwsrLauncher.class.getClassLoader();
    43         
    44         final ServerConfiguration conf = server.getServerConfiguration();
    45         conf.addHttpHandler(new Console(), "/console");
    46         conf.addHttpHandler(new VM(loader), "/bck2brwsr.js");
    47         conf.addHttpHandler(new Classes(loader), "/classes/");
    48         
    49         server.start();
    50         NetworkListener listener = server.getListeners().iterator().next();
    51         int port = listener.getPort();
    52         
    53         URI uri = new URI("http://localhost:" + port + "/console");
    54         try {
    55             Desktop.getDesktop().browse(uri);
    56         } catch (UnsupportedOperationException ex) {
    57             String[] cmd = { 
    58                 "xdg-open", uri.toString()
    59             };
    60             Runtime.getRuntime().exec(cmd).waitFor();
    61         }
    62         
    63         System.in.read();
    64     }
    65 
    66     private static class Console extends HttpHandler {
    67         public Console() {
    68         }
    69 
    70         @Override
    71         public void service(Request request, Response response) throws Exception {
    72             response.setContentType("text/html");
    73             OutputStream os = response.getOutputStream();
    74             InputStream is = Bck2BrwsrLauncher.class.getResourceAsStream("console.xhtml");
    75             for (;;) {
    76                 int ch = is.read();
    77                 if (ch == -1) {
    78                     break;
    79                 }
    80                 os.write(ch);
    81             }
    82         }
    83     }
    84 
    85     private static class VM extends HttpHandler {
    86         private final ClassLoader loader;
    87 
    88         public VM(ClassLoader loader) {
    89             this.loader = loader;
    90         }
    91 
    92         @Override
    93         public void service(Request request, Response response) throws Exception {
    94             response.setCharacterEncoding("UTF-8");
    95             response.setContentType("text/javascript");
    96             Bck2Brwsr.generate(response.getWriter(), loader);
    97         }
    98     }
    99 
   100     private static class Classes extends HttpHandler {
   101         private final ClassLoader loader;
   102 
   103         public Classes(ClassLoader loader) {
   104             this.loader = loader;
   105         }
   106 
   107         @Override
   108         public void service(Request request, Response response) throws Exception {
   109             String res = request.getHttpHandlerPath();
   110             if (res.startsWith("/")) {
   111                 res = res.substring(1);
   112             }
   113             Enumeration<URL> en = loader.getResources(res);
   114             URL u = null;
   115             while (en.hasMoreElements()) {
   116                 u = en.nextElement();
   117             }
   118             if (u == null) {
   119                 response.setError();
   120                 response.setDetailMessage("Can't find resource " + res);
   121             }
   122             response.setContentType("text/javascript");
   123             InputStream is = u.openStream();
   124             Writer w = response.getWriter();
   125             w.append("[");
   126             for (int i = 0;; i++) {
   127                 int b = is.read();
   128                 if (b == -1) {
   129                     break;
   130                 }
   131                 if (i > 0) {
   132                     w.append(", ");
   133                 }
   134                 if (i % 20 == 0) {
   135                     w.write("\n");
   136                 }
   137                 if (b > 127) {
   138                     b = b - 256;
   139                 }
   140                 w.append(Integer.toString(b));
   141             }
   142             w.append("\n]");
   143         }
   144     }
   145 }