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