# HG changeset patch # User Jaroslav Tulach # Date 1365177323 -7200 # Node ID 6fe5b2b4b82ede14a8952dcd2860243d9dcd9c57 # Parent 2cd6f67472c4066338d4565b937e3eee29d9a363 @OnReceive is more ready to receive an array of values diff -r 2cd6f67472c4 -r 6fe5b2b4b82e javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Fri Apr 05 15:17:54 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Fri Apr 05 17:55:23 2013 +0200 @@ -46,6 +46,8 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; @@ -752,21 +754,36 @@ return false; } String modelClass = null; + boolean expectsList = false; List args = new ArrayList<>(); { for (VariableElement ve : e.getParameters()) { + TypeMirror modelType = null; if (ve.asType().toString().equals(className)) { args.add(className + ".this"); } else if (isModel(ve.asType())) { + modelType = ve.asType(); + } else if (ve.asType().getKind() == TypeKind.ARRAY) { + modelType = ((ArrayType)ve.asType()).getComponentType(); + expectsList = true; + } + if (modelType != null) { if (modelClass != null) { err().printMessage(Diagnostic.Kind.ERROR, "There can be only one model class among arguments", e); } else { - modelClass = ve.asType().toString(); - args.add("new " + modelClass + "(value)"); + modelClass = modelType.toString(); + if (expectsList) { + args.add("arr"); + } else { + args.add("arr[0]"); + } } } } } + if (modelClass == null) { + err().printMessage(Diagnostic.Kind.ERROR, "The method needs to have one @Model class as parameter", e); + } String n = e.getSimpleName().toString(); body.append("public void ").append(n).append("("); StringBuilder assembleURL = new StringBuilder(); @@ -784,10 +801,21 @@ " class ProcessResult implements Runnable {\n" + " @Override\n" + " public void run() {\n" + - " Object value = result[0];\n" + + " Object value = result[0];\n"); + body.append( + " " + modelClass + "[] arr;\n"); + body.append( " if (value instanceof Object[]) {\n" + - " value = ((Object[])value)[0];\n" + - " } "); + " Object[] data = ((Object[])value);\n" + + " arr = new " + modelClass + "[data.length];\n" + + " for (int i = 0; i < data.length; i++) {\n" + + " arr[i] = new " + modelClass + "(value);\n" + + " }\n" + + " } else {\n" + + " arr = new " + modelClass + "[1];\n" + + " arr[0] = new " + modelClass + "(value);\n" + + " }\n" + ); { body.append(clazz.getSimpleName()).append(".").append(n).append("("); String sep = ""; diff -r 2cd6f67472c4 -r 6fe5b2b4b82e javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Fri Apr 05 15:17:54 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Fri Apr 05 17:55:23 2013 +0200 @@ -17,7 +17,9 @@ */ package org.apidesign.bck2brwsr.htmlpage; +import java.util.Arrays; import java.util.Iterator; +import java.util.List; import org.apidesign.bck2brwsr.htmlpage.api.OnReceive; import org.apidesign.bck2brwsr.htmlpage.api.Page; import org.apidesign.bck2brwsr.htmlpage.api.Property; @@ -36,7 +38,8 @@ * @author Jaroslav Tulach */ @Page(xhtml = "Empty.html", className = "JSONik", properties = { - @Property(name = "fetched", type = PersonImpl.class) + @Property(name = "fetched", type = PersonImpl.class), + @Property(name = "fetchedCount", type = int.class) }) public class JSONTest { @@ -125,6 +128,13 @@ model.setFetched(p); throw new IllegalStateException("Got him: " + p); } + + @OnReceive(url="/{url}") + static void fetchArray(Person[] p, JSONik model) { + model.setFetchedCount(p.length); + model.setFetched(p[0]); + throw new IllegalStateException("Got in array him: " + Arrays.asList(p)); + } @Http(@Http.Resource( content = "{'firstName': 'Sitar', 'sex': 'MALE'}", @@ -149,11 +159,33 @@ } @Http(@Http.Resource( + content = "{'firstName': 'Sitar', 'sex': 'MALE'}", + path="/person.json", + mimeType = "application/json" + )) + @BrwsrTest public void loadAndParseJSONSentToArray() { + JSONik js = new JSONik(); + js.applyBindings(); + + js.fetchArray("person.json"); + + Person p = null; + for (int i = 0; i < 10000000; i++) { + if (js.getFetched() != null) { + p = js.getFetched(); + } + } + assert p != null : "We should get our person back: " + p; + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName(); + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + } + + @Http(@Http.Resource( content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}]", path="/person.json", mimeType = "application/json" )) - @BrwsrTest public void loadAndParseJSONArray() { + @BrwsrTest public void loadAndParseJSONArraySingle() { JSONik js = new JSONik(); js.applyBindings(); @@ -170,6 +202,33 @@ assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); } + + @Http(@Http.Resource( + content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}" + + "{'firstName': 'Peter', 'sex': 'MALE'}" + + "]", + path="/person.json", + mimeType = "application/json" + )) + @BrwsrTest public void loadAndParseJSONArray() { + JSONik js = new JSONik(); + js.applyBindings(); + + js.fetchArray("person.json"); + + Person p = null; + for (int i = 0; i < 10000000; i++) { + if (js.getFetched() != null) { + p = js.getFetched(); + } + } + + assert js.getFetchedCount() == 2 : "We got two values: " + js.getFetchedCount(); + assert p != null : "We should get our person back: " + p; + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName(); + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + } + @Factory public static Object[] create() { return VMTest.create(JSONTest.class); }