launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java
changeset 1927 cff680298793
parent 1926 789849cabcc7
child 1939 401a4f03875b
     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) {