launcher/src/main/java/org/apidesign/bck2brwsr/dew/Dew.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 16 Jan 2013 12:25:50 +0100
branchdew
changeset 466 d6b1f996c0d8
parent 465 443eb0f21a0a
child 468 a7ff47e054f3
permissions -rw-r--r--
Serve byte code as JSON. Initialize the fields in JavaScript.
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package org.apidesign.bck2brwsr.dew;
     6 
     7 import java.io.ByteArrayInputStream;
     8 import java.io.DataOutputStream;
     9 import java.io.IOException;
    10 import java.io.InputStream;
    11 import java.io.InputStreamReader;
    12 import java.io.OutputStream;
    13 import java.io.OutputStreamWriter;
    14 import java.io.Writer;
    15 import java.util.List;
    16 import java.util.logging.Logger;
    17 import javax.tools.Diagnostic;
    18 import javax.tools.JavaFileObject;
    19 import org.glassfish.grizzly.http.Method;
    20 import org.glassfish.grizzly.http.server.HttpHandler;
    21 import org.glassfish.grizzly.http.server.Request;
    22 import org.glassfish.grizzly.http.server.Response;
    23 import org.glassfish.grizzly.http.util.HttpStatus;
    24 import org.json.JSONObject;
    25 import org.json.JSONTokener;
    26 
    27 /**
    28  *
    29  * @author phrebejk
    30  */
    31 public class Dew extends HttpHandler {
    32     private String html = "";
    33     private Compile data;
    34 
    35     @Override
    36     public void service(Request request, Response response) throws Exception {
    37         
    38         if ( request.getMethod() == Method.POST ) {
    39             InputStream is = request.getInputStream();
    40             JSONTokener tok = new JSONTokener(new InputStreamReader(is));
    41             JSONObject obj = new JSONObject(tok);
    42             String tmpHtml = obj.getString("html");
    43             String tmpJava = obj.getString("java");
    44             
    45             Compile res = Compile.create(tmpHtml, tmpJava);
    46             List<Diagnostic<? extends JavaFileObject>> err = res.getErrors();
    47             if (err.isEmpty()) {
    48                 data = res;
    49                 html = tmpHtml;
    50                 response.getOutputStream().write("[]".getBytes());
    51                 response.setStatus(HttpStatus.OK_200);
    52             } else {
    53                 response.getOutputStream().write(("[errors:'" + err + "']").getBytes());
    54                 response.setStatus(HttpStatus.PRECONDITION_FAILED_412);
    55             }
    56             
    57             return;
    58         }
    59         
    60         String r = request.getHttpHandlerPath();
    61         if (r == null || r.equals("/")) {
    62             r = "index.html";
    63         }
    64         if (r.equals("/result.html")) {
    65             response.setContentType("text/html");
    66             response.getOutputBuffer().write(html);
    67             response.setStatus(HttpStatus.OK_200);
    68             return;
    69         }
    70         
    71         if (r.startsWith("/")) {
    72             r = r.substring(1);
    73         }
    74         if (r.startsWith("classes/")) {
    75             r = r.substring(8);
    76             byte[] arr = data == null ? null : data.get(r);
    77             if (arr == null) {
    78                 response.setError();
    79                 response.setDetailMessage("No data for " + r + " yet!");
    80                 return;
    81             }
    82             try (Writer w = response.getWriter()) {
    83                 response.setContentType("text/javascript");
    84                 w.append("[");
    85                 for (int i = 0; i < arr.length; i++) {
    86                     int b = arr[i];
    87                     if (b == -1) {
    88                         break;
    89                     }
    90                     if (i > 0) {
    91                         w.append(", ");
    92                     }
    93                     if (i % 20 == 0) {
    94                         w.write("\n");
    95                     }
    96                     if (b > 127) {
    97                         b = b - 256;
    98                     }
    99                     w.append(Integer.toString(b));
   100                 }
   101                 w.append("\n]");
   102             }
   103             return;
   104         }
   105         
   106         if (r.endsWith(".html") || r.endsWith(".xhtml")) {
   107             response.setContentType("text/html");
   108         }
   109         OutputStream os = response.getOutputStream();
   110         try (InputStream is = Dew.class.getResourceAsStream(r) ) {
   111             copyStream(is, os, request.getRequestURL().toString() );
   112         } catch (IOException ex) {
   113             response.setDetailMessage(ex.getLocalizedMessage());
   114             response.setError();
   115             response.setStatus(404);
   116         }
   117     }
   118     private static final Logger LOG = Logger.getLogger(Dew.class.getName());
   119     
   120     static void copyStream(InputStream is, OutputStream os, String baseURL) throws IOException {
   121         for (;;) {
   122             int ch = is.read();
   123             if (ch == -1) {
   124                 break;
   125             }
   126             os.write(ch);            
   127         }
   128     }
   129     
   130 }