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");