diff -r 789849cabcc7 -r cff680298793 launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 05:15:11 2016 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 07:32:35 2016 +0200 @@ -87,6 +87,7 @@ private HttpServer server; private CountDownLatch wait; private Thread flushing; + private String rootPage; public BaseHTTPLauncher(String cmd) { this.cmd = cmd; @@ -118,6 +119,12 @@ return loaders.toArray(new ClassLoader[loaders.size()]); } + @Override + void rootPage(String startpage) { + this.rootPage = startpage; + } + + @Override public void showURL(String startpage) throws IOException { if (!startpage.startsWith("/")) { startpage = "/" + startpage; @@ -201,6 +208,12 @@ if (addClasses) { conf.addHttpHandler(new Classes(resources), "/classes/"); } + if (rootPage != null) { + int last = rootPage.lastIndexOf('/'); + String prefix = rootPage.substring(0, last); + String page = rootPage.substring(last); + s.getServerConfiguration().addHttpHandler(new SubTree("/pages" + page, resources, prefix), "/pages/"); + } final WebSocketAddOn addon = new WebSocketAddOn(); for (NetworkListener listener : s.getListeners()) { listener.registerAddOn(addon); @@ -423,7 +436,13 @@ } }, "/data"); - this.brwsr = launchServerAndBrwsr(server, "/execute"); + String page = "/execute"; + if (rootPage != null) { + int last = rootPage.lastIndexOf('/'); + page = "/pages" + rootPage.substring(last); + } + + this.brwsr = launchServerAndBrwsr(server, page); } private static String encodeJSON(String in) { @@ -781,8 +800,14 @@ final String resource; private final String[] args; private final Res res; + private final String ensureBck2Brwsr; public Page(Res res, String resource, String... args) { + this(null, res, resource, args); + } + + Page(String ensureBck2Brwsr, Res res, String resource, String... args) { + this.ensureBck2Brwsr = ensureBck2Brwsr; this.res = res; this.resource = resource; this.args = args.length == 0 ? new String[] { "$0" } : args; @@ -805,10 +830,26 @@ LOG.info("Content type application/xhtml+xml"); replace = args; } - OutputStream os = response.getOutputStream(); try { InputStream is = res.get(r, 0).openStream(); - copyStream(is, os, request.getRequestURL().toString(), replace); + if (ensureBck2Brwsr != null && ensureBck2Brwsr.equals(request.getRequestURI())) { + ByteArrayOutputStream tmp = new ByteArrayOutputStream(); + copyStream(is, tmp, request.getRequestURL().toString(), replace); + String pageText = tmp.toString("UTF-8"); + if (!pageText.contains("bck2brwsr.js")) { + int last = pageText.toLowerCase().indexOf(""); + if (last == -1) { + last = pageText.length(); + } + pageText = pageText.substring(0, last) + + "\n\n\n" + + pageText.substring(last); + } + response.getWriter().write(pageText); + } else { + OutputStream os = response.getOutputStream(); + copyStream(is, os, request.getRequestURL().toString(), replace); + } } catch (IOException ex) { response.setDetailMessage(ex.getLocalizedMessage()); response.setError(); @@ -830,6 +871,9 @@ public SubTree(Res res, String resource, String... args) { super(res, resource, args); } + public SubTree(String ensureBck2Brwsr, Res res, String resource, String... args) { + super(ensureBck2Brwsr, res, resource, args); + } @Override protected String computePage(Request request) {