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 = "";
2.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Fri Apr 05 15:17:54 2013 +0200
2.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Fri Apr 05 17:55:23 2013 +0200
2.3 @@ -17,7 +17,9 @@
2.4 */
2.5 package org.apidesign.bck2brwsr.htmlpage;
2.6
2.7 +import java.util.Arrays;
2.8 import java.util.Iterator;
2.9 +import java.util.List;
2.10 import org.apidesign.bck2brwsr.htmlpage.api.OnReceive;
2.11 import org.apidesign.bck2brwsr.htmlpage.api.Page;
2.12 import org.apidesign.bck2brwsr.htmlpage.api.Property;
2.13 @@ -36,7 +38,8 @@
2.14 * @author Jaroslav Tulach <jtulach@netbeans.org>
2.15 */
2.16 @Page(xhtml = "Empty.html", className = "JSONik", properties = {
2.17 - @Property(name = "fetched", type = PersonImpl.class)
2.18 + @Property(name = "fetched", type = PersonImpl.class),
2.19 + @Property(name = "fetchedCount", type = int.class)
2.20 })
2.21 public class JSONTest {
2.22
2.23 @@ -125,6 +128,13 @@
2.24 model.setFetched(p);
2.25 throw new IllegalStateException("Got him: " + p);
2.26 }
2.27 +
2.28 + @OnReceive(url="/{url}")
2.29 + static void fetchArray(Person[] p, JSONik model) {
2.30 + model.setFetchedCount(p.length);
2.31 + model.setFetched(p[0]);
2.32 + throw new IllegalStateException("Got in array him: " + Arrays.asList(p));
2.33 + }
2.34
2.35 @Http(@Http.Resource(
2.36 content = "{'firstName': 'Sitar', 'sex': 'MALE'}",
2.37 @@ -149,11 +159,33 @@
2.38 }
2.39
2.40 @Http(@Http.Resource(
2.41 + content = "{'firstName': 'Sitar', 'sex': 'MALE'}",
2.42 + path="/person.json",
2.43 + mimeType = "application/json"
2.44 + ))
2.45 + @BrwsrTest public void loadAndParseJSONSentToArray() {
2.46 + JSONik js = new JSONik();
2.47 + js.applyBindings();
2.48 +
2.49 + js.fetchArray("person.json");
2.50 +
2.51 + Person p = null;
2.52 + for (int i = 0; i < 10000000; i++) {
2.53 + if (js.getFetched() != null) {
2.54 + p = js.getFetched();
2.55 + }
2.56 + }
2.57 + assert p != null : "We should get our person back: " + p;
2.58 + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName();
2.59 + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
2.60 + }
2.61 +
2.62 + @Http(@Http.Resource(
2.63 content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}]",
2.64 path="/person.json",
2.65 mimeType = "application/json"
2.66 ))
2.67 - @BrwsrTest public void loadAndParseJSONArray() {
2.68 + @BrwsrTest public void loadAndParseJSONArraySingle() {
2.69 JSONik js = new JSONik();
2.70 js.applyBindings();
2.71
2.72 @@ -170,6 +202,33 @@
2.73 assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
2.74 }
2.75
2.76 +
2.77 + @Http(@Http.Resource(
2.78 + content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}"
2.79 + + "{'firstName': 'Peter', 'sex': 'MALE'}"
2.80 + + "]",
2.81 + path="/person.json",
2.82 + mimeType = "application/json"
2.83 + ))
2.84 + @BrwsrTest public void loadAndParseJSONArray() {
2.85 + JSONik js = new JSONik();
2.86 + js.applyBindings();
2.87 +
2.88 + js.fetchArray("person.json");
2.89 +
2.90 + Person p = null;
2.91 + for (int i = 0; i < 10000000; i++) {
2.92 + if (js.getFetched() != null) {
2.93 + p = js.getFetched();
2.94 + }
2.95 + }
2.96 +
2.97 + assert js.getFetchedCount() == 2 : "We got two values: " + js.getFetchedCount();
2.98 + assert p != null : "We should get our person back: " + p;
2.99 + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName();
2.100 + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
2.101 + }
2.102 +
2.103 @Factory public static Object[] create() {
2.104 return VMTest.create(JSONTest.class);
2.105 }