phrebejk@460: /*
phrebejk@460: * To change this template, choose Tools | Templates
phrebejk@460: * and open the template in the editor.
phrebejk@460: */
phrebejk@460: package org.apidesign.bck2brwsr.dew;
phrebejk@460:
phrebejk@461: import java.io.ByteArrayInputStream;
phrebejk@460: import java.io.IOException;
phrebejk@460: import java.io.InputStream;
phrebejk@461: import java.io.InputStreamReader;
phrebejk@460: import java.io.OutputStream;
jaroslav@465: import java.util.List;
phrebejk@461: import java.util.logging.Logger;
jaroslav@465: import javax.tools.Diagnostic;
jaroslav@465: import javax.tools.JavaFileObject;
phrebejk@461: import org.glassfish.grizzly.http.Method;
phrebejk@460: import org.glassfish.grizzly.http.server.HttpHandler;
phrebejk@460: import org.glassfish.grizzly.http.server.Request;
phrebejk@460: import org.glassfish.grizzly.http.server.Response;
phrebejk@461: import org.glassfish.grizzly.http.util.HttpStatus;
phrebejk@461: import org.json.JSONObject;
phrebejk@461: import org.json.JSONTokener;
phrebejk@460:
phrebejk@460: /**
phrebejk@460: *
phrebejk@460: * @author phrebejk
phrebejk@460: */
phrebejk@460: public class Dew extends HttpHandler {
jaroslav@465: private String html = "
\n"
jaroslav@465: + " \n"
jaroslav@465: + "
\n"
jaroslav@465: + "\n"
jaroslav@465: + "\n"
jaroslav@465: + "\n"
jaroslav@465: + " \n"
jaroslav@465: + " \n"
jaroslav@465: + "\n";
jaroslav@465: private String java = "package bck2brwsr.demo;\n"
jaroslav@465: + "import org.apidesign.bck2brwsr.htmlpage.api.*;\n"
jaroslav@465: + "@Page(xhtml=\"index.html\", className=\"Index\")\n"
jaroslav@465: + "class X {\n"
jaroslav@465: + " @OnClick(id=\"btn\") static void clcs() {\n"
jaroslav@465: + " Index.BTN.setDisabled(true);\n"
jaroslav@465: + " }\n"
jaroslav@465: + "}\n";
jaroslav@465: private Compile data;
phrebejk@460:
phrebejk@460: @Override
phrebejk@460: public void service(Request request, Response response) throws Exception {
phrebejk@461:
phrebejk@461: if ( request.getMethod() == Method.POST ) {
phrebejk@461: InputStream is = request.getInputStream();
phrebejk@461: JSONTokener tok = new JSONTokener(new InputStreamReader(is));
phrebejk@461: JSONObject obj = new JSONObject(tok);
phrebejk@461: html = obj.getString("html");
jaroslav@462: java = obj.getString("java");
phrebejk@461:
jaroslav@465: Compile res = Compile.create(html, java);
jaroslav@465: List> err = res.getErrors();
jaroslav@465: if (err.isEmpty()) {
jaroslav@465: data = res;
jaroslav@465: response.getOutputStream().write("[]".getBytes());
jaroslav@465: response.setStatus(HttpStatus.OK_200);
jaroslav@465: } else {
jaroslav@465: response.getOutputStream().write(("[errors:'" + err + "']").getBytes());
jaroslav@465: response.setStatus(HttpStatus.PRECONDITION_FAILED_412);
jaroslav@465: }
phrebejk@461:
phrebejk@461: return;
phrebejk@461: }
phrebejk@461:
phrebejk@460: String r = request.getHttpHandlerPath();
phrebejk@460: if (r == null || r.equals("/")) {
phrebejk@460: r = "index.html";
phrebejk@460: }
phrebejk@461: if (r.equals("/result.html")) {
phrebejk@461: response.setContentType("text/html");
phrebejk@461: response.getOutputBuffer().write(html);
phrebejk@461: response.setStatus(HttpStatus.OK_200);
phrebejk@461: return;
phrebejk@461: }
phrebejk@461:
phrebejk@460: if (r.startsWith("/")) {
phrebejk@460: r = r.substring(1);
phrebejk@460: }
jaroslav@465: if (r.startsWith("classes/")) {
jaroslav@465: if (data == null) {
jaroslav@465: //data = Compile.create(html, java);
jaroslav@465: }
jaroslav@465: r = r.substring(8);
jaroslav@465: byte[] is = data == null ? null : data.get(r);
jaroslav@465: if (is == null) {
jaroslav@465: is = new byte[0];
jaroslav@465: }
jaroslav@465: OutputStream os = response.getOutputStream();
jaroslav@465: copyStream(new ByteArrayInputStream(is), os, request.getRequestURL().toString() );
jaroslav@465: return;
jaroslav@465: }
jaroslav@465:
phrebejk@460: if (r.endsWith(".html") || r.endsWith(".xhtml")) {
phrebejk@460: response.setContentType("text/html");
phrebejk@460: }
phrebejk@460: OutputStream os = response.getOutputStream();
phrebejk@460: try (InputStream is = Dew.class.getResourceAsStream(r) ) {
phrebejk@460: copyStream(is, os, request.getRequestURL().toString() );
phrebejk@460: } catch (IOException ex) {
phrebejk@460: response.setDetailMessage(ex.getLocalizedMessage());
phrebejk@460: response.setError();
phrebejk@460: response.setStatus(404);
phrebejk@460: }
phrebejk@460: }
phrebejk@461: private static final Logger LOG = Logger.getLogger(Dew.class.getName());
phrebejk@460:
phrebejk@460: static void copyStream(InputStream is, OutputStream os, String baseURL) throws IOException {
phrebejk@460: for (;;) {
phrebejk@460: int ch = is.read();
phrebejk@460: if (ch == -1) {
phrebejk@460: break;
phrebejk@460: }
phrebejk@460: os.write(ch);
phrebejk@460: }
phrebejk@460: }
phrebejk@460:
phrebejk@460: }