package com.vaadin.v7.tests.server.component.grid; import org.junit.Assert; import org.junit.Test; import com.vaadin.server.ServerRpcManager.RpcInvocationException; import com.vaadin.server.ServerRpcMethodInvocation; import com.vaadin.tests.util.MockUI; import com.vaadin.ui.UI; import com.vaadin.v7.data.fieldgroup.FieldGroup; import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException; import com.vaadin.v7.data.util.IndexedContainer; import com.vaadin.v7.shared.ui.grid.EditorServerRpc; import com.vaadin.v7.ui.Grid; import com.vaadin.v7.ui.TextField; public class ItemSetChangeDuringEditorCommit { private static class IndexedContainerImpl extends IndexedContainer { public IndexedContainerImpl() { } @Override public void fireItemSetChange() { super.fireItemSetChange(); } } @Test public void itemSetChangeDoesNotInterruptCommit() throws RpcInvocationException, CommitException { UI ui = new MockUI(); final IndexedContainerImpl indexedContainer = new IndexedContainerImpl(); indexedContainer.addContainerProperty("firstName", String.class, "first"); indexedContainer.addContainerProperty("lastName", String.class, "last"); indexedContainer.addItem(); indexedContainer.addItem(); Grid grid = new Grid(); ui.setContent(grid); grid.setContainerDataSource(indexedContainer); grid.setEditorEnabled(true); grid.getEditorFieldGroup() .addCommitHandler(new FieldGroup.CommitHandler() { @Override public void preCommit(FieldGroup.CommitEvent commitEvent) throws FieldGroup.CommitException { } @Override public void postCommit(FieldGroup.CommitEvent commitEvent) throws FieldGroup.CommitException { indexedContainer.fireItemSetChange(); } }); editItem(grid, 0); ((TextField) grid.getEditorFieldGroup().getField("firstName")) .setValue("New first"); ((TextField) grid.getEditorFieldGroup().getField("lastName")) .setValue("New last"); grid.saveEditor(); Assert.assertEquals("New first", indexedContainer .getContainerProperty(grid.getEditedItemId(), "firstName") .getValue()); Assert.assertEquals("New last", indexedContainer .getContainerProperty(grid.getEditedItemId(), "lastName") .getValue()); grid.cancelEditor(); Assert.assertFalse(grid.isEditorActive()); editItem(grid, 0); Assert.assertEquals("New first", ((TextField) grid.getEditorFieldGroup().getField("firstName")) .getValue()); Assert.assertEquals("New last", ((TextField) grid.getEditorFieldGroup().getField("lastName")) .getValue()); saveEditor(grid, 0); } private void editItem(Grid grid, int itemIndex) throws RpcInvocationException { ServerRpcMethodInvocation invocation = new ServerRpcMethodInvocation( grid.getConnectorId(), EditorServerRpc.class, "bind", 1); invocation.setParameters(new Object[] { itemIndex }); grid.getRpcManager(EditorServerRpc.class.getName()) .applyInvocation(invocation); Assert.assertTrue(grid.isEditorActive()); } private void saveEditor(Grid grid, int itemIndex) throws RpcInvocationException { ServerRpcMethodInvocation invocation = new ServerRpcMethodInvocation( grid.getConnectorId(), EditorServerRpc.class, "save", 1); invocation.setParameters(new Object[] { itemIndex }); grid.getRpcManager(EditorServerRpc.class.getName()) .applyInvocation(invocation); } }