launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java
changeset 526 a0d8b5ab79a2
parent 523 48f01cef55c2
child 536 c4e6e1537d66
     1.1 --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Tue Jan 22 17:53:05 2013 +0100
     1.2 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java	Tue Jan 22 19:16:38 2013 +0100
     1.3 @@ -55,7 +55,7 @@
     1.4   */
     1.5  final class Bck2BrwsrLauncher extends Launcher implements Closeable {
     1.6      private static final Logger LOG = Logger.getLogger(Bck2BrwsrLauncher.class.getName());
     1.7 -    private static final MethodInvocation END = new MethodInvocation(null, null);
     1.8 +    private static final MethodInvocation END = new MethodInvocation(null, null, null);
     1.9      private Set<ClassLoader> loaders = new LinkedHashSet<>();
    1.10      private BlockingQueue<MethodInvocation> methods = new LinkedBlockingQueue<>();
    1.11      private long timeOut;
    1.12 @@ -70,9 +70,9 @@
    1.13      }
    1.14      
    1.15      @Override
    1.16 -    public MethodInvocation addMethod(Class<?> clazz, String method) throws IOException {
    1.17 +     MethodInvocation addMethod(Class<?> clazz, String method, String html) throws IOException {
    1.18          loaders.add(clazz.getClassLoader());
    1.19 -        MethodInvocation c = new MethodInvocation(clazz.getName(), method);
    1.20 +        MethodInvocation c = new MethodInvocation(clazz.getName(), method, html);
    1.21          methods.add(c);
    1.22          try {
    1.23              c.await(timeOut);
    1.24 @@ -174,7 +174,13 @@
    1.25                      + "className: '" + cn + "', "
    1.26                      + "methodName: '" + mn + "', "
    1.27                      + "request: " + cnt
    1.28 -                    + "}");
    1.29 +                );
    1.30 +                if (mi.html != null) {
    1.31 +                    response.getWriter().write(", html: '");
    1.32 +                    response.getWriter().write(encodeJSON(mi.html));
    1.33 +                    response.getWriter().write("'");
    1.34 +                }
    1.35 +                response.getWriter().write("}");
    1.36                  cnt++;
    1.37              }
    1.38          }, "/data");
    1.39 @@ -182,6 +188,22 @@
    1.40          this.brwsr = launchServerAndBrwsr(server, "/execute");
    1.41      }
    1.42      
    1.43 +    private static String encodeJSON(String in) {
    1.44 +        StringBuilder sb = new StringBuilder();
    1.45 +        for (int i = 0; i < in.length(); i++) {
    1.46 +            char ch = in.charAt(i);
    1.47 +            if (ch < 32 || ch == '\'' || ch == '"') {
    1.48 +                sb.append("\\u");
    1.49 +                String hs = "0000" + Integer.toHexString(ch);
    1.50 +                hs = hs.substring(hs.length() - 4);
    1.51 +                sb.append(hs);
    1.52 +            } else {
    1.53 +                sb.append(ch);
    1.54 +            }
    1.55 +        }
    1.56 +        return sb.toString();
    1.57 +    }
    1.58 +    
    1.59      @Override
    1.60      public void shutdown() throws IOException {
    1.61          methods.offer(END);
    1.62 @@ -348,7 +370,7 @@
    1.63          public Page(Res res, String resource, String... args) {
    1.64              this.res = res;
    1.65              this.resource = resource;
    1.66 -            this.args = args;
    1.67 +            this.args = args.length == 0 ? new String[] { "$0" } : args;
    1.68          }
    1.69  
    1.70          @Override