dew/src/main/java/org/apidesign/bck2brwsr/dew/Dew.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 11 Feb 2013 19:51:35 +0100
branchemul
changeset 710 769b77cdb7a5
parent 579 942deef87200
child 1020 a6bacea2518f
permissions -rw-r--r--
Prevent against NPE
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.dew;
    19 
    20 import java.io.ByteArrayInputStream;
    21 import java.io.IOException;
    22 import java.io.InputStream;
    23 import java.io.InputStreamReader;
    24 import java.io.OutputStream;
    25 import java.util.List;
    26 import java.util.Locale;
    27 import javax.tools.Diagnostic;
    28 import javax.tools.JavaFileObject;
    29 import org.apidesign.vm4brwsr.Bck2Brwsr;
    30 import org.glassfish.grizzly.http.Method;
    31 import org.glassfish.grizzly.http.server.HttpHandler;
    32 import org.glassfish.grizzly.http.server.HttpServer;
    33 import org.glassfish.grizzly.http.server.Request;
    34 import org.glassfish.grizzly.http.server.Response;
    35 import org.glassfish.grizzly.http.util.HttpStatus;
    36 import org.json.JSONArray;
    37 import org.json.JSONObject;
    38 import org.json.JSONTokener;
    39 
    40 /**
    41  *
    42  * @author phrebejk
    43  */
    44 final class Dew extends HttpHandler implements Bck2Brwsr.Resources {
    45     private Compile data;
    46 
    47     public static void main(String... args) throws Exception {
    48         DewLauncher l = new DewLauncher(null);
    49         l.addClassLoader(DewLauncher.class.getClassLoader());
    50         final Dew dew = new Dew();
    51         HttpServer s = l.initServer(dew);
    52         s.getServerConfiguration().addHttpHandler(dew, "/dew/");
    53         l.launchServerAndBrwsr(s, "/dew/");
    54         System.in.read();
    55     }
    56     
    57     @Override
    58     public void service(Request request, Response response) throws Exception {
    59         
    60         if ( request.getMethod() == Method.POST ) {
    61             InputStream is = request.getInputStream();
    62             JSONTokener tok = new JSONTokener(new InputStreamReader(is));
    63             JSONObject obj = new JSONObject(tok);
    64             String tmpHtml = obj.getString("html");
    65             String tmpJava = obj.getString("java");
    66             
    67             Compile res = Compile.create(tmpHtml, tmpJava);
    68             List<Diagnostic<? extends JavaFileObject>> err = res.getErrors();
    69             if (err.isEmpty()) {
    70                 data = res;
    71                 response.getOutputStream().write("[]".getBytes());
    72                 response.setStatus(HttpStatus.OK_200);
    73             } else {
    74                 
    75                 JSONArray errors = new JSONArray();
    76                 
    77                 for (Diagnostic<? extends JavaFileObject> d : err) {
    78                     JSONObject e = new JSONObject();
    79                     e.put("col", d.getColumnNumber());
    80                     e.put("line", d.getLineNumber());
    81                     e.put("kind", d.getKind().toString());
    82                     e.put("msg", d.getMessage(Locale.ENGLISH));
    83                     errors.put(e);
    84                 }
    85                 
    86                 errors.write(response.getWriter());                
    87                 response.setStatus(HttpStatus.PRECONDITION_FAILED_412);
    88             }
    89             
    90             return;
    91         }
    92         
    93         String r = request.getHttpHandlerPath();
    94         if (r == null || r.equals("/")) {
    95             r = "index.html";
    96         }
    97         if (r.equals("/result.html")) {
    98             response.setContentType("text/html");
    99             if (data != null) {
   100                 response.getOutputBuffer().write(data.getHtml());
   101             }
   102             response.setStatus(HttpStatus.OK_200);
   103             return;
   104         }
   105         
   106         if (r.startsWith("/")) {
   107             r = r.substring(1);
   108         }
   109         
   110         if (r.endsWith(".html") || r.endsWith(".xhtml")) {
   111             response.setContentType("text/html");
   112         }
   113         OutputStream os = response.getOutputStream();
   114         try (InputStream is = Dew.class.getResourceAsStream(r) ) {
   115             copyStream(is, os, request.getRequestURL().toString() );
   116         } catch (IOException ex) {
   117             response.setDetailMessage(ex.getLocalizedMessage());
   118             response.setError();
   119             response.setStatus(404);
   120         }
   121     }
   122     
   123     static void copyStream(InputStream is, OutputStream os, String baseURL) throws IOException {
   124         for (;;) {
   125             int ch = is.read();
   126             if (ch == -1) {
   127                 break;
   128             }
   129             os.write(ch);            
   130         }
   131     }
   132 
   133     @Override
   134     public InputStream get(String r) throws IOException {
   135         byte[] arr = data == null ? null : data.get(r);
   136         return arr == null ? null : new ByteArrayInputStream(arr);
   137     }
   138 }