One can made changes in an array without initializing the 'ko' pair object
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 01 Sep 2013 06:52:02 +0000
changeset 27896d0e3799ba2
parent 277 285765af17f0
child 279 539d268a7fec
One can made changes in an array without initializing the 'ko' pair object
json/src/main/java/org/apidesign/html/json/impl/JSONList.java
json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java
json/src/test/java/net/java/html/json/ModelTest.java
json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java
     1.1 --- a/json/src/main/java/org/apidesign/html/json/impl/JSONList.java	Sat Aug 31 17:06:18 2013 +0000
     1.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/JSONList.java	Sun Sep 01 06:52:02 2013 +0000
     1.3 @@ -32,10 +32,12 @@
     1.4  public final class JSONList<T> extends ArrayList<T> {
     1.5      private final String name;
     1.6      private final String[] deps;
     1.7 -    private Bindings model;
     1.8 +    private Bindings[] model;
     1.9      private Runnable onchange;
    1.10  
    1.11 -    public JSONList(String name, String... deps) {
    1.12 +    public JSONList(Bindings[] model, String name, String... deps) {
    1.13 +        assert model.length == 1;
    1.14 +        this.model = model;
    1.15          this.name = name;
    1.16          this.deps = deps;
    1.17      }
    1.18 @@ -44,23 +46,12 @@
    1.19          if (values == null || values.length == 0) {
    1.20              return;
    1.21          }
    1.22 -        if (this.model != null || !isEmpty()) {
    1.23 +        if (this.model[0] != null || !isEmpty()) {
    1.24              throw new IllegalStateException();
    1.25          }
    1.26          super.addAll(Arrays.asList(values));
    1.27      }
    1.28  
    1.29 -    public void assign(Bindings model) {
    1.30 -        if (this.model == null && isEmpty()) {
    1.31 -            this.model = model;
    1.32 -            return;
    1.33 -        }
    1.34 -        if (this.model != model) {
    1.35 -            this.model = model;
    1.36 -            notifyChange();
    1.37 -        }
    1.38 -    }
    1.39 -
    1.40      public JSONList<T> onChange(Runnable r) {
    1.41          if (this.onchange != null) {
    1.42              throw new IllegalStateException();
    1.43 @@ -157,7 +148,7 @@
    1.44      }
    1.45  
    1.46      private void notifyChange() {
    1.47 -        Bindings m = model;
    1.48 +        Bindings m = model[0];
    1.49          if (m != null) {
    1.50              m.valueHasMutated(name);
    1.51              for (String dependant : deps) {
    1.52 @@ -189,6 +180,6 @@
    1.53      }
    1.54  
    1.55      final Object koData() {
    1.56 -        return koData(this, model);
    1.57 +        return koData(this, model[0]);
    1.58      }
    1.59  }
     2.1 --- a/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Sat Aug 31 17:06:18 2013 +0000
     2.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Sun Sep 01 06:52:02 2013 +0000
     2.3 @@ -193,7 +193,7 @@
     2.4                  w.append("public final class ").append(className).append(" implements Cloneable {\n");
     2.5                  w.append("  private boolean locked;\n");
     2.6                  w.append("  private net.java.html.BrwsrCtx context;\n");
     2.7 -                w.append("  private org.apidesign.html.json.impl.Bindings ko;\n");
     2.8 +                w.append("  private org.apidesign.html.json.impl.Bindings[] ko = { null };\n");
     2.9                  w.append(body.toString());
    2.10                  w.append("  private static Class<" + inPckName(e) + "> modelFor() { return null; }\n");
    2.11                  w.append("  private ").append(className).append("(net.java.html.BrwsrCtx context) {\n");
    2.12 @@ -249,12 +249,12 @@
    2.13                  }
    2.14                  w.append("  };\n");
    2.15                  w.append("  private org.apidesign.html.json.impl.Bindings intKnckt() {\n");
    2.16 -                w.append("    if (ko != null) return ko;\n");
    2.17 -                w.append("    ko = org.apidesign.html.json.impl.Bindings.apply(context, this);\n");
    2.18 +                w.append("    if (ko[0] != null) return ko[0];\n");
    2.19 +                w.append("    ko[0] = org.apidesign.html.json.impl.Bindings.apply(context, this);\n");
    2.20                  {
    2.21                      w.append("    org.apidesign.html.json.spi.PropertyBinding[] propArr = {\n");
    2.22                      for (int i = 0; i < propsGetSet.size(); i += 5) {
    2.23 -                        w.append("      ko.registerProperty(\"").append(propsGetSet.get(i)).append("\", this, new P(");
    2.24 +                        w.append("      ko[0].registerProperty(\"").append(propsGetSet.get(i)).append("\", this, new P(");
    2.25                          w.append((i / 5) + "), " + (propsGetSet.get(i + 2) == null) + "),\n");
    2.26                      }
    2.27                      w.append("    };\n");
    2.28 @@ -262,13 +262,13 @@
    2.29                  {
    2.30                      w.append("    org.apidesign.html.json.spi.FunctionBinding[] funcArr = {\n");
    2.31                      for (int i = 0; i < functions.size(); i += 2) {
    2.32 -                        w.append("      ko.registerFunction(\"").append(functions.get(i)).append("\", this, new P(");
    2.33 +                        w.append("      ko[0].registerFunction(\"").append(functions.get(i)).append("\", this, new P(");
    2.34                          w.append((i / 2) + ")),\n");
    2.35                      }
    2.36                      w.append("    };\n");
    2.37                  }
    2.38 -                w.append("    ko.finish(this, propArr, funcArr);\n");
    2.39 -                w.append("    return ko;\n");
    2.40 +                w.append("    ko[0].finish(this, propArr, funcArr);\n");
    2.41 +                w.append("    return ko[0];\n");
    2.42                  w.append("  };\n");
    2.43                  w.append("  private static final class P implements org.apidesign.html.json.impl.SetAndGet<" + className + ">,\n");
    2.44                  w.append("  org.apidesign.html.json.impl.Callback<" + className + ">,\n");
    2.45 @@ -442,7 +442,7 @@
    2.46              String castTo;
    2.47              
    2.48              if (p.array()) {
    2.49 -                w.write("  private org.apidesign.html.json.impl.JSONList<" + tn + "> prop_" + p.name() + " = new org.apidesign.html.json.impl.JSONList<" + tn + ">(\""
    2.50 +                w.write("  private org.apidesign.html.json.impl.JSONList<" + tn + "> prop_" + p.name() + " = new org.apidesign.html.json.impl.JSONList<" + tn + ">(ko, \""
    2.51                      + p.name() + "\"");
    2.52                  Collection<String> dependants = deps.get(p.name());
    2.53                  if (dependants != null) {
    2.54 @@ -468,7 +468,6 @@
    2.55                  castTo = "java.util.List";
    2.56                  w.write("  public java.util.List<" + tn + "> " + gs[0] + "() {\n");
    2.57                  w.write("    if (locked) throw new IllegalStateException();\n");
    2.58 -                w.write("    prop_" + p.name() + ".assign(this.intKnckt());\n");
    2.59                  w.write("    return prop_" + p.name() + ";\n");
    2.60                  w.write("  }\n");
    2.61              } else {
     3.1 --- a/json/src/test/java/net/java/html/json/ModelTest.java	Sat Aug 31 17:06:18 2013 +0000
     3.2 +++ b/json/src/test/java/net/java/html/json/ModelTest.java	Sun Sep 01 06:52:02 2013 +0000
     3.3 @@ -75,7 +75,16 @@
     3.4          assertEquals(model.getNames().size(), 1, "One element");
     3.5      }
     3.6  
     3.7 +    @Test public void arrayChangesNotNotifiedUntilInitied() {
     3.8 +        model.getNames().add("Hello");
     3.9 +        assertTrue(my.mutated.isEmpty(), "No change now " + my.mutated);
    3.10 +        model.getNames().remove("Hello");
    3.11 +        assertTrue(my.mutated.isEmpty(), "No change still " + my.mutated);
    3.12 +        assertTrue(model.getNames().isEmpty(), "No empty");
    3.13 +    }
    3.14 +    
    3.15      @Test public void arrayChangesNotified() {
    3.16 +        model.applyBindings();
    3.17          model.getNames().add("Hello");
    3.18          
    3.19          assertFalse(my.mutated.isEmpty(), "There was a change" + my.mutated);
    3.20 @@ -216,6 +225,9 @@
    3.21  
    3.22      @Test public void changeInArray() {
    3.23          model.getValues().add(10);
    3.24 +        assertNull(model.getChangedProperty(), "No change before applyBindings");
    3.25 +        model.applyBindings();
    3.26 +        model.getValues().add(10);
    3.27          assertEquals(model.getChangedProperty(), "values", "Something added into the array");
    3.28      }
    3.29      
     4.1 --- a/json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java	Sat Aug 31 17:06:18 2013 +0000
     4.2 +++ b/json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java	Sun Sep 01 06:52:02 2013 +0000
     4.3 @@ -70,8 +70,7 @@
     4.4          p.setLastName("2");
     4.5          p.setSex(Sex.MALE);
     4.6          
     4.7 -        People people = Models.bind(new People(), c);
     4.8 -        people.getInfo().add(p);
     4.9 +        People people = Models.bind(new People(p), c).applyBindings();
    4.10          assertEquals(people.getInfo().toString(), "[{\"firstName\":\"1\",\"lastName\":\"2\",\"sex\":\"MALE\"}]", "Converted to real JSON");
    4.11          
    4.12          PropertyBinding pb = bindings.get("info");
    4.13 @@ -87,7 +86,7 @@
    4.14      @Test public void testNicknames() {
    4.15          BrwsrCtx c = Contexts.newBuilder().register(Technology.class, this, 1).build();
    4.16          
    4.17 -        People people = Models.bind(new People(), c);
    4.18 +        People people = Models.bind(new People(), c).applyBindings();
    4.19          people.getNicknames().add("One");
    4.20          people.getNicknames().add("Two");
    4.21          
    4.22 @@ -111,9 +110,9 @@
    4.23          p.setLastName("2");
    4.24          p.setSex(Sex.MALE);
    4.25          
    4.26 -        People people = Models.bind(new People(), c);
    4.27 +        People people = Models.bind(new People(), c).applyBindings();
    4.28          people.getInfo().add(p);
    4.29 -
    4.30 +        
    4.31          Object real = WrapperObject.find(people.getInfo());
    4.32          assertEquals(real, this, "I am the model of the array");
    4.33      }
    4.34 @@ -122,7 +121,7 @@
    4.35          this.replaceArray = true;
    4.36          BrwsrCtx c = Contexts.newBuilder().register(Technology.class, this, 1).build();
    4.37          
    4.38 -        People p = Models.bind(new People(), c);
    4.39 +        People p = Models.bind(new People(), c).applyBindings();
    4.40          p.getAge().add(30);
    4.41          
    4.42          PropertyBinding pb = bindings.get("age");