1.1 --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 05:15:11 2016 +0200
1.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 07:32:35 2016 +0200
1.3 @@ -87,6 +87,7 @@
1.4 private HttpServer server;
1.5 private CountDownLatch wait;
1.6 private Thread flushing;
1.7 + private String rootPage;
1.8
1.9 public BaseHTTPLauncher(String cmd) {
1.10 this.cmd = cmd;
1.11 @@ -118,6 +119,12 @@
1.12 return loaders.toArray(new ClassLoader[loaders.size()]);
1.13 }
1.14
1.15 + @Override
1.16 + void rootPage(String startpage) {
1.17 + this.rootPage = startpage;
1.18 + }
1.19 +
1.20 + @Override
1.21 public void showURL(String startpage) throws IOException {
1.22 if (!startpage.startsWith("/")) {
1.23 startpage = "/" + startpage;
1.24 @@ -201,6 +208,12 @@
1.25 if (addClasses) {
1.26 conf.addHttpHandler(new Classes(resources), "/classes/");
1.27 }
1.28 + if (rootPage != null) {
1.29 + int last = rootPage.lastIndexOf('/');
1.30 + String prefix = rootPage.substring(0, last);
1.31 + String page = rootPage.substring(last);
1.32 + s.getServerConfiguration().addHttpHandler(new SubTree("/pages" + page, resources, prefix), "/pages/");
1.33 + }
1.34 final WebSocketAddOn addon = new WebSocketAddOn();
1.35 for (NetworkListener listener : s.getListeners()) {
1.36 listener.registerAddOn(addon);
1.37 @@ -423,7 +436,13 @@
1.38 }
1.39 }, "/data");
1.40
1.41 - this.brwsr = launchServerAndBrwsr(server, "/execute");
1.42 + String page = "/execute";
1.43 + if (rootPage != null) {
1.44 + int last = rootPage.lastIndexOf('/');
1.45 + page = "/pages" + rootPage.substring(last);
1.46 + }
1.47 +
1.48 + this.brwsr = launchServerAndBrwsr(server, page);
1.49 }
1.50
1.51 private static String encodeJSON(String in) {
1.52 @@ -781,8 +800,14 @@
1.53 final String resource;
1.54 private final String[] args;
1.55 private final Res res;
1.56 + private final String ensureBck2Brwsr;
1.57
1.58 public Page(Res res, String resource, String... args) {
1.59 + this(null, res, resource, args);
1.60 + }
1.61 +
1.62 + Page(String ensureBck2Brwsr, Res res, String resource, String... args) {
1.63 + this.ensureBck2Brwsr = ensureBck2Brwsr;
1.64 this.res = res;
1.65 this.resource = resource;
1.66 this.args = args.length == 0 ? new String[] { "$0" } : args;
1.67 @@ -805,10 +830,26 @@
1.68 LOG.info("Content type application/xhtml+xml");
1.69 replace = args;
1.70 }
1.71 - OutputStream os = response.getOutputStream();
1.72 try {
1.73 InputStream is = res.get(r, 0).openStream();
1.74 - copyStream(is, os, request.getRequestURL().toString(), replace);
1.75 + if (ensureBck2Brwsr != null && ensureBck2Brwsr.equals(request.getRequestURI())) {
1.76 + ByteArrayOutputStream tmp = new ByteArrayOutputStream();
1.77 + copyStream(is, tmp, request.getRequestURL().toString(), replace);
1.78 + String pageText = tmp.toString("UTF-8");
1.79 + if (!pageText.contains("bck2brwsr.js")) {
1.80 + int last = pageText.toLowerCase().indexOf("</body>");
1.81 + if (last == -1) {
1.82 + last = pageText.length();
1.83 + }
1.84 + pageText = pageText.substring(0, last) +
1.85 + "\n<script src='/bck2brwsr.js'></script>\n\n" +
1.86 + pageText.substring(last);
1.87 + }
1.88 + response.getWriter().write(pageText);
1.89 + } else {
1.90 + OutputStream os = response.getOutputStream();
1.91 + copyStream(is, os, request.getRequestURL().toString(), replace);
1.92 + }
1.93 } catch (IOException ex) {
1.94 response.setDetailMessage(ex.getLocalizedMessage());
1.95 response.setError();
1.96 @@ -830,6 +871,9 @@
1.97 public SubTree(Res res, String resource, String... args) {
1.98 super(res, resource, args);
1.99 }
1.100 + public SubTree(String ensureBck2Brwsr, Res res, String resource, String... args) {
1.101 + super(ensureBck2Brwsr, res, resource, args);
1.102 + }
1.103
1.104 @Override
1.105 protected String computePage(Request request) {