jaroslav@468: /** jaroslav@468: * Back 2 Browser Bytecode Translator jaroslav@468: * Copyright (C) 2012 Jaroslav Tulach jaroslav@468: * jaroslav@468: * This program is free software: you can redistribute it and/or modify jaroslav@468: * it under the terms of the GNU General Public License as published by jaroslav@468: * the Free Software Foundation, version 2 of the License. jaroslav@468: * jaroslav@468: * This program is distributed in the hope that it will be useful, jaroslav@468: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@468: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@468: * GNU General Public License for more details. jaroslav@468: * jaroslav@468: * You should have received a copy of the GNU General Public License jaroslav@468: * along with this program. Look for COPYING file in the top folder. jaroslav@468: * If not, see http://opensource.org/licenses/GPL-2.0. phrebejk@460: */ phrebejk@460: package org.apidesign.bck2brwsr.dew; phrebejk@460: jaroslav@471: 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@466: import java.io.Writer; 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; jaroslav@471: import org.apidesign.vm4brwsr.Bck2Brwsr; 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: */ jaroslav@471: public class Dew extends HttpHandler implements Bck2Brwsr.Resources { jaroslav@466: private String html = ""; 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); jaroslav@466: String tmpHtml = obj.getString("html"); jaroslav@466: String tmpJava = obj.getString("java"); phrebejk@461: jaroslav@466: Compile res = Compile.create(tmpHtml, tmpJava); jaroslav@465: List> err = res.getErrors(); jaroslav@465: if (err.isEmpty()) { jaroslav@465: data = res; jaroslav@466: html = tmpHtml; 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: 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@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: } jaroslav@471: jaroslav@471: @Override jaroslav@471: public InputStream get(String r) throws IOException { jaroslav@471: byte[] arr = data == null ? null : data.get(r); jaroslav@471: return arr == null ? null : new ByteArrayInputStream(arr); jaroslav@471: } phrebejk@460: }