]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add simple data add/remove support to DataProvider
authorTeemu Suo-Anttila <teemusa@vaadin.com>
Fri, 29 Jan 2016 13:51:33 +0000 (15:51 +0200)
committerTeemu Suo-Anttila <teemusa@vaadin.com>
Tue, 2 Feb 2016 16:22:57 +0000 (18:22 +0200)
Removal is currently based on the content of the object. Multiple
objects with same content will cause problems. This should be fixed by
adding a simple key mapping for objects.

Change-Id: Ie6fd1c6bcb7e8eaa73469f8f794f5365b1590fe2

client/src/com/vaadin/client/connectors/data/typed/DataSourceConnector.java
server/src/com/vaadin/server/communication/data/typed/DataProvider.java
shared/src/com/vaadin/shared/data/DataProviderClientRpc.java
uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderUI.java
uitest/src/com/vaadin/tests/widgetset/client/dataprovider/DummyDataConnector.java

index bfd0a30ff1764d4dace082da2239a10f8a63125a..a2fc1db8e63521a64006492315076e7c0810189f 100644 (file)
@@ -61,6 +61,22 @@ public class DataSourceConnector extends AbstractExtensionConnector {
                     }
                 }
             }
+
+            @Override
+            public void add(JsonObject dataObject) {
+                ds.asList().add(dataObject);
+            }
+
+            @Override
+            public void drop(JsonObject dataObject) {
+                List<JsonObject> l = ds.asList();
+                for (int i = 0; i < l.size(); ++i) {
+                    if (l.get(i).toJson().equals(dataObject.toJson())) {
+                        l.remove(i);
+                        return;
+                    }
+                }
+            }
         });
 
         ServerConnector parent = getParent();
index 60cf17ab579b8ade3c8d35142648864b49016ac9..41cdb95dba090d39a4c2d37801e02437acccb107 100644 (file)
@@ -79,6 +79,7 @@ public class DataProvider<T> extends AbstractExtension {
 
     private Collection<T> data;
     private Collection<TypedDataGenerator<T>> generators = new LinkedHashSet<TypedDataGenerator<T>>();
+    private DataProviderClientRpc rpc;
 
     /**
      * Creates a new DataProvider with the given Collection.
@@ -88,6 +89,8 @@ public class DataProvider<T> extends AbstractExtension {
      */
     protected DataProvider(Collection<T> data) {
         this.data = data;
+
+        rpc = getRpcProxy(DataProviderClientRpc.class);
         registerRpc(createRpc());
     }
 
@@ -142,7 +145,7 @@ public class DataProvider<T> extends AbstractExtension {
             data.set(i++, getDataObject(item));
         }
 
-        getRpcProxy(DataProviderClientRpc.class).setData(firstIndex, data);
+        rpc.setData(firstIndex, data);
     }
 
     /**
@@ -173,4 +176,25 @@ public class DataProvider<T> extends AbstractExtension {
         return new DataRequestRpcImpl();
     }
 
+    /**
+     * Informs the DataProvider that an item has been added. It is assumed to be
+     * the last item in the collection.
+     * 
+     * @param item
+     *            item added to collection
+     */
+    public void add(T item) {
+        rpc.add(getDataObject(item));
+    }
+
+    /**
+     * Informs the DataProvider that an item has been removed.
+     * 
+     * @param item
+     *            item removed from collection
+     */
+    public void remove(T item) {
+        rpc.drop(getDataObject(item));
+    }
+
 }
index 94010e5acab61a6f059259befcec98cbb22bb801..de23e1c3eda17457909b5894adfe6d219e2a1bb3 100644 (file)
@@ -18,6 +18,7 @@ package com.vaadin.shared.data;
 import com.vaadin.shared.communication.ClientRpc;
 
 import elemental.json.JsonArray;
+import elemental.json.JsonObject;
 
 /**
  * RPC interface used by DataProvider to send data to the client-side.
@@ -48,4 +49,21 @@ public interface DataProviderClientRpc extends ClientRpc {
      */
     void setData(long firstIndex, JsonArray data);
 
+    /**
+     * Adds a new data object to the client-side DataSource. The new data object
+     * is added at the end of the data source.
+     * 
+     * @param dataObject
+     *            single added data object
+     */
+    void add(JsonObject dataObject);
+
+    /**
+     * Removes data from the client-side DataSource.
+     * 
+     * @param dataObject
+     *            single removed data object
+     */
+    void drop(JsonObject dataObject);
+
 }
index 85ff2e7398e3439859fbc1ebb82b3529194c456f..62aa8c2241583e8ba4589ad32bda535adf97ac48 100644 (file)
@@ -15,8 +15,9 @@
  */
 package com.vaadin.tests.dataprovider;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Random;
 
 import com.vaadin.annotations.Widgetset;
@@ -27,6 +28,10 @@ import com.vaadin.tests.components.AbstractTestUI;
 import com.vaadin.tests.fieldgroup.ComplexPerson;
 import com.vaadin.tests.widgetset.TestingWidgetSet;
 import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalLayout;
 
 import elemental.json.JsonObject;
 
@@ -36,8 +41,10 @@ public class DummyDataProviderUI extends AbstractTestUI {
     public static class DummyDataComponent extends AbstractComponent {
 
         private DataProvider<ComplexPerson> dataProvider;
+        private Collection<ComplexPerson> data;
 
         public DummyDataComponent(Collection<ComplexPerson> data) {
+            this.data = data;
             dataProvider = DataProvider.create(data, this);
             dataProvider
                     .addDataGenerator(new TypedDataGenerator<ComplexPerson>() {
@@ -52,16 +59,47 @@ public class DummyDataProviderUI extends AbstractTestUI {
                     });
         }
 
+        void addItem(ComplexPerson person) {
+            if (data.add(person)) {
+                dataProvider.add(person);
+            }
+        }
+
+        void removeItem(ComplexPerson person) {
+            if (data.remove(person)) {
+                dataProvider.remove(person);
+            }
+        }
     }
 
+    private Random r = new Random(1337);
+    private List<ComplexPerson> persons = getPersons(20);
+    private DummyDataComponent dummy;
+
     @Override
     protected void setup(VaadinRequest request) {
-        addComponent(new DummyDataComponent(getPersons(20)));
+        dummy = new DummyDataComponent(persons);
+
+        Button remove = new Button("Remove third", new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                dummy.removeItem(persons.get(2));
+            }
+        });
+        Button add = new Button("Add new", new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                dummy.addItem(ComplexPerson.create(r));
+            }
+        });
+        addComponent(new HorizontalLayout(add, remove));
+        addComponent(dummy);
     }
 
-    private Collection<ComplexPerson> getPersons(int count) {
-        Random r = new Random(1337);
-        Collection<ComplexPerson> c = new LinkedHashSet<ComplexPerson>();
+    private List<ComplexPerson> getPersons(int count) {
+        List<ComplexPerson> c = new ArrayList<ComplexPerson>();
         for (int i = 0; i < count; ++i) {
             c.add(ComplexPerson.create(r));
         }
index 4733026bd72ac4af71ca543a9fded081369091ab..c64f30ab572fc5958092f4355e1b3a588c618afc 100644 (file)
@@ -47,6 +47,13 @@ public class DummyDataConnector extends AbstractComponentConnector implements
         dataSource = ds;
         dataSource.setDataChangeHandler(new AbstractDataChangeHandler() {
 
+            @Override
+            public void dataRemoved(int firstRowIndex, int numberOfRows) {
+                for (int i = 0; i < numberOfRows; ++i) {
+                    getWidget().remove(firstRowIndex);
+                }
+            }
+
             @Override
             public void dataAdded(int firstRowIndex, int numberOfRows) {
                 for (int i = 0; i < numberOfRows; ++i) {
@@ -57,5 +64,4 @@ public class DummyDataConnector extends AbstractComponentConnector implements
             }
         });
     }
-
 }