diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2015-06-08 17:21:58 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2015-06-09 10:56:26 +0000 |
commit | 5ebfdecb1b4eb016b674f7a01257959a50047eb3 (patch) | |
tree | b55f79890aac42697ac765111a1cc041cd7ce50c /server | |
parent | 1eba7f023bf534c8dd5d508ef5f9a5970af67885 (diff) | |
download | vaadin-framework-5ebfdecb1b4eb016b674f7a01257959a50047eb3.tar.gz vaadin-framework-5ebfdecb1b4eb016b674f7a01257959a50047eb3.zip |
Better handle exceptions when opening Grid editor (#17935)
Change-Id: I68103db75c422b042988c6662da268ff9d11a306
Diffstat (limited to 'server')
-rw-r--r-- | server/src/com/vaadin/ui/Grid.java | 35 | ||||
-rw-r--r-- | server/tests/src/com/vaadin/tests/server/component/grid/GridEditorTest.java | 8 |
2 files changed, 31 insertions, 12 deletions
diff --git a/server/src/com/vaadin/ui/Grid.java b/server/src/com/vaadin/ui/Grid.java index 2c442d6e43..88a3195857 100644 --- a/server/src/com/vaadin/ui/Grid.java +++ b/server/src/com/vaadin/ui/Grid.java @@ -3868,7 +3868,7 @@ public class Grid extends AbstractComponent implements SelectionNotifier, @Override public void bind(int rowIndex) { - boolean success = false; + Exception exception = null; try { Object id = getContainerDataSource().getIdByIndex(rowIndex); if (editedItemId == null) { @@ -3876,13 +3876,20 @@ public class Grid extends AbstractComponent implements SelectionNotifier, } if (editedItemId.equals(id)) { - success = true; doEditItem(); } } catch (Exception e) { - handleError(e); + exception = e; + } + + if (exception != null) { + handleError(exception); + doCancelEditor(); + getEditorRpc().confirmBind(false); + } else { + doEditItem(); + getEditorRpc().confirmBind(true); } - getEditorRpc().confirmBind(success); } @Override @@ -5702,13 +5709,20 @@ public class Grid extends AbstractComponent implements SelectionNotifier, } Field<?> editor = editorFieldGroup.getField(propertyId); - if (editor == null) { - editor = editorFieldGroup.buildAndBind(propertyId); - } - if (editor.getParent() != Grid.this) { - assert editor.getParent() == null; - editor.setParent(this); + try { + if (editor == null) { + editor = editorFieldGroup.buildAndBind(propertyId); + } + } finally { + if (editor == null) { + editor = editorFieldGroup.getField(propertyId); + } + + if (editor != null && editor.getParent() != Grid.this) { + assert editor.getParent() == null; + editor.setParent(this); + } } return editor; } @@ -5803,6 +5817,7 @@ public class Grid extends AbstractComponent implements SelectionNotifier, protected void doCancelEditor() { editedItemId = null; editorFieldGroup.discard(); + editorFieldGroup.setItemDataSource(null); } void resetEditor() { diff --git a/server/tests/src/com/vaadin/tests/server/component/grid/GridEditorTest.java b/server/tests/src/com/vaadin/tests/server/component/grid/GridEditorTest.java index 135d7d398c..b70f17779a 100644 --- a/server/tests/src/com/vaadin/tests/server/component/grid/GridEditorTest.java +++ b/server/tests/src/com/vaadin/tests/server/component/grid/GridEditorTest.java @@ -184,12 +184,16 @@ public class GridEditorTest { .getEditorField(); field.setValue("New Name"); + Property<?> datasource = field.getPropertyDataSource(); + grid.cancelEditor(); assertFalse(grid.isEditorActive()); assertNull(grid.getEditedItemId()); assertFalse(field.isModified()); - assertEquals(DEFAULT_NAME, field.getValue()); - assertEquals(DEFAULT_NAME, field.getPropertyDataSource().getValue()); + assertEquals("", field.getValue()); + assertEquals(DEFAULT_NAME, datasource.getValue()); + assertNull(field.getPropertyDataSource()); + assertNull(grid.getEditorFieldGroup().getItemDataSource()); } @Test(expected = IllegalArgumentException.class) |