From 654846837379db9a76823f5d0e73e5e6bfa8115d Mon Sep 17 00:00:00 2001 From: Denis Anisimov Date: Mon, 29 Sep 2014 20:40:36 +0300 Subject: [PATCH] Allow BeanFieldGroup.setItemDataSource() method accept null (#14731). Change-Id: I7a451f428f0aa3ea7fc322cac6b0e62d830d7987 --- .../data/fieldgroup/BeanFieldGroup.java | 7 +++-- server/src/com/vaadin/data/util/BeanItem.java | 25 ++++++++++++++- .../com/vaadin/data/util/MethodProperty.java | 10 ++++-- .../fieldgroup/BeanFieldGroupTest.java | 31 +++++++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java b/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java index e5d53b759d..1f3ee36d58 100644 --- a/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java +++ b/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java @@ -130,16 +130,17 @@ public class BeanFieldGroup extends FieldGroup { * The bean to use as data source. */ public void setItemDataSource(T bean) { - setItemDataSource(new BeanItem(bean)); + setItemDataSource(new BeanItem(bean, beanType)); } @Override public void setItemDataSource(Item item) { - if (!(item instanceof BeanItem)) { + if (item == null || (item instanceof BeanItem)) { + super.setItemDataSource(item); + } else { throw new RuntimeException(getClass().getSimpleName() + " only supports BeanItems as item data source"); } - super.setItemDataSource(item); } @Override diff --git a/server/src/com/vaadin/data/util/BeanItem.java b/server/src/com/vaadin/data/util/BeanItem.java index 12d9b23d0a..64f30261c2 100644 --- a/server/src/com/vaadin/data/util/BeanItem.java +++ b/server/src/com/vaadin/data/util/BeanItem.java @@ -62,7 +62,30 @@ public class BeanItem extends PropertysetItem { * */ public BeanItem(BT bean) { - this(bean, getPropertyDescriptors((Class) bean.getClass())); + this(bean, (Class) bean.getClass()); + } + + /** + *

+ * Creates a new instance of BeanItem and adds all properties + * of a Java Bean to it. The properties are identified by their respective + * bean names. + *

+ * + *

+ * Note : This version only supports introspectable bean properties and + * their getter and setter methods. Stand-alone is and + * are methods are not supported. + *

+ * + * @param bean + * the Java Bean to copy properties from. + * @param beanClass + * class of the {@code bean} + * + */ + public BeanItem(BT bean, Class beanClass) { + this(bean, getPropertyDescriptors(beanClass)); } /** diff --git a/server/src/com/vaadin/data/util/MethodProperty.java b/server/src/com/vaadin/data/util/MethodProperty.java index 5e6b731571..853f68b711 100644 --- a/server/src/com/vaadin/data/util/MethodProperty.java +++ b/server/src/com/vaadin/data/util/MethodProperty.java @@ -132,7 +132,7 @@ public class MethodProperty extends AbstractProperty { setArguments(getArgs, setArgs, setArgumentIndex); String name = (String) in.readObject(); Class[] paramTypes = SerializerHelper.readClassArray(in); - if (name != null) { + if (instance != null && name != null) { setMethod = instance.getClass().getMethod(name, paramTypes); } else { setMethod = null; @@ -140,7 +140,7 @@ public class MethodProperty extends AbstractProperty { name = (String) in.readObject(); paramTypes = SerializerHelper.readClassArray(in); - if (name != null) { + if (instance != null && name != null) { getMethod = instance.getClass().getMethod(name, paramTypes); } else { getMethod = null; @@ -589,7 +589,11 @@ public class MethodProperty extends AbstractProperty { @Override public T getValue() { try { - return (T) getMethod.invoke(instance, getArgs); + if (instance == null) { + return null; + } else { + return (T) getMethod.invoke(instance, getArgs); + } } catch (final Throwable e) { throw new MethodException(this, e); } diff --git a/server/tests/src/com/vaadin/tests/server/component/fieldgroup/BeanFieldGroupTest.java b/server/tests/src/com/vaadin/tests/server/component/fieldgroup/BeanFieldGroupTest.java index 112d36d884..965fb49479 100644 --- a/server/tests/src/com/vaadin/tests/server/component/fieldgroup/BeanFieldGroupTest.java +++ b/server/tests/src/com/vaadin/tests/server/component/fieldgroup/BeanFieldGroupTest.java @@ -2,12 +2,16 @@ package com.vaadin.tests.server.component.fieldgroup; import static org.junit.Assert.assertEquals; +import java.util.Collection; + import org.junit.Assert; import org.junit.Test; +import com.vaadin.data.Item; import com.vaadin.data.fieldgroup.BeanFieldGroup; import com.vaadin.data.fieldgroup.FieldGroup.CommitException; import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.data.util.BeanItem; import com.vaadin.ui.Field; import com.vaadin.ui.TextField; @@ -133,4 +137,31 @@ public class BeanFieldGroupTest { assertEquals(bean.nestedBean.hello, helloField.getValue().toString()); } + @Test + public void setDataSource_nullBean_nullBeanIsSetInDataSource() { + BeanFieldGroup group = new BeanFieldGroup(MyBean.class); + + group.setItemDataSource((MyBean) null); + + BeanItem dataSource = group.getItemDataSource(); + Assert.assertNotNull("Data source is null for null bean", dataSource); + + Collection itemPropertyIds = dataSource.getItemPropertyIds(); + Assert.assertEquals("Unexpected number of properties", 3, + itemPropertyIds.size()); + for (Object id : itemPropertyIds) { + Assert.assertNull("Value for property " + id + " is not null", + dataSource.getItemProperty(id).getValue()); + } + } + + @Test + public void setDataSource_nullItem_nullDataSourceIsSet() { + BeanFieldGroup group = new BeanFieldGroup(MyBean.class); + + group.setItemDataSource((Item) null); + BeanItem dataSource = group.getItemDataSource(); + Assert.assertNull("Group returns not null data source", dataSource); + } + } -- 2.39.5