Search in sources :

Example 6 with ListAddChange

use of com.vaadin.flow.internal.change.ListAddChange in project flow by vaadin.

the class StateNodeNodeListTest method testChangesAfterReset.

@Test
public void testChangesAfterReset() {
    StateNode value1 = StateNodeTest.createEmptyNode("value1");
    StateNode value2 = StateNodeTest.createEmptyNode("value2");
    nodeList.add(value1);
    nodeList.add(value2);
    nodeList.getNode().clearChanges();
    nodeList.generateChangesFromEmpty();
    List<NodeChange> changes = collectChanges(nodeList);
    Assert.assertEquals(1, changes.size());
    ListAddChange<?> change = (ListAddChange<?>) changes.get(0);
    Assert.assertEquals(0, change.getIndex());
    Assert.assertEquals(Arrays.asList(value1, value2), change.getNewItems());
}
Also used : NodeChange(com.vaadin.flow.internal.change.NodeChange) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) StateNode(com.vaadin.flow.internal.StateNode) Test(org.junit.Test) StateNodeTest(com.vaadin.flow.internal.StateNodeTest)

Example 7 with ListAddChange

use of com.vaadin.flow.internal.change.ListAddChange in project flow by vaadin.

the class NodeList method collectChanges.

@Override
public void collectChanges(Consumer<NodeChange> collector) {
    // This map contains items wrapped by AbstractListChanges as keys and
    // index in the following allChanges list as a value (it allows to get
    // AbstractListChange by the index)
    Map<Object, Integer> indices = new IdentityHashMap<>();
    // This list contains all changes in the tracker. These changes will be
    // modified: each "remove" change following by a corresponding "add"
    // will be replaced by null and "add" will be adjusted. Indeces in
    // changes in between will be adjusted
    List<AbstractListChange<T>> allChanges = new ArrayList<>();
    int index = 0;
    for (AbstractListChange<T> change : getChangeTracker()) {
        if (change instanceof ListRemoveChange<?>) {
            // the remove change => find an appropriate "add" event, adjust
            // it and adjust everything in between
            adjustChanges(index, (ListRemoveChange<T>) change, indices, allChanges);
        } else if (change instanceof ListAddChange<?>) {
            allChanges.add(change);
            int i = index;
            // put all items into "indeces" as keys and "index" as a value
            // so that the "change" can be retrieved from the "allChanges"
            // by the index
            ((ListAddChange<T>) change).getNewItems().forEach(item -> indices.put(item, i));
        } else if (change instanceof ListClearChange<?>) {
            allChanges.add(change);
        } else {
            assert false : "AbstractListChange has only three subtypes: add, remove and clear";
        }
        index++;
    }
    List<AbstractListChange<T>> changes = allChanges.stream().filter(this::acceptChange).collect(Collectors.toList());
    if (isPopulated) {
        changes.forEach(collector);
    } else {
        if (changes.isEmpty()) {
            collector.accept(new EmptyChange(this));
        } else {
            changes.forEach(collector);
        }
        isPopulated = true;
    }
}
Also used : IdentityHashMap(java.util.IdentityHashMap) StateNode(com.vaadin.flow.internal.StateNode) Iterator(java.util.Iterator) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) Collection(java.util.Collection) AbstractSet(java.util.AbstractSet) Set(java.util.Set) Collectors(java.util.stream.Collectors) Serializable(java.io.Serializable) ArrayList(java.util.ArrayList) ListClearChange(com.vaadin.flow.internal.change.ListClearChange) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange) Consumer(java.util.function.Consumer) NodeChange(com.vaadin.flow.internal.change.NodeChange) List(java.util.List) Map(java.util.Map) AbstractListChange(com.vaadin.flow.internal.change.AbstractListChange) EmptyChange(com.vaadin.flow.internal.change.EmptyChange) Collections(java.util.Collections) AbstractListChange(com.vaadin.flow.internal.change.AbstractListChange) IdentityHashMap(java.util.IdentityHashMap) ArrayList(java.util.ArrayList) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange) EmptyChange(com.vaadin.flow.internal.change.EmptyChange) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) ListClearChange(com.vaadin.flow.internal.change.ListClearChange)

Aggregations

ListAddChange (com.vaadin.flow.internal.change.ListAddChange)7 StateNode (com.vaadin.flow.internal.StateNode)6 StateNodeTest (com.vaadin.flow.internal.StateNodeTest)5 Test (org.junit.Test)5 NodeChange (com.vaadin.flow.internal.change.NodeChange)4 AbstractNodeFeatureTest (com.vaadin.flow.internal.nodefeature.AbstractNodeFeatureTest)3 JsonObject (elemental.json.JsonObject)3 ListRemoveChange (com.vaadin.flow.internal.change.ListRemoveChange)2 AbstractListChange (com.vaadin.flow.internal.change.AbstractListChange)1 EmptyChange (com.vaadin.flow.internal.change.EmptyChange)1 ListClearChange (com.vaadin.flow.internal.change.ListClearChange)1 JsonArray (elemental.json.JsonArray)1 Serializable (java.io.Serializable)1 AbstractSet (java.util.AbstractSet)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 IdentityHashMap (java.util.IdentityHashMap)1 Iterator (java.util.Iterator)1 List (java.util.List)1