WebSocket communication works without dependencies on the implementation osgi
authorJaroslav Tulach <jaroslav.tulach@netbeans.org>
Fri, 03 Jan 2014 10:03:04 +0100
branchosgi
changeset 387972a38bebd50
parent 386 2fc4100fcd32
child 388 40de5fb0286f
WebSocket communication works without dependencies on the implementation
json/src/main/java/org/apidesign/html/json/spi/Proto.java
json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java
     1.1 --- a/json/src/main/java/org/apidesign/html/json/spi/Proto.java	Fri Jan 03 08:16:39 2014 +0100
     1.2 +++ b/json/src/main/java/org/apidesign/html/json/spi/Proto.java	Fri Jan 03 10:03:04 2014 +0100
     1.3 @@ -169,6 +169,35 @@
     1.4          JSON.loadJSON(context, new Rcvr(), urlBefore, urlAfter, method, data);
     1.5      }
     1.6      
     1.7 +    public Object wsOpen(final int index, String url, Object data) {
     1.8 +        class WSrcvr extends RcvrJSON {
     1.9 +            @Override
    1.10 +            protected void onError(MsgEvnt msg) {
    1.11 +                type.onMessage(obj, index, 2, msg.getException());
    1.12 +            }
    1.13 +            
    1.14 +            @Override
    1.15 +            protected void onMessage(MsgEvnt msg) {
    1.16 +                type.onMessage(obj, index, 1, msg.getValues());
    1.17 +            }
    1.18 +            
    1.19 +            @Override
    1.20 +            protected void onClose(MsgEvnt msg) {
    1.21 +                type.onMessage(obj, index, 3, null);
    1.22 +            }
    1.23 +
    1.24 +            @Override
    1.25 +            protected void onOpen(MsgEvnt msg) {
    1.26 +                type.onMessage(obj, index, 0, null);
    1.27 +            }
    1.28 +        }
    1.29 +        return JSON.openWS(context, new WSrcvr(), url, data);
    1.30 +    }
    1.31 +    
    1.32 +    public void wsSend(Object webSocket, String url, Object data) {
    1.33 +        ((JSON.WS)webSocket).send(context, url, data);
    1.34 +    }
    1.35 +    
    1.36      public String toString(Object data, String propName) {
    1.37          return JSON.toString(context, data, propName);
    1.38      }
     2.1 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Fri Jan 03 08:16:39 2014 +0100
     2.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Fri Jan 03 10:03:04 2014 +0100
     2.3 @@ -1047,11 +1047,11 @@
     2.4              body.append(") {\n");
     2.5              boolean webSocket = onR.method().equals("WebSocket");
     2.6              if (webSocket) {
     2.7 -//                if (generateWSReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
     2.8 -//                    return false;
     2.9 -//                }
    2.10 +                if (generateWSReceiveBody(index++, body, inType, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    2.11 +                    return false;
    2.12 +                }
    2.13                  body.append("  }\n");
    2.14 -                body.append("  private org.netbeans.html.json.impl.JSON.WS ws_" + e.getSimpleName() + ";\n");
    2.15 +                body.append("  private Object ws_" + e.getSimpleName() + ";\n");
    2.16              } else {
    2.17                  if (generateJSONReceiveBody(index++, body, inType, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    2.18                      return false;
    2.19 @@ -1135,13 +1135,11 @@
    2.20          return false;
    2.21      }
    2.22      
    2.23 -    private boolean generateWSReceiveBody(StringWriter body, OnReceive onR, ExecutableElement e, Element clazz, String className, boolean expectsList, String modelClass, String n, List<String> args, StringBuilder urlBefore, String jsonpVarName, StringBuilder urlAfter, String dataMirror) {
    2.24 +    private boolean generateWSReceiveBody(int index, StringWriter method, StringBuilder body, OnReceive onR, ExecutableElement e, Element clazz, String className, boolean expectsList, String modelClass, String n, List<String> args, StringBuilder urlBefore, String jsonpVarName, StringBuilder urlAfter, String dataMirror) {
    2.25          body.append(
    2.26 -            "    class ProcessResult extends org.netbeans.html.json.impl.RcvrJSON {\n" +
    2.27 -            "      @Override\n" +
    2.28 -            "      public void onOpen(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n"
    2.29 -        );
    2.30 -        body.append("        ").append(clazz.getSimpleName()).append(".").append(n).append("(");
    2.31 +            "    case " + index + ": {\n" +
    2.32 +            "      if (type == 0) { /* on open */\n" +
    2.33 +            "        ").append(clazz.getSimpleName()).append(".").append(n).append("(");
    2.34          {
    2.35              String sep = "";
    2.36              for (String arg : args) {
    2.37 @@ -1156,10 +1154,9 @@
    2.38          }
    2.39          body.append(");\n");
    2.40          body.append(
    2.41 -            "      }\n" +
    2.42 -            "      @Override\n" +
    2.43 -            "      public void onError(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n" +
    2.44 -            "        Exception value = ev.getException();\n"
    2.45 +            "        return;\n" +
    2.46 +            "      } else if (type == 2) { /* on error */\n" +
    2.47 +            "        Exception value = (Exception)data;\n"
    2.48              );
    2.49          if (onR.onError().isEmpty()) {
    2.50              body.append(
    2.51 @@ -1170,16 +1167,16 @@
    2.52                  return true;
    2.53              }
    2.54              body.append("        ").append(clazz.getSimpleName()).append(".").append(onR.onError()).append("(");
    2.55 -            body.append(className).append(".this, value);\n");
    2.56 +            body.append("model, value);\n");
    2.57          }
    2.58          body.append(
    2.59 -            "      }\n" +
    2.60 -            "      @Override\n" +
    2.61 -            "      public void onMessage(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n"
    2.62 +            "        return;\n" +
    2.63 +            "      } else if (type == 1) {\n" +
    2.64 +            "        Object[] ev = (Object[])data;\n"
    2.65          );
    2.66          if (expectsList) {
    2.67              body.append(
    2.68 -                "        " + modelClass + "[] arr = new " + modelClass + "[ev.dataSize()];\n"
    2.69 +                "        " + modelClass + "[] arr = new " + modelClass + "[ev.length];\n"
    2.70                  );
    2.71          } else {
    2.72              body.append(
    2.73 @@ -1187,8 +1184,8 @@
    2.74                  );
    2.75          }
    2.76          body.append(
    2.77 -            "        ev.dataRead(proto.getContext(), " + modelClass + ".class, arr);\n"
    2.78 -            );
    2.79 +            "        TYPE.copyJSON(model.proto.getContext(), ev, " + modelClass + ".class, arr);\n"
    2.80 +        );
    2.81          {
    2.82              body.append("        ").append(clazz.getSimpleName()).append(".").append(n).append("(");
    2.83              String sep = "";
    2.84 @@ -1200,28 +1197,26 @@
    2.85              body.append(");\n");
    2.86          }
    2.87          body.append(
    2.88 -            "      }\n"
    2.89 +            "        return;\n" +
    2.90 +            "      }"
    2.91          );
    2.92          if (!onR.onError().isEmpty()) {
    2.93 +            body.append(" else if (type == 3) { /* on close */\n");
    2.94 +            body.append("        ").append(clazz.getSimpleName()).append(".").append(onR.onError()).append("(");
    2.95 +            body.append("model, null);\n");
    2.96              body.append(
    2.97 -                "      @Override\n"
    2.98 -              + "      public void onClose(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n"
    2.99 -            );
   2.100 -            body.append("        ").append(clazz.getSimpleName()).append(".").append(onR.onError()).append("(");
   2.101 -            body.append(className).append(".this, null);\n");
   2.102 -            body.append(
   2.103 -                "      }\n"
   2.104 +                "      }"
   2.105              );
   2.106          }
   2.107 +        body.append("\n");
   2.108          body.append("    }\n");
   2.109 -        body.append("    if (this.ws_").append(e.getSimpleName()).append(" == null) {\n");
   2.110 -        body.append("      ProcessResult pr = new ProcessResult();\n");
   2.111 -        body.append("      this.ws_").append(e.getSimpleName());
   2.112 -        body.append("= org.netbeans.html.json.impl.JSON.openWS(proto.getContext(), pr,\n        ");
   2.113 -        body.append(urlBefore).append(", data);\n");
   2.114 -        body.append("    } else {\n");
   2.115 -        body.append("      this.ws_").append(e.getSimpleName()).append(".send(proto.getContext(), ").append(urlBefore).append(", data);\n");
   2.116 -        body.append("    }\n");
   2.117 +        method.append("    if (this.ws_").append(e.getSimpleName()).append(" == null) {\n");
   2.118 +        method.append("      this.ws_").append(e.getSimpleName());
   2.119 +        method.append("= proto.wsOpen(" + index + ", ");
   2.120 +        method.append(urlBefore).append(", data);\n");
   2.121 +        method.append("    } else {\n");
   2.122 +        method.append("      proto.wsSend(this.ws_").append(e.getSimpleName()).append(", ").append(urlBefore).append(", data);\n");
   2.123 +        method.append("    }\n");
   2.124          return false;
   2.125      }
   2.126