@ComputedProperty method can really return a model class
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 09 Aug 2013 16:56:47 +0200
changeset 236c1a4be1cd7e8
parent 235 d86f1753f27a
child 237 03c9f1fb5ad4
child 238 b7e36ac77199
@ComputedProperty method can really return a model class
json-tck/src/main/java/net/java/html/json/tests/KnockoutTest.java
json-tck/src/main/java/net/java/html/json/tests/PairModel.java
json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java
     1.1 --- a/json-tck/src/main/java/net/java/html/json/tests/KnockoutTest.java	Fri Aug 09 16:50:00 2013 +0200
     1.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/KnockoutTest.java	Fri Aug 09 16:56:47 2013 +0200
     1.3 @@ -169,7 +169,53 @@
     1.4              + "</ul>\n"
     1.5          );
     1.6          try {
     1.7 -            Pair m = Models.bind(new Pair("First", "Last"), newContext());
     1.8 +            Pair m = Models.bind(new Pair("First", "Last", null), newContext());
     1.9 +            m.applyBindings();
    1.10 +
    1.11 +            int cnt = countChildren("ul");
    1.12 +            assert cnt == 2 : "Two children now, but was " + cnt;
    1.13 +
    1.14 +            triggerChildClick("ul", 1);
    1.15 +
    1.16 +            assert "Last".equals(m.getFirstName()) : "We got callback from 2nd child " + m.getFirstName();
    1.17 +        } finally {
    1.18 +            Utils.exposeHTML(KnockoutTest.class, "");
    1.19 +        }
    1.20 +    }
    1.21 +    
    1.22 +    @KOTest public void displayContentOfComputedArrayOnASubpair() throws Exception {
    1.23 +        Object exp = Utils.exposeHTML(KnockoutTest.class, 
    1.24 +              "<div data-bind='with: next'>\n"
    1.25 +            + "<ul id='ul' data-bind='foreach: bothNames'>\n"
    1.26 +            + "  <li data-bind='text: $data, click: $root.assignFirstName'/>\n"
    1.27 +            + "</ul>"
    1.28 +            + "</div>\n"
    1.29 +        );
    1.30 +        try {
    1.31 +            Pair m = Models.bind(new Pair(null, null, new Pair("First", "Last", null)), newContext());
    1.32 +            m.applyBindings();
    1.33 +
    1.34 +            int cnt = countChildren("ul");
    1.35 +            assert cnt == 2 : "Two children now, but was " + cnt;
    1.36 +
    1.37 +            triggerChildClick("ul", 1);
    1.38 +
    1.39 +            assert "Last".equals(m.getFirstName()) : "We got callback from 2nd child " + m.getFirstName();
    1.40 +        } finally {
    1.41 +            Utils.exposeHTML(KnockoutTest.class, "");
    1.42 +        }
    1.43 +    }
    1.44 +    
    1.45 +    @KOTest public void displayContentOfComputedArrayOnComputedASubpair() throws Exception {
    1.46 +        Object exp = Utils.exposeHTML(KnockoutTest.class, 
    1.47 +              "<div data-bind='with: nextOne'>\n"
    1.48 +            + "<ul id='ul' data-bind='foreach: bothNames'>\n"
    1.49 +            + "  <li data-bind='text: $data, click: $root.assignFirstName'/>\n"
    1.50 +            + "</ul>"
    1.51 +            + "</div>\n"
    1.52 +        );
    1.53 +        try {
    1.54 +            Pair m = Models.bind(new Pair(null, null, new Pair("First", "Last", null)), newContext());
    1.55              m.applyBindings();
    1.56  
    1.57              int cnt = countChildren("ul");
     2.1 --- a/json-tck/src/main/java/net/java/html/json/tests/PairModel.java	Fri Aug 09 16:50:00 2013 +0200
     2.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/PairModel.java	Fri Aug 09 16:56:47 2013 +0200
     2.3 @@ -34,6 +34,7 @@
     2.4  @Model(className = "Pair", properties = {
     2.5      @Property(name = "firstName", type = String.class),
     2.6      @Property(name = "lastName", type = String.class),
     2.7 +    @Property(name = "next", type = Pair.class)
     2.8  })
     2.9  class PairModel {
    2.10      @ComputedProperty 
    2.11 @@ -41,6 +42,11 @@
    2.12          return Arrays.asList(firstName, lastName);
    2.13      }
    2.14      
    2.15 +    @ComputedProperty
    2.16 +    static Pair nextOne(Pair next) {
    2.17 +        return next;
    2.18 +    }
    2.19 +    
    2.20      @Function 
    2.21      static void assignFirstName(Pair m, String data) {
    2.22          m.setFirstName(data);
     3.1 --- a/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Fri Aug 09 16:50:00 2013 +0200
     3.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Fri Aug 09 16:56:47 2013 +0200
     3.3 @@ -543,6 +543,8 @@
     3.4                      // OK
     3.5                  } else if (tu.isSubtype(toCheck, enumType)) {
     3.6                      // OK
     3.7 +                } else if (isModel(toCheck)) {
     3.8 +                    // OK
     3.9                  } else {
    3.10                      ok = false;
    3.11                      error(sn + " cannot return " + toCheck, e);