javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
branchmodel
changeset 936 6fe5b2b4b82e
parent 935 2cd6f67472c4
child 941 d1e482f73507
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Fri Apr 05 15:17:54 2013 +0200
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Fri Apr 05 17:55:23 2013 +0200
     1.3 @@ -46,6 +46,8 @@
     1.4  import javax.lang.model.element.PackageElement;
     1.5  import javax.lang.model.element.TypeElement;
     1.6  import javax.lang.model.element.VariableElement;
     1.7 +import javax.lang.model.type.ArrayType;
     1.8 +import javax.lang.model.type.DeclaredType;
     1.9  import javax.lang.model.type.MirroredTypeException;
    1.10  import javax.lang.model.type.TypeKind;
    1.11  import javax.lang.model.type.TypeMirror;
    1.12 @@ -752,21 +754,36 @@
    1.13                  return false;
    1.14              }
    1.15              String modelClass = null;
    1.16 +            boolean expectsList = false;
    1.17              List<String> args = new ArrayList<>();
    1.18              {
    1.19                  for (VariableElement ve : e.getParameters()) {
    1.20 +                    TypeMirror modelType = null;
    1.21                      if (ve.asType().toString().equals(className)) {
    1.22                          args.add(className + ".this");
    1.23                      } else if (isModel(ve.asType())) {
    1.24 +                        modelType = ve.asType();
    1.25 +                    } else if (ve.asType().getKind() == TypeKind.ARRAY) {
    1.26 +                        modelType = ((ArrayType)ve.asType()).getComponentType();
    1.27 +                        expectsList = true;
    1.28 +                    }
    1.29 +                    if (modelType != null) {
    1.30                          if (modelClass != null) {
    1.31                              err().printMessage(Diagnostic.Kind.ERROR, "There can be only one model class among arguments", e);
    1.32                          } else {
    1.33 -                            modelClass = ve.asType().toString();
    1.34 -                            args.add("new " + modelClass + "(value)");
    1.35 +                            modelClass = modelType.toString();
    1.36 +                            if (expectsList) {
    1.37 +                                args.add("arr");
    1.38 +                            } else {
    1.39 +                                args.add("arr[0]");
    1.40 +                            }
    1.41                          }
    1.42                      }
    1.43                  }
    1.44              }
    1.45 +            if (modelClass == null) {
    1.46 +                err().printMessage(Diagnostic.Kind.ERROR, "The method needs to have one @Model class as parameter", e);
    1.47 +            }
    1.48              String n = e.getSimpleName().toString();
    1.49              body.append("public void ").append(n).append("(");
    1.50              StringBuilder assembleURL = new StringBuilder();
    1.51 @@ -784,10 +801,21 @@
    1.52                  "  class ProcessResult implements Runnable {\n" +
    1.53                  "    @Override\n" +
    1.54                  "    public void run() {\n" +
    1.55 -                "      Object value = result[0];\n" +
    1.56 +                "      Object value = result[0];\n");
    1.57 +            body.append(
    1.58 +                "      " + modelClass + "[] arr;\n");
    1.59 +            body.append(
    1.60                  "      if (value instanceof Object[]) {\n" +
    1.61 -                "        value = ((Object[])value)[0];\n" +
    1.62 -                "      }        ");
    1.63 +                "        Object[] data = ((Object[])value);\n" +
    1.64 +                "        arr = new " + modelClass + "[data.length];\n" +
    1.65 +                "        for (int i = 0; i < data.length; i++) {\n" +
    1.66 +                "          arr[i] = new " + modelClass + "(value);\n" +
    1.67 +                "        }\n" +
    1.68 +                "      } else {\n" +
    1.69 +                "        arr = new " + modelClass + "[1];\n" +
    1.70 +                "        arr[0] = new " + modelClass + "(value);\n" +
    1.71 +                "      }\n"
    1.72 +            );
    1.73              {
    1.74                  body.append(clazz.getSimpleName()).append(".").append(n).append("(");
    1.75                  String sep = "";