# HG changeset patch # User Jaroslav Tulach # Date 1356444519 -3600 # Node ID 57fc3a0563c99b31005b87de94889457aa156f2a # Parent 70d15cf323baf0d29cef1cb72dc4c06f0016dd1d Hidding the launchers behind common fasade diff -r 70d15cf323ba -r 57fc3a0563c9 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Tue Dec 25 14:07:02 2012 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Tue Dec 25 15:08:39 2012 +0100 @@ -17,6 +17,7 @@ */ package org.apidesign.bck2brwsr.launcher; +import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -52,18 +53,23 @@ * Supports execution in native browser as well as Java's internal * execution engine. */ -public class Bck2BrwsrLauncher { +final class Bck2BrwsrLauncher extends Launcher implements Closeable { private static final Logger LOG = Logger.getLogger(Bck2BrwsrLauncher.class.getName()); private static final MethodInvocation END = new MethodInvocation(null, null); private Set loaders = new LinkedHashSet<>(); private BlockingQueue methods = new LinkedBlockingQueue<>(); private long timeOut; private final Res resources = new Res(); + private final String cmd; private Object[] brwsr; private HttpServer server; private CountDownLatch wait; + + public Bck2BrwsrLauncher(String cmd) { + this.cmd = cmd; + } - + @Override public MethodInvocation addMethod(Class clazz, String method) throws IOException { loaders.add(clazz.getClassLoader()); MethodInvocation c = new MethodInvocation(clazz.getName(), method); @@ -83,23 +89,21 @@ public void addClassLoader(ClassLoader url) { this.loaders.add(url); } - - public static void main( String[] args ) throws Exception { - Bck2BrwsrLauncher l = new Bck2BrwsrLauncher(); - l.addClassLoader(Bck2BrwsrLauncher.class.getClassLoader()); - l.showURL("org/apidesign/bck2brwsr/launcher/console.xhtml"); - System.in.read(); - } - public void showURL(String startpage) throws URISyntaxException, InterruptedException, IOException { + public void showURL(String startpage) throws IOException { if (!startpage.startsWith("/")) { startpage = "/" + startpage; } HttpServer s = initServer(); s.getServerConfiguration().addHttpHandler(new Page(resources, null), "/"); - launchServerAndBrwsr(s, startpage); + try { + launchServerAndBrwsr(s, startpage); + } catch (URISyntaxException | InterruptedException ex) { + throw new IOException(ex); + } } + @Override public void initialize() throws IOException { try { executeInBrowser(); @@ -178,12 +182,17 @@ this.brwsr = launchServerAndBrwsr(server, "/execute"); } - public void shutdown() throws InterruptedException, IOException { + @Override + public void shutdown() throws IOException { methods.offer(END); for (;;) { int prev = methods.size(); - if (wait.await(timeOut, TimeUnit.MILLISECONDS)) { - break; + try { + if (wait.await(timeOut, TimeUnit.MILLISECONDS)) { + break; + } + } catch (InterruptedException ex) { + throw new IOException(ex); } if (prev == methods.size()) { LOG.log( @@ -244,11 +253,12 @@ // return new Object[] { process, dir }; } { - String[] cmd = { - "xdg-open", uri.toString() + String cmdName = cmd == null ? "xdg-open" : cmd; + String[] cmdArr = { + cmdName, uri.toString() }; - LOG.log(Level.INFO, "Launching {0}", Arrays.toString(cmd)); - final Process process = Runtime.getRuntime().exec(cmd); + LOG.log(Level.INFO, "Launching {0}", Arrays.toString(cmdArr)); + final Process process = Runtime.getRuntime().exec(cmdArr); return new Object[] { process, null }; } } @@ -264,7 +274,7 @@ } } - private void stopServerAndBrwsr(HttpServer server, Object[] brwsr) throws IOException, InterruptedException { + private void stopServerAndBrwsr(HttpServer server, Object[] brwsr) throws IOException { Process process = (Process)brwsr[0]; server.stop(); @@ -273,7 +283,12 @@ drain("StdOut", stdout); drain("StdErr", stderr); process.destroy(); - int res = process.waitFor(); + int res; + try { + res = process.waitFor(); + } catch (InterruptedException ex) { + throw new IOException(ex); + } LOG.log(Level.INFO, "Exit code: {0}", res); deleteTree((File)brwsr[1]); @@ -305,6 +320,11 @@ file.delete(); } + @Override + public void close() throws IOException { + shutdown(); + } + private class Res implements Bck2Brwsr.Resources { @Override public InputStream get(String resource) throws IOException { diff -r 70d15cf323ba -r 57fc3a0563c9 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Tue Dec 25 14:07:02 2012 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Tue Dec 25 15:08:39 2012 +0100 @@ -33,7 +33,7 @@ /** * Tests execution in Java's internal scripting engine. */ -public final class JSLauncher { +final class JSLauncher extends Launcher { private static final Logger LOG = Logger.getLogger(JSLauncher.class.getName()); private Set loaders = new LinkedHashSet<>(); private final Res resources = new Res(); @@ -41,6 +41,7 @@ private Object console; + @Override public MethodInvocation addMethod(Class clazz, String method) { loaders.add(clazz.getClassLoader()); MethodInvocation mi = new MethodInvocation(clazz.getName(), method); @@ -59,6 +60,7 @@ this.loaders.add(url); } + @Override public void initialize() throws IOException { try { initRhino(); @@ -94,6 +96,10 @@ Object vm = code.invokeFunction("initVM"); console = code.invokeMethod(vm, "loadClass", Console.class.getName()); } + + @Override + public void shutdown() throws IOException { + } private class Res implements Bck2Brwsr.Resources { @Override diff -r 70d15cf323ba -r 57fc3a0563c9 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java Tue Dec 25 15:08:39 2012 +0100 @@ -0,0 +1,63 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.launcher; + +import java.io.Closeable; +import java.io.IOException; +import java.net.URLClassLoader; +import org.apidesign.vm4brwsr.Bck2Brwsr; + +/** An abstraction for executing tests in a Bck2Brwsr virtual machine. + * Either in JavaScript engine, or in external browser. + * + * @author Jaroslav Tulach + */ +public abstract class Launcher { + + Launcher() { + } + + abstract MethodInvocation addMethod(Class clazz, String method) throws IOException; + + public abstract void initialize() throws IOException; + public abstract void shutdown() throws IOException; + public MethodInvocation invokeMethod(Class clazz, String method) throws IOException { + return addMethod(clazz, method); + } + + + + public static Launcher createJavaScript() { + final JSLauncher l = new JSLauncher(); + l.addClassLoader(Bck2Brwsr.class.getClassLoader()); + return l; + } + + public static Launcher createBrowser(String cmd) { + final Bck2BrwsrLauncher l = new Bck2BrwsrLauncher(cmd); + l.addClassLoader(Bck2Brwsr.class.getClassLoader()); + l.setTimeout(180000); + return l; + } + public static Closeable showURL(URLClassLoader classes, String startpage) throws IOException { + Bck2BrwsrLauncher l = new Bck2BrwsrLauncher(null); + l.addClassLoader(classes); + l.showURL(startpage); + return l; + } +} diff -r 70d15cf323ba -r 57fc3a0563c9 mojo/src/main/java/org/apidesign/bck2brwsr/mojo/BrswrMojo.java --- a/mojo/src/main/java/org/apidesign/bck2brwsr/mojo/BrswrMojo.java Tue Dec 25 14:07:02 2012 +0100 +++ b/mojo/src/main/java/org/apidesign/bck2brwsr/mojo/BrswrMojo.java Tue Dec 25 15:08:39 2012 +0100 @@ -17,26 +17,24 @@ */ package org.apidesign.bck2brwsr.mojo; +import java.io.Closeable; import org.apache.maven.plugin.AbstractMojo; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; -import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; -import org.apidesign.bck2brwsr.launcher.Bck2BrwsrLauncher; +import org.apidesign.bck2brwsr.launcher.Launcher; /** Executes given HTML page in a browser. */ @Mojo(name="brwsr", defaultPhase=LifecyclePhase.DEPLOY) @@ -63,15 +61,14 @@ try { URLClassLoader url = buildClassLoader(classes, prj.getDependencyArtifacts()); - Bck2BrwsrLauncher httpServer = new Bck2BrwsrLauncher(); - httpServer.addClassLoader(url); + Closeable httpServer; try { - httpServer.showURL(startpage); + httpServer = Launcher.showURL(url, startpage); } catch (Exception ex) { throw new MojoExecutionException("Can't open " + startpage, ex); } - System.in.read(); + httpServer.close(); } catch (IOException ex) { throw new MojoExecutionException("Can't show the browser", ex); } diff -r 70d15cf323ba -r 57fc3a0563c9 vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Bck2BrwsrCase.java --- a/vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Bck2BrwsrCase.java Tue Dec 25 14:07:02 2012 +0100 +++ b/vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Bck2BrwsrCase.java Tue Dec 25 15:08:39 2012 +0100 @@ -48,10 +48,10 @@ @Test(groups = "run") public void executeCode() throws Throwable { if (type == 1) { - MethodInvocation c = l.addMethod(m.getDeclaringClass(), m.getName(), false); + MethodInvocation c = l.invokeMethod(m.getDeclaringClass(), m.getName(), false); value = c.toString(); } else if (type == 2) { - MethodInvocation c = l.addMethod(m.getDeclaringClass(), m.getName(), true); + MethodInvocation c = l.invokeMethod(m.getDeclaringClass(), m.getName(), true); value = c.toString(); } else { value = m.invoke(m.getDeclaringClass().newInstance()); diff -r 70d15cf323ba -r 57fc3a0563c9 vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Launchers.java --- a/vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Launchers.java Tue Dec 25 14:07:02 2012 +0100 +++ b/vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/Launchers.java Tue Dec 25 15:08:39 2012 +0100 @@ -18,10 +18,8 @@ package org.apidesign.bck2brwsr.vmtest.impl; import java.io.IOException; -import org.apidesign.bck2brwsr.launcher.Bck2BrwsrLauncher; -import org.apidesign.bck2brwsr.launcher.JSLauncher; +import org.apidesign.bck2brwsr.launcher.Launcher; import org.apidesign.bck2brwsr.launcher.MethodInvocation; -import org.apidesign.vm4brwsr.Bck2Brwsr; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; @@ -32,34 +30,32 @@ public final class Launchers { public static final Launchers INSTANCE = new Launchers(); - private JSLauncher jsl; - private Bck2BrwsrLauncher brwsr; + private Launcher jsl; + private Launcher brwsr; private Launchers() { } @BeforeGroups("run") public void initializeLauncher() throws IOException { - jsl = new JSLauncher(); - jsl.addClassLoader(Bck2Brwsr.class.getClassLoader()); + jsl = Launcher.createJavaScript(); jsl.initialize(); - Bck2BrwsrLauncher l = new Bck2BrwsrLauncher(); - l.addClassLoader(Bck2Brwsr.class.getClassLoader()); + Launcher l = Launcher.createBrowser("xdg-open"); l.initialize(); - l.setTimeout(180000); brwsr = l; } @AfterGroups("run") public void shutDownLauncher() throws IOException, InterruptedException { + jsl.shutdown(); brwsr.shutdown(); } - public MethodInvocation addMethod(Class clazz, String name, boolean inBrwsr) throws IOException { + public MethodInvocation invokeMethod(Class clazz, String name, boolean inBrwsr) throws IOException { if (!inBrwsr) { - return jsl.addMethod(clazz, name); + return jsl.invokeMethod(clazz, name); } else { - return brwsr.addMethod(clazz, name); + return brwsr.invokeMethod(clazz, name); } } }