# HG changeset patch # User Jaroslav Tulach # Date 1388733399 -3600 # Node ID 2fc4100fcd32b8a34b9b6cb08c98e1aa28c0f2e3 # Parent 68012e8398a8ca12d7d71b1b62d3222bba8b8d38 Making JSON calls work without references to non-public packages diff -r 68012e8398a8 -r 2fc4100fcd32 json/src/main/java/org/apidesign/html/json/spi/Proto.java --- a/json/src/main/java/org/apidesign/html/json/spi/Proto.java Thu Dec 26 22:42:01 2013 +0100 +++ b/json/src/main/java/org/apidesign/html/json/spi/Proto.java Fri Jan 03 08:16:39 2014 +0100 @@ -48,6 +48,8 @@ import org.netbeans.html.json.impl.Bindings; import org.netbeans.html.json.impl.JSON; import org.netbeans.html.json.impl.JSONList; +import org.netbeans.html.json.impl.RcvrJSON; +import org.netbeans.html.json.impl.RcvrJSON.MsgEvnt; /** * @@ -149,6 +151,24 @@ type.onChange(obj, index); } + public void loadJSON(final int index, + String urlBefore, String urlAfter, String method, + final Object data + ) { + class Rcvr extends RcvrJSON { + @Override + protected void onMessage(MsgEvnt msg) { + type.onMessage(obj, index, 1, msg.getValues()); + } + + @Override + protected void onError(MsgEvnt msg) { + type.onMessage(obj, index, 2, msg.getException()); + } + } + JSON.loadJSON(context, new Rcvr(), urlBefore, urlAfter, method, data); + } + public String toString(Object data, String propName) { return JSON.toString(context, data, propName); } @@ -177,7 +197,7 @@ } } } - + /** Functionality used by the code generated by annotation * processor for the {@link net.java.html.json.Model} annotation. * @@ -225,6 +245,21 @@ public abstract Model read(BrwsrCtx c, Object json); public abstract void onChange(Model model, int index); public abstract Proto protoFor(Object object); + + /** + * + * @param model + * @param index + * @param type 0 - onOpen, 1 - onMessage, 2 - onError, 3 - onClose + * @param data + */ + public abstract void onMessage(Model model, int index, int type, Object data); + + public void copyJSON(BrwsrCtx context, Object[] src, Class destType, T[] dest) { + for (int i = 0; i < src.length && i < dest.length; i++) { + dest[i] = org.netbeans.html.json.impl.JSON.read(context, destType, src[i]); + } + } // // Various support methods the generated classes use diff -r 68012e8398a8 -r 2fc4100fcd32 json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Thu Dec 26 22:42:01 2013 +0100 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Fri Jan 03 08:16:39 2014 +0100 @@ -183,6 +183,7 @@ models.put(e, className); try { StringWriter body = new StringWriter(); + StringBuilder onReceiveType = new StringBuilder(); List propsGetSet = new ArrayList(); List functions = new ArrayList(); Map> propsDeps = new HashMap>(); @@ -201,7 +202,7 @@ if (!generateFunctions(e, body, className, e.getEnclosedElements(), functions)) { ok = false; } - if (!generateReceive(e, body, className, e.getEnclosedElements(), functions)) { + if (!generateReceive(e, body, className, e.getEnclosedElements(), onReceiveType)) { ok = false; } if (!generateOperation(e, body, className, e.getEnclosedElements())) { @@ -372,6 +373,7 @@ w.append(" }\n"); w.append(" throw new UnsupportedOperationException();\n"); w.append(" }\n"); + w.append(onReceiveType); w.append(" @Override public " + className + " read(net.java.html.BrwsrCtx c, Object json) { return new " + className + "(c, json); }\n"); w.append(" @Override public " + className + " cloneTo(Object o, net.java.html.BrwsrCtx c) { return ((" + className + ")o).clone(c); }\n"); w.append(" }\n"); @@ -930,8 +932,11 @@ private boolean generateReceive( Element clazz, StringWriter body, String className, - List enclosedElements, List functions + List enclosedElements, StringBuilder inType ) { + inType.append(" @Override public void onMessage(").append(className).append(" model, int index, int type, Object data) {\n"); + inType.append(" switch (index) {\n"); + int index = 0; for (Element m : enclosedElements) { if (m.getKind() != ElementKind.METHOD) { continue; @@ -979,7 +984,7 @@ simpleName = type.toString(); } if (simpleName.toString().equals(className)) { - args.add(className + ".this"); + args.add("model"); } else if (isModel(ve.asType())) { modelType = ve.asType(); } else if (ve.asType().getKind() == TypeKind.ARRAY) { @@ -1042,47 +1047,49 @@ body.append(") {\n"); boolean webSocket = onR.method().equals("WebSocket"); if (webSocket) { - if (generateWSReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) { - return false; - } +// if (generateWSReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) { +// return false; +// } body.append(" }\n"); body.append(" private org.netbeans.html.json.impl.JSON.WS ws_" + e.getSimpleName() + ";\n"); } else { - if (generateJSONReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) { + if (generateJSONReceiveBody(index++, body, inType, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) { return false; } body.append(" }\n"); } } + inType.append(" }\n"); + inType.append(" throw new UnsupportedOperationException(\"index: \" + index + \" type: \" + type);\n"); + inType.append(" }\n"); return true; } - private boolean generateJSONReceiveBody(StringWriter body, OnReceive onR, ExecutableElement e, Element clazz, String className, boolean expectsList, String modelClass, String n, List args, StringBuilder urlBefore, String jsonpVarName, StringBuilder urlAfter, String dataMirror) { + private boolean generateJSONReceiveBody(int index, StringWriter method, StringBuilder body, OnReceive onR, ExecutableElement e, Element clazz, String className, boolean expectsList, String modelClass, String n, List args, StringBuilder urlBefore, String jsonpVarName, StringBuilder urlAfter, String dataMirror) { body.append( - " class ProcessResult extends org.netbeans.html.json.impl.RcvrJSON {\n" + - " @Override\n" + - " public void onError(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n" + - " Exception value = ev.getException();\n" + " case " + index + ": {\n" + + " if (type == 2) { /* on error */\n" + + " Exception ex = (Exception)data;\n" ); if (onR.onError().isEmpty()) { body.append( - " value.printStackTrace();\n" + " ex.printStackTrace();\n" ); } else { if (!findOnError(e, ((TypeElement)clazz), onR.onError(), className)) { return true; } body.append(" ").append(clazz.getSimpleName()).append(".").append(onR.onError()).append("("); - body.append(className).append(".this, value);\n"); + body.append("model, ex);\n"); } body.append( - " }\n" + - " @Override\n" + - " public void onMessage(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n" + " return;\n" + + " } else if (type == 1) {\n" + + " Object[] ev = (Object[])data;\n" ); if (expectsList) { body.append( - " " + modelClass + "[] arr = new " + modelClass + "[ev.dataSize()];\n" + " " + modelClass + "[] arr = new " + modelClass + "[ev.length];\n" ); } else { body.append( @@ -1090,8 +1097,8 @@ ); } body.append( - " ev.dataRead(proto.getContext(), " + modelClass + ".class, arr);\n" - ); + " TYPE.copyJSON(model.proto.getContext(), ev, " + modelClass + ".class, arr);\n" + ); { body.append(" ").append(clazz.getSimpleName()).append(".").append(n).append("("); String sep = ""; @@ -1103,28 +1110,28 @@ body.append(");\n"); } body.append( + " return;\n" + " }\n" + " }\n" ); - body.append(" ProcessResult pr = new ProcessResult();\n"); - body.append(" org.netbeans.html.json.impl.JSON.loadJSON(proto.getContext(), pr,\n "); - body.append(urlBefore).append(", "); + method.append(" proto.loadJSON(" + index + ",\n "); + method.append(urlBefore).append(", "); if (jsonpVarName != null) { - body.append(urlAfter); + method.append(urlAfter); } else { - body.append("null"); + method.append("null"); } if (!"GET".equals(onR.method()) || dataMirror != null) { - body.append(", \"").append(onR.method()).append('"'); + method.append(", \"").append(onR.method()).append('"'); if (dataMirror != null) { - body.append(", data"); + method.append(", data"); } else { - body.append(", null"); + method.append(", null"); } } else { - body.append(", null, null"); + method.append(", null, null"); } - body.append(");\n"); + method.append(");\n"); return false; } diff -r 68012e8398a8 -r 2fc4100fcd32 json/src/main/java/org/netbeans/html/json/impl/RcvrJSON.java --- a/json/src/main/java/org/netbeans/html/json/impl/RcvrJSON.java Thu Dec 26 22:42:01 2013 +0100 +++ b/json/src/main/java/org/netbeans/html/json/impl/RcvrJSON.java Fri Jan 03 08:16:39 2014 +0100 @@ -42,6 +42,7 @@ */ package org.netbeans.html.json.impl; +import java.util.ArrayList; import net.java.html.BrwsrCtx; /** Super type for those who wish to receive JSON messages. @@ -73,13 +74,10 @@ return new Exception(t); } - public int dataSize() { - return -1; + public Object[] getValues() { + return null; } - public void dataRead(BrwsrCtx ctx, Class type, Data[] fillTheArray) { - } - public abstract void dispatch(RcvrJSON r); public static MsgEvnt createError(final Throwable t) { @@ -99,26 +97,8 @@ public static MsgEvnt createMessage(final Object value) { return new MsgEvnt() { @Override - public int dataSize() { - if (value instanceof Object[]) { - return ((Object[])value).length; - } else { - return 1; - } - } - - @Override - public void dataRead(BrwsrCtx context, Class type, Data[] arr) { - if (value instanceof Object[]) { - Object[] data = ((Object[]) value); - for (int i = 0; i < data.length && i < arr.length; i++) { - arr[i] = org.netbeans.html.json.impl.JSON.read(context, type, data[i]); - } - } else { - if (arr.length > 0) { - arr[0] = org.netbeans.html.json.impl.JSON.read(context, type, value); - } - } + public Object[] getValues() { + return value instanceof Object[] ? (Object[])value : new Object[] { value }; } @Override @@ -145,5 +125,4 @@ } }; } - } // end MsgEvnt -} + } }