json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java
branchosgi
changeset 386 2fc4100fcd32
parent 385 68012e8398a8
child 387 972a38bebd50
     1.1 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Thu Dec 26 22:42:01 2013 +0100
     1.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Fri Jan 03 08:16:39 2014 +0100
     1.3 @@ -183,6 +183,7 @@
     1.4          models.put(e, className);
     1.5          try {
     1.6              StringWriter body = new StringWriter();
     1.7 +            StringBuilder onReceiveType = new StringBuilder();
     1.8              List<String> propsGetSet = new ArrayList<String>();
     1.9              List<String> functions = new ArrayList<String>();
    1.10              Map<String, Collection<String>> propsDeps = new HashMap<String, Collection<String>>();
    1.11 @@ -201,7 +202,7 @@
    1.12              if (!generateFunctions(e, body, className, e.getEnclosedElements(), functions)) {
    1.13                  ok = false;
    1.14              }
    1.15 -            if (!generateReceive(e, body, className, e.getEnclosedElements(), functions)) {
    1.16 +            if (!generateReceive(e, body, className, e.getEnclosedElements(), onReceiveType)) {
    1.17                  ok = false;
    1.18              }
    1.19              if (!generateOperation(e, body, className, e.getEnclosedElements())) {
    1.20 @@ -372,6 +373,7 @@
    1.21                  w.append("    }\n");
    1.22                  w.append("      throw new UnsupportedOperationException();\n");
    1.23                  w.append("    }\n");
    1.24 +                w.append(onReceiveType);
    1.25                  w.append("    @Override public " + className + " read(net.java.html.BrwsrCtx c, Object json) { return new " + className + "(c, json); }\n");
    1.26                  w.append("    @Override public " + className + " cloneTo(Object o, net.java.html.BrwsrCtx c) { return ((" + className + ")o).clone(c); }\n");
    1.27                  w.append("  }\n");
    1.28 @@ -930,8 +932,11 @@
    1.29      
    1.30      private boolean generateReceive(
    1.31          Element clazz, StringWriter body, String className, 
    1.32 -        List<? extends Element> enclosedElements, List<String> functions
    1.33 +        List<? extends Element> enclosedElements, StringBuilder inType
    1.34      ) {
    1.35 +        inType.append("  @Override public void onMessage(").append(className).append(" model, int index, int type, Object data) {\n");
    1.36 +        inType.append("    switch (index) {\n");
    1.37 +        int index = 0;
    1.38          for (Element m : enclosedElements) {
    1.39              if (m.getKind() != ElementKind.METHOD) {
    1.40                  continue;
    1.41 @@ -979,7 +984,7 @@
    1.42                          simpleName = type.toString();
    1.43                      }
    1.44                      if (simpleName.toString().equals(className)) {
    1.45 -                        args.add(className + ".this");
    1.46 +                        args.add("model");
    1.47                      } else if (isModel(ve.asType())) {
    1.48                          modelType = ve.asType();
    1.49                      } else if (ve.asType().getKind() == TypeKind.ARRAY) {
    1.50 @@ -1042,47 +1047,49 @@
    1.51              body.append(") {\n");
    1.52              boolean webSocket = onR.method().equals("WebSocket");
    1.53              if (webSocket) {
    1.54 -                if (generateWSReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    1.55 -                    return false;
    1.56 -                }
    1.57 +//                if (generateWSReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    1.58 +//                    return false;
    1.59 +//                }
    1.60                  body.append("  }\n");
    1.61                  body.append("  private org.netbeans.html.json.impl.JSON.WS ws_" + e.getSimpleName() + ";\n");
    1.62              } else {
    1.63 -                if (generateJSONReceiveBody(body, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    1.64 +                if (generateJSONReceiveBody(index++, body, inType, onR, e, clazz, className, expectsList, modelClass, n, args, urlBefore, jsonpVarName, urlAfter, dataMirror)) {
    1.65                      return false;
    1.66                  }
    1.67                  body.append("  }\n");
    1.68              }
    1.69          }
    1.70 +        inType.append("    }\n");
    1.71 +        inType.append("    throw new UnsupportedOperationException(\"index: \" + index + \" type: \" + type);\n");
    1.72 +        inType.append("  }\n");
    1.73          return true;
    1.74      }
    1.75  
    1.76 -    private boolean generateJSONReceiveBody(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) {
    1.77 +    private boolean generateJSONReceiveBody(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) {
    1.78          body.append(
    1.79 -            "    class ProcessResult extends org.netbeans.html.json.impl.RcvrJSON {\n" +
    1.80 -            "      @Override\n" +
    1.81 -            "      public void onError(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n" +
    1.82 -            "        Exception value = ev.getException();\n"
    1.83 +            "    case " + index + ": {\n" +
    1.84 +            "      if (type == 2) { /* on error */\n" +
    1.85 +            "        Exception ex = (Exception)data;\n"
    1.86              );
    1.87          if (onR.onError().isEmpty()) {
    1.88              body.append(
    1.89 -                "        value.printStackTrace();\n"
    1.90 +                "        ex.printStackTrace();\n"
    1.91                  );
    1.92          } else {
    1.93              if (!findOnError(e, ((TypeElement)clazz), onR.onError(), className)) {
    1.94                  return true;
    1.95              }
    1.96              body.append("        ").append(clazz.getSimpleName()).append(".").append(onR.onError()).append("(");
    1.97 -            body.append(className).append(".this, value);\n");
    1.98 +            body.append("model, ex);\n");
    1.99          }
   1.100          body.append(
   1.101 -            "      }\n" +
   1.102 -            "      @Override\n" +
   1.103 -            "      public void onMessage(org.netbeans.html.json.impl.RcvrJSON.MsgEvnt ev) {\n"
   1.104 +            "        return;\n" +
   1.105 +            "      } else if (type == 1) {\n" +
   1.106 +            "        Object[] ev = (Object[])data;\n"
   1.107              );
   1.108          if (expectsList) {
   1.109              body.append(
   1.110 -                "        " + modelClass + "[] arr = new " + modelClass + "[ev.dataSize()];\n"
   1.111 +                "        " + modelClass + "[] arr = new " + modelClass + "[ev.length];\n"
   1.112                  );
   1.113          } else {
   1.114              body.append(
   1.115 @@ -1090,8 +1097,8 @@
   1.116                  );
   1.117          }
   1.118          body.append(
   1.119 -            "        ev.dataRead(proto.getContext(), " + modelClass + ".class, arr);\n"
   1.120 -            );
   1.121 +            "        TYPE.copyJSON(model.proto.getContext(), ev, " + modelClass + ".class, arr);\n"
   1.122 +        );
   1.123          {
   1.124              body.append("        ").append(clazz.getSimpleName()).append(".").append(n).append("(");
   1.125              String sep = "";
   1.126 @@ -1103,28 +1110,28 @@
   1.127              body.append(");\n");
   1.128          }
   1.129          body.append(
   1.130 +            "        return;\n" +
   1.131              "      }\n" +
   1.132              "    }\n"
   1.133              );
   1.134 -        body.append("    ProcessResult pr = new ProcessResult();\n");
   1.135 -        body.append("    org.netbeans.html.json.impl.JSON.loadJSON(proto.getContext(), pr,\n        ");
   1.136 -        body.append(urlBefore).append(", ");
   1.137 +        method.append("    proto.loadJSON(" + index + ",\n        ");
   1.138 +        method.append(urlBefore).append(", ");
   1.139          if (jsonpVarName != null) {
   1.140 -            body.append(urlAfter);
   1.141 +            method.append(urlAfter);
   1.142          } else {
   1.143 -            body.append("null");
   1.144 +            method.append("null");
   1.145          }
   1.146          if (!"GET".equals(onR.method()) || dataMirror != null) {
   1.147 -            body.append(", \"").append(onR.method()).append('"');
   1.148 +            method.append(", \"").append(onR.method()).append('"');
   1.149              if (dataMirror != null) {
   1.150 -                body.append(", data");
   1.151 +                method.append(", data");
   1.152              } else {
   1.153 -                body.append(", null");
   1.154 +                method.append(", null");
   1.155              }
   1.156          } else {
   1.157 -            body.append(", null, null");
   1.158 +            method.append(", null, null");
   1.159          }
   1.160 -        body.append(");\n");
   1.161 +        method.append(");\n");
   1.162          return false;
   1.163      }
   1.164