@OnReceive is more ready to receive an array of values model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 05 Apr 2013 17:55:23 +0200
branchmodel
changeset 9366fe5b2b4b82e
parent 935 2cd6f67472c4
child 937 d9e692ece653
@OnReceive is more ready to receive an array of values
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java
     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      }