Can execute classes and methods as specified by a parameter launcher
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 15 Dec 2012 22:46:26 +0100
branchlauncher
changeset 3317328b7ba2fa4
parent 330 ee4e8ba0a847
child 332 6949044415df
Can execute classes and methods as specified by a parameter
launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/console.xhtml
     1.1 --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Sat Dec 15 22:15:53 2012 +0100
     1.2 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Sat Dec 15 22:46:26 2012 +0100
     1.3 @@ -18,12 +18,14 @@
     1.4  package org.apidesign.bck2brwsr.launcher;
     1.5  
     1.6  import java.awt.Desktop;
     1.7 +import java.io.IOException;
     1.8  import java.io.InputStream;
     1.9  import java.io.OutputStream;
    1.10  import java.io.Writer;
    1.11  import java.net.URI;
    1.12  import java.net.URL;
    1.13  import java.util.Enumeration;
    1.14 +import static org.apidesign.bck2brwsr.launcher.Bck2BrwsrLauncher.copyStream;
    1.15  import org.apidesign.vm4brwsr.Bck2Brwsr;
    1.16  import org.glassfish.grizzly.PortRange;
    1.17  import org.glassfish.grizzly.http.server.HttpHandler;
    1.18 @@ -42,15 +44,31 @@
    1.19          final ClassLoader loader = Bck2BrwsrLauncher.class.getClassLoader();
    1.20          
    1.21          final ServerConfiguration conf = server.getServerConfiguration();
    1.22 -        conf.addHttpHandler(new Console(), "/console");
    1.23 +        conf.addHttpHandler(new Console("org.apidesign.bck2brwsr.launcher.Console", "welcome", "false"), "/console");
    1.24          conf.addHttpHandler(new VM(loader), "/bck2brwsr.js");
    1.25          conf.addHttpHandler(new Classes(loader), "/classes/");
    1.26 +        conf.addHttpHandler(new HttpHandler() {
    1.27 +            @Override
    1.28 +            public void service(Request request, Response response) throws Exception {
    1.29 +                String clazz = request.getParameter("class");
    1.30 +                String method = request.getParameter("method");
    1.31 +                if (clazz == null || method == null) {
    1.32 +                    response.setError();
    1.33 +                    response.setDetailMessage("Need two parameters: class and method name!");
    1.34 +                    return;
    1.35 +                }
    1.36 +                response.setContentType("text/html");
    1.37 +                OutputStream os = response.getOutputStream();
    1.38 +                InputStream is = Bck2BrwsrLauncher.class.getResourceAsStream("console.xhtml");
    1.39 +                copyStream(is, os, clazz, method, "true");
    1.40 +            }
    1.41 +        }, "/execute");
    1.42          
    1.43          server.start();
    1.44          NetworkListener listener = server.getListeners().iterator().next();
    1.45          int port = listener.getPort();
    1.46          
    1.47 -        URI uri = new URI("http://localhost:" + port + "/console");
    1.48 +        URI uri = new URI("http://localhost:" + port + "/execute?class=org.apidesign.bck2brwsr.launcher.Console&method=welcome");
    1.49          try {
    1.50              Desktop.getDesktop().browse(uri);
    1.51          } catch (UnsupportedOperationException ex) {
    1.52 @@ -62,9 +80,29 @@
    1.53          
    1.54          System.in.read();
    1.55      }
    1.56 +    
    1.57 +    static void copyStream(InputStream is, OutputStream os, String... params) throws IOException {
    1.58 +        for (;;) {
    1.59 +            int ch = is.read();
    1.60 +            if (ch == -1) {
    1.61 +                break;
    1.62 +            }
    1.63 +            if (ch == '$') {
    1.64 +                int cnt = is.read() - '0';
    1.65 +                if (cnt < params.length) {
    1.66 +                    os.write(params[cnt].getBytes());
    1.67 +                }
    1.68 +            } else {
    1.69 +                os.write(ch);
    1.70 +            }
    1.71 +        }
    1.72 +    }
    1.73  
    1.74      private static class Console extends HttpHandler {
    1.75 -        public Console() {
    1.76 +        private final String[] args;
    1.77 +        
    1.78 +        public Console(String... args) {
    1.79 +            this.args = args;
    1.80          }
    1.81  
    1.82          @Override
    1.83 @@ -72,13 +110,7 @@
    1.84              response.setContentType("text/html");
    1.85              OutputStream os = response.getOutputStream();
    1.86              InputStream is = Bck2BrwsrLauncher.class.getResourceAsStream("console.xhtml");
    1.87 -            for (;;) {
    1.88 -                int ch = is.read();
    1.89 -                if (ch == -1) {
    1.90 -                    break;
    1.91 -                }
    1.92 -                os.write(ch);
    1.93 -            }
    1.94 +            copyStream(is, os, args);
    1.95          }
    1.96      }
    1.97  
     2.1 --- a/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/console.xhtml	Sat Dec 15 22:15:53 2012 +0100
     2.2 +++ b/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/console.xhtml	Sat Dec 15 22:46:26 2012 +0100
     2.3 @@ -38,17 +38,23 @@
     2.4          <h1>Bck2Browser Console Launcher</h1>
     2.5          
     2.6          Class Name:
     2.7 -        <input id="clazz" value="org.apidesign.bck2brwsr.launcher.Console"/>
     2.8 +        <input id="clazz" value="$0"/>
     2.9          <br/>
    2.10          Method Name:
    2.11  
    2.12 -        <input id="method" value="welcome"/>
    2.13 +        <input id="method" value="$1"/>
    2.14          <br/>
    2.15          
    2.16          <button onclick="vm.loadClass('org.apidesign.bck2brwsr.launcher.Console').execute__V();">Execute!</button>
    2.17          
    2.18          <hr/>
    2.19 -        <textarea id="result" rows="10" cols="80">
    2.20 +        <textarea id="result" rows="10" cols="80" disabled="">
    2.21          </textarea>
    2.22 +        
    2.23 +        <script type="text/javascript">
    2.24 +            if ($2) {
    2.25 +                vm.loadClass('org.apidesign.bck2brwsr.launcher.Console').execute__V();
    2.26 +            }
    2.27 +        </script>
    2.28      </body>
    2.29  </html>