#254882: More optimal event delivery when Proto.replaceValue(List, ...) is called.
1.1 --- a/json/src/main/java/org/netbeans/html/json/impl/JSONList.java Sat Aug 29 01:51:36 2015 +0200
1.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/JSONList.java Mon Aug 31 22:27:33 2015 +0200
1.3 @@ -107,6 +107,12 @@
1.4 return ret;
1.5 }
1.6
1.7 + public void fastReplace(Collection<? extends T> c) {
1.8 + super.clear();
1.9 + super.addAll(c);
1.10 + notifyChange();
1.11 + }
1.12 +
1.13 @Override
1.14 public boolean remove(Object o) {
1.15 boolean ret = super.remove(o);
2.1 --- a/json/src/main/java/org/netbeans/html/json/spi/Proto.java Sat Aug 29 01:51:36 2015 +0200
2.2 +++ b/json/src/main/java/org/netbeans/html/json/spi/Proto.java Mon Aug 31 22:27:33 2015 +0200
2.3 @@ -42,6 +42,7 @@
2.4 */
2.5 package org.netbeans.html.json.spi;
2.6
2.7 +import java.util.ArrayList;
2.8 import java.util.Collection;
2.9 import java.util.List;
2.10 import net.java.html.BrwsrCtx;
2.11 @@ -880,9 +881,16 @@
2.12 } else {
2.13 newArr = new Object[] { value };
2.14 }
2.15 - arr.clear();
2.16 + List<T> tmp = new ArrayList<T>(newArr.length);
2.17 for (Object e : newArr) {
2.18 - arr.add(extractValue(type, e));
2.19 + tmp.add(extractValue(type, e));
2.20 + }
2.21 + if (arr instanceof JSONList) {
2.22 + JSONList jsList = (JSONList) arr;
2.23 + jsList.fastReplace(tmp);
2.24 + } else {
2.25 + arr.clear();
2.26 + arr.addAll(tmp);
2.27 }
2.28 }
2.29 }
3.1 --- a/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java Sat Aug 29 01:51:36 2015 +0200
3.2 +++ b/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java Mon Aug 31 22:27:33 2015 +0200
3.3 @@ -42,7 +42,9 @@
3.4 */
3.5 package org.netbeans.html.json.impl;
3.6
3.7 +import java.util.ArrayList;
3.8 import java.util.HashMap;
3.9 +import java.util.List;
3.10 import java.util.Map;
3.11 import net.java.html.BrwsrCtx;
3.12 import net.java.html.json.Model;
3.13 @@ -69,12 +71,14 @@
3.14 public class JSONListTest implements Technology<Object> {
3.15 private boolean replaceArray;
3.16 private final Map<String,PropertyBinding> bindings = new HashMap<String,PropertyBinding>();
3.17 + private final List<String> changed = new ArrayList<String>();
3.18
3.19 public JSONListTest() {
3.20 }
3.21
3.22 @BeforeMethod public void clear() {
3.23 replaceArray = false;
3.24 + changed.clear();
3.25 }
3.26
3.27 @Test public void testConvertorOnAnObject() {
3.28 @@ -162,6 +166,36 @@
3.29 assertEquals(l.toString(), "{\"names\":[\"Jarda\",\"Jirka\",\"Parda\"]}", "Properly quoted");
3.30 }
3.31
3.32 + @Test public void testChangeOnProps() {
3.33 + BrwsrCtx c = Contexts.newBuilder().register(Technology.class, this, 1).build();
3.34 +
3.35 + assertTrue(changed.isEmpty());
3.36 +
3.37 + People p = Models.bind(new People(), c).applyBindings();
3.38 + p.getAge().add(42);
3.39 +
3.40 + assertEquals(sum(p.getAge()), 42);
3.41 + assertFalse(changed.isEmpty());
3.42 + changed.clear();
3.43 +
3.44 + List<Integer> vals = new ArrayList<Integer>();
3.45 + vals.add(12);
3.46 + vals.add(30);
3.47 + ((JSONList)p.getAge()).fastReplace(vals);
3.48 +
3.49 + assertEquals(changed.size(), 1, "One change");
3.50 + assertEquals(changed.get(0), "age", "One change");
3.51 + assertEquals(sum(p.getAge()), 42);
3.52 + }
3.53 +
3.54 + private static int sum(List<Integer> arr) {
3.55 + int sum = 0;
3.56 + for (Integer i : arr) {
3.57 + sum += i;
3.58 + }
3.59 + return sum;
3.60 + }
3.61 +
3.62 @Override
3.63 public Object wrapModel(Object model) {
3.64 return this;
3.65 @@ -174,6 +208,7 @@
3.66
3.67 @Override
3.68 public void valueHasMutated(Object data, String propertyName) {
3.69 + changed.add(propertyName);
3.70 }
3.71
3.72 @Override
3.73 @@ -198,5 +233,4 @@
3.74 public void runSafe(Runnable r) {
3.75 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
3.76 }
3.77 -
3.78 }