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@465: import java.util.List; phrebejk@541: import java.util.Locale; 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; jaroslav@546: import org.glassfish.grizzly.http.server.HttpServer; 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@541: import org.json.JSONArray; 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@546: final class Dew extends HttpHandler implements Bck2Brwsr.Resources { jaroslav@465: private Compile data; phrebejk@460: jaroslav@546: public static void main(String... args) throws Exception { jaroslav@546: DewLauncher l = new DewLauncher(null); jaroslav@546: l.addClassLoader(DewLauncher.class.getClassLoader()); jaroslav@546: final Dew dew = new Dew(); jaroslav@546: HttpServer s = l.initServer(dew); jaroslav@546: s.getServerConfiguration().addHttpHandler(dew, "/dew/"); jaroslav@546: l.launchServerAndBrwsr(s, "/dew/"); jaroslav@546: System.in.read(); jaroslav@546: } jaroslav@546: 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@465: response.getOutputStream().write("[]".getBytes()); jaroslav@465: response.setStatus(HttpStatus.OK_200); jaroslav@465: } else { phrebejk@541: phrebejk@541: JSONArray errors = new JSONArray(); phrebejk@541: phrebejk@541: for (Diagnostic d : err) { phrebejk@541: JSONObject e = new JSONObject(); phrebejk@541: e.put("col", d.getColumnNumber()); phrebejk@541: e.put("line", d.getLineNumber()); phrebejk@541: e.put("kind", d.getKind().toString()); phrebejk@541: e.put("msg", d.getMessage(Locale.ENGLISH)); phrebejk@541: errors.put(e); phrebejk@541: } phrebejk@541: phrebejk@541: errors.write(response.getWriter()); 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"); jaroslav@710: if (data != null) { jaroslav@710: response.getOutputBuffer().write(data.getHtml()); jaroslav@710: } 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: }