# HG changeset patch # User Jaroslav Tulach # Date 1377500197 -7200 # Node ID cdaeea7becf2e052256042f07f8891c681aee931 # Parent a3eb8b0dfb81e8760f779965de5502b6facc4832 First updates to run with forthcoming version 0.5 - WebSockets in FX launcher and etc. diff -r a3eb8b0dfb81 -r cdaeea7becf2 ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java --- a/ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java Fri Jul 12 16:06:38 2013 +0200 +++ b/ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java Mon Aug 26 08:56:37 2013 +0200 @@ -21,8 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import net.java.html.BrwsrCtx; -import org.apidesign.html.context.spi.Contexts; import org.apidesign.html.json.spi.FunctionBinding; import org.apidesign.html.json.spi.JSONCall; import org.apidesign.html.json.spi.PropertyBinding; @@ -123,4 +121,9 @@ } return ConvertTypes.parse(sb.toString()); } + + @Override + public void runSafe(Runnable r) { + r.run(); + } } diff -r a3eb8b0dfb81 -r cdaeea7becf2 ko/fx/pom.xml --- a/ko/fx/pom.xml Fri Jul 12 16:06:38 2013 +0200 +++ b/ko/fx/pom.xml Mon Aug 26 08:56:37 2013 +0200 @@ -86,5 +86,35 @@ test jar + + org.apidesign.html + ko-ws-tyrus + ${net.java.html.version} + test + + + + jdk8 + + + ${java.home}/lib/ext/jfxrt.jar + + + + ${java.home}/lib/ext/jfxrt.jar + + + + jdk7 + + + ${java.home}/lib/jfxrt.jar + + + + ${java.home}/lib/jfxrt.jar + + + diff -r a3eb8b0dfb81 -r cdaeea7becf2 ko/fx/src/test/java/org/apidesign/bck2brwsr/kofx/KnockoutFXTest.java --- a/ko/fx/src/test/java/org/apidesign/bck2brwsr/kofx/KnockoutFXTest.java Fri Jul 12 16:06:38 2013 +0200 +++ b/ko/fx/src/test/java/org/apidesign/bck2brwsr/kofx/KnockoutFXTest.java Mon Aug 26 08:56:37 2013 +0200 @@ -31,9 +31,11 @@ import org.apidesign.html.context.spi.Contexts; import org.apidesign.html.json.spi.Technology; import org.apidesign.html.json.spi.Transfer; +import org.apidesign.html.json.spi.WSTransfer; import org.apidesign.html.json.tck.KOTest; import org.apidesign.html.json.tck.KnockoutTCK; import org.apidesign.html.kofx.FXContext; +import org.apidesign.html.wstyrus.TyrusContext; import org.json.JSONException; import org.json.JSONObject; import org.openide.util.lookup.ServiceProvider; @@ -58,10 +60,19 @@ @Override public BrwsrCtx createContext() { FXContext fx = new FXContext(); - return Contexts.newBuilder(). + TyrusContext tc = new TyrusContext(); + Contexts.Builder b = Contexts.newBuilder(). register(Technology.class, fx, 10). - register(Transfer.class, fx, 10). - build(); + register(Transfer.class, fx, 10); + try { + Class.forName("java.util.function.Function"); + // prefer WebView's WebSockets on JDK8 + b.register(WSTransfer.class, fx, 10); + } catch (ClassNotFoundException ex) { + // ok, JDK7 needs tyrus + b.register(WSTransfer.class, tc, 20); + } + return b.build(); } @Override diff -r a3eb8b0dfb81 -r cdaeea7becf2 launcher/fx/pom.xml --- a/launcher/fx/pom.xml Fri Jul 12 16:06:38 2013 +0200 +++ b/launcher/fx/pom.xml Mon Aug 26 08:56:37 2013 +0200 @@ -78,7 +78,23 @@ org.apidesign.html net.java.html.boot - 0.4-SNAPSHOT + ${net.java.html.version} + + + org.glassfish.grizzly + grizzly-websockets-server + ${grizzly.version} + jar + + + org.glassfish.grizzly + grizzly-http-servlet + ${grizzly.version} + + + javax.servlet + javax.servlet-api + 3.1.0 diff -r a3eb8b0dfb81 -r cdaeea7becf2 launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Fri Jul 12 16:06:38 2013 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Aug 26 08:56:37 2013 +0200 @@ -18,6 +18,7 @@ package org.apidesign.bck2brwsr.launcher; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.IOException; @@ -53,6 +54,11 @@ import org.glassfish.grizzly.http.server.ServerConfiguration; import org.glassfish.grizzly.http.util.HttpStatus; import org.glassfish.grizzly.threadpool.ThreadPoolConfig; +import org.glassfish.grizzly.websockets.WebSocket; +import org.glassfish.grizzly.websockets.WebSocketAddOn; +import org.glassfish.grizzly.websockets.WebSocketApplication; +import org.glassfish.grizzly.websockets.WebSocketEngine; +import org.openide.util.Exceptions; /** * Lightweight server to launch Bck2Brwsr applications and tests. @@ -151,7 +157,11 @@ private HttpServer initServer(String path, boolean addClasses) throws IOException { HttpServer s = HttpServer.createSimpleServer(path, new PortRange(8080, 65535)); - + final WebSocketAddOn addon = new WebSocketAddOn(); + for (NetworkListener listener : s.getListeners()) { + listener.registerAddOn(addon); + } + ThreadPoolConfig fewThreads = ThreadPoolConfig.defaultConfig().copy(). setPoolName("Fx/Bck2 Brwsr"). setCorePoolSize(1). @@ -202,6 +212,7 @@ } if ("/dynamic".equals(request.getRequestURI())) { + boolean webSocket = false; String mimeType = request.getParameter("mimeType"); List params = new ArrayList(); for (int i = 0; ; i++) { @@ -210,11 +221,20 @@ break; } params.add(p); - } + if ("protocol:ws".equals(p)) { + webSocket = true; + continue; + } } final String cnt = request.getParameter("content"); String mangle = cnt.replace("%20", " ").replace("%0A", "\n"); ByteArrayInputStream is = new ByteArrayInputStream(mangle.getBytes("UTF-8")); - URI url = registerResource(new Resource(is, mimeType, "/dynamic/res" + ++resourcesCount, params.toArray(new String[params.size()]))); + URI url; + final Resource res = new Resource(is, mimeType, "/dynamic/res" + ++resourcesCount, params.toArray(new String[params.size()])); + if (webSocket) { + url = registerWebSocket(res); + } else { + url = registerResource(res); + } response.getWriter().write(url.toString()); response.getWriter().write("\n"); return; @@ -256,13 +276,18 @@ } } } + + private URI registerWebSocket(Resource r) { + WebSocketEngine.getEngine().register("", r.httpPath, new WS(r)); + return pageURL("ws", server, r.httpPath); + } private URI registerResource(Resource r) { if (!ic.resources.contains(r)) { ic.resources.add(r); conf.addHttpHandler(this, r.httpPath); } - return pageURL(server, r.httpPath); + return pageURL("http", server, r.httpPath); } } @@ -411,7 +436,7 @@ private Object[] launchServerAndBrwsr(HttpServer server, final String page) throws IOException, URISyntaxException, InterruptedException { server.start(); - URI uri = pageURL(server, page); + URI uri = pageURL("http", server, page); return showBrwsr(uri); } private static String toUTF8(String value) throws UnsupportedEncodingException { @@ -523,11 +548,11 @@ abstract void generateBck2BrwsrJS(StringBuilder sb, Res loader) throws IOException; abstract String harnessResource(); - private static URI pageURL(HttpServer server, final String page) { + private static URI pageURL(String protocol, HttpServer server, final String page) { NetworkListener listener = server.getListeners().iterator().next(); int port = listener.getPort(); try { - return new URI("http://localhost:" + port + page); + return new URI(protocol + "://localhost:" + port + page); } catch (URISyntaxException ex) { throw new IllegalStateException(ex); } @@ -675,4 +700,25 @@ } } } -} + private static class WS extends WebSocketApplication { + + private final Resource r; + + private WS(Resource r) { + this.r = r; + } + + @Override + public void onMessage(WebSocket socket, String text) { + try { + r.httpContent.reset(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + copyStream(r.httpContent, out, null, text); + String s = new String(out.toByteArray(), "UTF-8"); + socket.send(s); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + }} diff -r a3eb8b0dfb81 -r cdaeea7becf2 launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java Fri Jul 12 16:06:38 2013 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java Mon Aug 26 08:56:37 2013 +0200 @@ -146,6 +146,7 @@ @Override public void run() { + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); try { if (c == null) { String data = arr[0]; diff -r a3eb8b0dfb81 -r cdaeea7becf2 pom.xml --- a/pom.xml Fri Jul 12 16:06:38 2013 +0200 +++ b/pom.xml Mon Aug 26 08:56:37 2013 +0200 @@ -15,7 +15,7 @@ UTF-8 RELEASE73 COPYING - 0.4-SNAPSHOT + 0.5-SNAPSHOT dew