diff options
6 files changed, 105 insertions, 2 deletions
diff --git a/client/src/com/vaadin/client/connectors/data/typed/DataSourceConnector.java b/client/src/com/vaadin/client/connectors/data/typed/DataSourceConnector.java index 1d4521c5b3..59d7f38811 100644 --- a/client/src/com/vaadin/client/connectors/data/typed/DataSourceConnector.java +++ b/client/src/com/vaadin/client/connectors/data/typed/DataSourceConnector.java @@ -98,6 +98,23 @@ public class DataSourceConnector extends AbstractExtensionConnector { sendDroppedKeys(); } } + + @Override + public void updateData(JsonArray data) { + List<JsonObject> list = ds.asList(); + for (int i = 0; i < data.length(); ++i) { + JsonObject json = data.getObject(i); + String key = getKey(json); + + if (keyToJson.containsKey(key)) { + int index = list.indexOf(keyToJson.get(key)); + list.set(index, json); + } else { + dropKey(key); + } + } + sendDroppedKeys(); + } }); ServerConnector parent = getParent(); @@ -117,8 +134,8 @@ public class DataSourceConnector extends AbstractExtensionConnector { * dropped key */ private void dropKey(String key) { + droppedKeys.add(key); if (keyToJson.containsKey(key)) { - droppedKeys.add(key); keyToJson.remove(key); } } diff --git a/server/src/com/vaadin/server/communication/data/typed/DataProvider.java b/server/src/com/vaadin/server/communication/data/typed/DataProvider.java index 9417d0a1f0..66489fe627 100644 --- a/server/src/com/vaadin/server/communication/data/typed/DataProvider.java +++ b/server/src/com/vaadin/server/communication/data/typed/DataProvider.java @@ -199,6 +199,7 @@ public class DataProvider<T> extends AbstractExtension { private Collection<TypedDataGenerator<T>> generators = new LinkedHashSet<TypedDataGenerator<T>>(); private boolean reset = false; + private final Set<T> updatedData = new HashSet<T>(); private Collection<T> data; private DataProviderClientRpc rpc; @@ -233,7 +234,19 @@ public class DataProvider<T> extends AbstractExtension { getRpcProxy(DataProviderClientRpc.class).resetSize(data.size()); pushData(0, data); reset = false; + updatedData.clear(); } + + if (updatedData.isEmpty()) { + return; + } + + JsonArray dataArray = Json.createArray(); + int i = 0; + for (T data : updatedData) { + dataArray.set(i++, getDataObject(data)); + } + rpc.updateData(dataArray); } /** @@ -369,4 +382,17 @@ public class DataProvider<T> extends AbstractExtension { markAsDirty(); } + /** + * Informs the DataProvider that a data object has been updated. + * + * @param data + * updated data object + */ + public void refresh(T data) { + if (updatedData.isEmpty()) { + markAsDirty(); + } + + updatedData.add(data); + } } diff --git a/shared/src/com/vaadin/shared/data/DataProviderClientRpc.java b/shared/src/com/vaadin/shared/data/DataProviderClientRpc.java index c96a2a64fa..315df89c9b 100644 --- a/shared/src/com/vaadin/shared/data/DataProviderClientRpc.java +++ b/shared/src/com/vaadin/shared/data/DataProviderClientRpc.java @@ -66,4 +66,12 @@ public interface DataProviderClientRpc extends ClientRpc { */ void drop(String key); + /** + * Updates an array of objects based on their identifying key. + * + * @param data + * array of updated data + */ + void updateData(JsonArray data); + } diff --git a/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderTest.java b/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderTest.java index e82f25ba04..2a92743215 100644 --- a/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderTest.java +++ b/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderTest.java @@ -16,8 +16,10 @@ package com.vaadin.tests.dataprovider; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -93,6 +95,8 @@ public class DummyDataProviderTest extends SingleBrowserTest { } private void createPersonObjects() { + personObjects.clear(); + for (ComplexPerson p : persons) { JsonObject j = Json.createObject(); j.put(DataProviderConstants.KEY, personToKeyMap.get(p)); @@ -153,4 +157,29 @@ public class DummyDataProviderTest extends SingleBrowserTest { assertNoErrorNotifications(); } + + @Test + public void testEditFirstItem() { + persons.retainAll(Arrays.asList(persons.get(0))); + createPersonObjects(); + + openTestURL(); + + String json = personObjects.get(0).toJson(); + String text = findElements(By.className("v-label")).get(1).getText(); + assertEquals("Initial data did not match", json, text); + + $(ButtonElement.class).id("edit").click(); + + persons.get(0).setFirstName("Foo"); + createPersonObjects(); + + json = personObjects.get(0).toJson(); + + assertFalse("JsonObject of edited person was not updated", + json.equals(text)); + + text = findElements(By.className("v-label")).get(1).getText(); + assertEquals("Modified data did not match", json, text); + } } diff --git a/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderUI.java b/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderUI.java index 095f4d694c..b86037c89e 100644 --- a/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderUI.java +++ b/uitest/src/com/vaadin/tests/dataprovider/DummyDataProviderUI.java @@ -85,6 +85,10 @@ public class DummyDataProviderUI extends AbstractTestUI { Collections.sort(data, comparator); dataProvider.reset(); } + + public void update(ComplexPerson p) { + dataProvider.refresh(p); + } } public static final int RANDOM_SEED = 1337; @@ -128,13 +132,23 @@ public class DummyDataProviderUI extends AbstractTestUI { dummy.sort(nameComparator); } }); + Button edit = new Button("Edit first", new ClickListener() { + + @Override + public void buttonClick(ClickEvent event) { + ComplexPerson p = persons.get(0); + p.setFirstName("Foo"); + dummy.update(p); + } + }); // Button Ids remove.setId("remove"); add.setId("add"); sort.setId("sort"); + edit.setId("edit"); - addComponent(new HorizontalLayout(add, remove, sort)); + addComponent(new HorizontalLayout(add, remove, sort, edit)); addComponent(dummy); } diff --git a/uitest/src/com/vaadin/tests/widgetset/client/dataprovider/DummyDataConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/dataprovider/DummyDataConnector.java index c64f30ab57..cc01faceb0 100644 --- a/uitest/src/com/vaadin/tests/widgetset/client/dataprovider/DummyDataConnector.java +++ b/uitest/src/com/vaadin/tests/widgetset/client/dataprovider/DummyDataConnector.java @@ -62,6 +62,15 @@ public class DummyDataConnector extends AbstractComponentConnector implements .toJson())); } } + + @Override + public void dataUpdated(int firstRowIndex, int numberOfRows) { + for (int i = 0; i < numberOfRows; ++i) { + VLabel label = (VLabel) getWidget().getWidget( + i + firstRowIndex); + label.setText(dataSource.getRow(i + firstRowIndex).toJson()); + } + } }); } } |