2 * Back 2 Browser Bytecode Translator
3 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
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.
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.
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.
18 package org.apidesign.bck2brwsr.launcher;
20 import java.awt.Desktop;
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.io.Writer;
27 import java.util.Enumeration;
28 import static org.apidesign.bck2brwsr.launcher.Bck2BrwsrLauncher.copyStream;
29 import org.apidesign.vm4brwsr.Bck2Brwsr;
30 import org.glassfish.grizzly.PortRange;
31 import org.glassfish.grizzly.http.server.HttpHandler;
32 import org.glassfish.grizzly.http.server.HttpServer;
33 import org.glassfish.grizzly.http.server.NetworkListener;
34 import org.glassfish.grizzly.http.server.Request;
35 import org.glassfish.grizzly.http.server.Response;
36 import org.glassfish.grizzly.http.server.ServerConfiguration;
39 * Lightweight server to launch Bck2Brwsr applications in real browser.
41 public class Bck2BrwsrLauncher {
42 public static void main( String[] args ) throws Exception {
43 HttpServer server = HttpServer.createSimpleServer(".", new PortRange(8080, 65535));
44 final ClassLoader loader = Bck2BrwsrLauncher.class.getClassLoader();
46 final ServerConfiguration conf = server.getServerConfiguration();
47 conf.addHttpHandler(new Console("org.apidesign.bck2brwsr.launcher.Console", "welcome", "false"), "/console");
48 conf.addHttpHandler(new VM(loader), "/bck2brwsr.js");
49 conf.addHttpHandler(new Classes(loader), "/classes/");
50 conf.addHttpHandler(new HttpHandler() {
52 public void service(Request request, Response response) throws Exception {
53 String clazz = request.getParameter("class");
54 String method = request.getParameter("method");
55 if (clazz == null || method == null) {
57 response.setDetailMessage("Need two parameters: class and method name!");
60 response.setContentType("text/html");
61 OutputStream os = response.getOutputStream();
62 InputStream is = Bck2BrwsrLauncher.class.getResourceAsStream("console.xhtml");
63 copyStream(is, os, clazz, method, "true");
68 NetworkListener listener = server.getListeners().iterator().next();
69 int port = listener.getPort();
71 URI uri = new URI("http://localhost:" + port + "/execute?class=org.apidesign.bck2brwsr.launcher.Console&method=welcome");
73 Desktop.getDesktop().browse(uri);
74 } catch (UnsupportedOperationException ex) {
76 "xdg-open", uri.toString()
78 Runtime.getRuntime().exec(cmd).waitFor();
84 static void copyStream(InputStream is, OutputStream os, String... params) throws IOException {
91 int cnt = is.read() - '0';
92 if (cnt < params.length) {
93 os.write(params[cnt].getBytes());
101 private static class Console extends HttpHandler {
102 private final String[] args;
104 public Console(String... args) {
109 public void service(Request request, Response response) throws Exception {
110 response.setContentType("text/html");
111 OutputStream os = response.getOutputStream();
112 InputStream is = Bck2BrwsrLauncher.class.getResourceAsStream("console.xhtml");
113 copyStream(is, os, args);
117 private static class VM extends HttpHandler {
118 private final ClassLoader loader;
120 public VM(ClassLoader loader) {
121 this.loader = loader;
125 public void service(Request request, Response response) throws Exception {
126 response.setCharacterEncoding("UTF-8");
127 response.setContentType("text/javascript");
128 Bck2Brwsr.generate(response.getWriter(), loader);
132 private static class Classes extends HttpHandler {
133 private final ClassLoader loader;
135 public Classes(ClassLoader loader) {
136 this.loader = loader;
140 public void service(Request request, Response response) throws Exception {
141 String res = request.getHttpHandlerPath();
142 if (res.startsWith("/")) {
143 res = res.substring(1);
145 Enumeration<URL> en = loader.getResources(res);
147 while (en.hasMoreElements()) {
148 u = en.nextElement();
152 response.setDetailMessage("Can't find resource " + res);
154 response.setContentType("text/javascript");
155 InputStream is = u.openStream();
156 Writer w = response.getWriter();
158 for (int i = 0;; i++) {
172 w.append(Integer.toString(b));