author | Jaroslav Tulach <jaroslav.tulach@apidesign.org> |
Wed, 16 Jan 2013 12:25:50 +0100 | |
branch | dew |
changeset 466 | d6b1f996c0d8 |
parent 465 | 443eb0f21a0a |
child 468 | a7ff47e054f3 |
permissions | -rw-r--r-- |
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; |
jaroslav@466 | 8 |
import java.io.DataOutputStream; |
phrebejk@460 | 9 |
import java.io.IOException; |
phrebejk@460 | 10 |
import java.io.InputStream; |
phrebejk@461 | 11 |
import java.io.InputStreamReader; |
phrebejk@460 | 12 |
import java.io.OutputStream; |
jaroslav@466 | 13 |
import java.io.OutputStreamWriter; |
jaroslav@466 | 14 |
import java.io.Writer; |
jaroslav@465 | 15 |
import java.util.List; |
phrebejk@461 | 16 |
import java.util.logging.Logger; |
jaroslav@465 | 17 |
import javax.tools.Diagnostic; |
jaroslav@465 | 18 |
import javax.tools.JavaFileObject; |
phrebejk@461 | 19 |
import org.glassfish.grizzly.http.Method; |
phrebejk@460 | 20 |
import org.glassfish.grizzly.http.server.HttpHandler; |
phrebejk@460 | 21 |
import org.glassfish.grizzly.http.server.Request; |
phrebejk@460 | 22 |
import org.glassfish.grizzly.http.server.Response; |
phrebejk@461 | 23 |
import org.glassfish.grizzly.http.util.HttpStatus; |
phrebejk@461 | 24 |
import org.json.JSONObject; |
phrebejk@461 | 25 |
import org.json.JSONTokener; |
phrebejk@460 | 26 |
|
phrebejk@460 | 27 |
/** |
phrebejk@460 | 28 |
* |
phrebejk@460 | 29 |
* @author phrebejk |
phrebejk@460 | 30 |
*/ |
phrebejk@460 | 31 |
public class Dew extends HttpHandler { |
jaroslav@466 | 32 |
private String html = ""; |
jaroslav@465 | 33 |
private Compile data; |
phrebejk@460 | 34 |
|
phrebejk@460 | 35 |
@Override |
phrebejk@460 | 36 |
public void service(Request request, Response response) throws Exception { |
phrebejk@461 | 37 |
|
phrebejk@461 | 38 |
if ( request.getMethod() == Method.POST ) { |
phrebejk@461 | 39 |
InputStream is = request.getInputStream(); |
phrebejk@461 | 40 |
JSONTokener tok = new JSONTokener(new InputStreamReader(is)); |
phrebejk@461 | 41 |
JSONObject obj = new JSONObject(tok); |
jaroslav@466 | 42 |
String tmpHtml = obj.getString("html"); |
jaroslav@466 | 43 |
String tmpJava = obj.getString("java"); |
phrebejk@461 | 44 |
|
jaroslav@466 | 45 |
Compile res = Compile.create(tmpHtml, tmpJava); |
jaroslav@465 | 46 |
List<Diagnostic<? extends JavaFileObject>> err = res.getErrors(); |
jaroslav@465 | 47 |
if (err.isEmpty()) { |
jaroslav@465 | 48 |
data = res; |
jaroslav@466 | 49 |
html = tmpHtml; |
jaroslav@465 | 50 |
response.getOutputStream().write("[]".getBytes()); |
jaroslav@465 | 51 |
response.setStatus(HttpStatus.OK_200); |
jaroslav@465 | 52 |
} else { |
jaroslav@465 | 53 |
response.getOutputStream().write(("[errors:'" + err + "']").getBytes()); |
jaroslav@465 | 54 |
response.setStatus(HttpStatus.PRECONDITION_FAILED_412); |
jaroslav@465 | 55 |
} |
phrebejk@461 | 56 |
|
phrebejk@461 | 57 |
return; |
phrebejk@461 | 58 |
} |
phrebejk@461 | 59 |
|
phrebejk@460 | 60 |
String r = request.getHttpHandlerPath(); |
phrebejk@460 | 61 |
if (r == null || r.equals("/")) { |
phrebejk@460 | 62 |
r = "index.html"; |
phrebejk@460 | 63 |
} |
phrebejk@461 | 64 |
if (r.equals("/result.html")) { |
phrebejk@461 | 65 |
response.setContentType("text/html"); |
phrebejk@461 | 66 |
response.getOutputBuffer().write(html); |
phrebejk@461 | 67 |
response.setStatus(HttpStatus.OK_200); |
phrebejk@461 | 68 |
return; |
phrebejk@461 | 69 |
} |
phrebejk@461 | 70 |
|
phrebejk@460 | 71 |
if (r.startsWith("/")) { |
phrebejk@460 | 72 |
r = r.substring(1); |
phrebejk@460 | 73 |
} |
jaroslav@465 | 74 |
if (r.startsWith("classes/")) { |
jaroslav@466 | 75 |
r = r.substring(8); |
jaroslav@466 | 76 |
byte[] arr = data == null ? null : data.get(r); |
jaroslav@466 | 77 |
if (arr == null) { |
jaroslav@466 | 78 |
response.setError(); |
jaroslav@466 | 79 |
response.setDetailMessage("No data for " + r + " yet!"); |
jaroslav@466 | 80 |
return; |
jaroslav@465 | 81 |
} |
jaroslav@466 | 82 |
try (Writer w = response.getWriter()) { |
jaroslav@466 | 83 |
response.setContentType("text/javascript"); |
jaroslav@466 | 84 |
w.append("["); |
jaroslav@466 | 85 |
for (int i = 0; i < arr.length; i++) { |
jaroslav@466 | 86 |
int b = arr[i]; |
jaroslav@466 | 87 |
if (b == -1) { |
jaroslav@466 | 88 |
break; |
jaroslav@466 | 89 |
} |
jaroslav@466 | 90 |
if (i > 0) { |
jaroslav@466 | 91 |
w.append(", "); |
jaroslav@466 | 92 |
} |
jaroslav@466 | 93 |
if (i % 20 == 0) { |
jaroslav@466 | 94 |
w.write("\n"); |
jaroslav@466 | 95 |
} |
jaroslav@466 | 96 |
if (b > 127) { |
jaroslav@466 | 97 |
b = b - 256; |
jaroslav@466 | 98 |
} |
jaroslav@466 | 99 |
w.append(Integer.toString(b)); |
jaroslav@466 | 100 |
} |
jaroslav@466 | 101 |
w.append("\n]"); |
jaroslav@465 | 102 |
} |
jaroslav@465 | 103 |
return; |
jaroslav@465 | 104 |
} |
jaroslav@465 | 105 |
|
phrebejk@460 | 106 |
if (r.endsWith(".html") || r.endsWith(".xhtml")) { |
phrebejk@460 | 107 |
response.setContentType("text/html"); |
phrebejk@460 | 108 |
} |
phrebejk@460 | 109 |
OutputStream os = response.getOutputStream(); |
phrebejk@460 | 110 |
try (InputStream is = Dew.class.getResourceAsStream(r) ) { |
phrebejk@460 | 111 |
copyStream(is, os, request.getRequestURL().toString() ); |
phrebejk@460 | 112 |
} catch (IOException ex) { |
phrebejk@460 | 113 |
response.setDetailMessage(ex.getLocalizedMessage()); |
phrebejk@460 | 114 |
response.setError(); |
phrebejk@460 | 115 |
response.setStatus(404); |
phrebejk@460 | 116 |
} |
phrebejk@460 | 117 |
} |
phrebejk@461 | 118 |
private static final Logger LOG = Logger.getLogger(Dew.class.getName()); |
phrebejk@460 | 119 |
|
phrebejk@460 | 120 |
static void copyStream(InputStream is, OutputStream os, String baseURL) throws IOException { |
phrebejk@460 | 121 |
for (;;) { |
phrebejk@460 | 122 |
int ch = is.read(); |
phrebejk@460 | 123 |
if (ch == -1) { |
phrebejk@460 | 124 |
break; |
phrebejk@460 | 125 |
} |
phrebejk@460 | 126 |
os.write(ch); |
phrebejk@460 | 127 |
} |
phrebejk@460 | 128 |
} |
phrebejk@460 | 129 |
|
phrebejk@460 | 130 |
} |