From: Matti Tahvonen Date: Sat, 7 Dec 2013 17:38:43 +0000 (+0200) Subject: Added convenience methods for bean binding (#13068) X-Git-Tag: 7.2.0.beta1~73 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=67a9154c015f92b95ddd223ddd5b81b647609cc4;p=vaadin-framework.git Added convenience methods for bean binding (#13068) Reduces common bean binding code from 4 lines to 1 Change-Id: Ie5f20ec2791284b850a9f3e11e21face3b5e4276 --- diff --git a/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java b/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java index cb8a044f00..6616f9f24e 100644 --- a/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java +++ b/server/src/com/vaadin/data/fieldgroup/BeanFieldGroup.java @@ -225,4 +225,58 @@ public class BeanFieldGroup extends FieldGroup { } return beanValidationImplementationAvailable; } + + /** + * Convenience method to bind Fields from a given "field container" to a + * given bean with buffering disabled. + *

+ * The returned {@link BeanFieldGroup} can be used for further + * configuration. + * + * @see #bindFieldsBuffered(Object, Object) + * @see #bindMemberFields(Object) + * @since 7.2 + * @param bean + * the bean to be bound + * @param objectWithMemberFields + * the class that contains {@link Field}s for bean properties + * @return the bean field group used to make binding + */ + public static BeanFieldGroup bindFieldsUnbuffered(T bean, + Object objectWithMemberFields) { + return createAndBindFields(bean, objectWithMemberFields, false); + } + + /** + * Convenience method to bind Fields from a given "field container" to a + * given bean with buffering enabled. + *

+ * The returned {@link BeanFieldGroup} can be used for further + * configuration. + * + * @see #bindFieldsUnbuffered(Object, Object) + * @see #bindMemberFields(Object) + * @since 7.2 + * @param bean + * the bean to be bound + * @param objectWithMemberFields + * the class that contains {@link Field}s for bean properties + * @return the bean field group used to make binding + */ + public static BeanFieldGroup bindFieldsBuffered(T bean, + Object objectWithMemberFields) { + return createAndBindFields(bean, objectWithMemberFields, true); + } + + private static BeanFieldGroup createAndBindFields(T bean, + Object objectWithMemberFields, boolean buffered) { + @SuppressWarnings("unchecked") + BeanFieldGroup beanFieldGroup = new BeanFieldGroup( + (Class) bean.getClass()); + beanFieldGroup.setItemDataSource(bean); + beanFieldGroup.setBuffered(buffered); + beanFieldGroup.bindMemberFields(objectWithMemberFields); + return beanFieldGroup; + } + } 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 44b77e88e2..112d36d884 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,19 +2,60 @@ package com.vaadin.tests.server.component.fieldgroup; import static org.junit.Assert.assertEquals; +import org.junit.Assert; import org.junit.Test; import com.vaadin.data.fieldgroup.BeanFieldGroup; +import com.vaadin.data.fieldgroup.FieldGroup.CommitException; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.ui.Field; +import com.vaadin.ui.TextField; public class BeanFieldGroupTest { + private static final String DEFAULT_FOR_BASIC_FIELD = "default"; + public static class MyBean { + private String basicField = DEFAULT_FOR_BASIC_FIELD; + + private String anotherField; + private MyNestedBean nestedBean = new MyNestedBean(); public MyNestedBean getNestedBean() { return nestedBean; } + + /** + * @return the basicField + */ + public String getBasicField() { + return basicField; + } + + /** + * @param basicField + * the basicField to set + */ + public void setBasicField(String basicField) { + this.basicField = basicField; + } + + /** + * @return the anotherField + */ + public String getAnotherField() { + return anotherField; + } + + /** + * @param anotherField + * the anotherField to set + */ + public void setAnotherField(String anotherField) { + this.anotherField = anotherField; + } } public static class MyNestedBean { @@ -26,6 +67,59 @@ public class BeanFieldGroupTest { } } + public static class ViewStub { + + TextField basicField = new TextField(); + + @PropertyId("anotherField") + TextField boundWithAnnotation = new TextField(); + } + + @SuppressWarnings("unchecked") + @Test + public void testStaticBindingHelper() { + MyBean myBean = new MyBean(); + + ViewStub viewStub = new ViewStub(); + BeanFieldGroup bindFields = BeanFieldGroup + .bindFieldsUnbuffered(myBean, viewStub); + + Field field = (Field) bindFields.getField("basicField"); + Assert.assertEquals(DEFAULT_FOR_BASIC_FIELD, myBean.basicField); + field.setValue("Foo"); + Assert.assertEquals("Foo", myBean.basicField); + + field = (Field) bindFields.getField("anotherField"); + field.setValue("Foo"); + Assert.assertEquals("Foo", myBean.anotherField); + } + + @SuppressWarnings("unchecked") + @Test + public void testStaticBufferedBindingHelper() throws CommitException { + MyBean myBean = new MyBean(); + + ViewStub viewStub = new ViewStub(); + BeanFieldGroup bindFields = BeanFieldGroup.bindFieldsBuffered( + myBean, viewStub); + + Field basicField = (Field) bindFields + .getField("basicField"); + basicField.setValue("Foo"); + Assert.assertEquals(DEFAULT_FOR_BASIC_FIELD, myBean.basicField); + + Field anotherField = (Field) bindFields + .getField("anotherField"); + anotherField.setValue("Foo"); + Assert.assertNull(myBean.anotherField); + + bindFields.commit(); + + Assert.assertEquals("Foo", myBean.basicField); + Assert.assertEquals("Foo", myBean.anotherField); + + } + @Test public void buildAndBindNestedProperty() {