#254882: More optimal event delivery when Proto.replaceValue(List, ...) is called.
authorJaroslav Tulach <jtulach@netbeans.org>
Mon, 31 Aug 2015 22:27:33 +0200
changeset 970b686eead871e
parent 969 9f78f761efb6
child 971 aec1ee0d2049
#254882: More optimal event delivery when Proto.replaceValue(List, ...) is called.
json/src/main/java/org/netbeans/html/json/impl/JSONList.java
json/src/main/java/org/netbeans/html/json/spi/Proto.java
json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java
     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  }