From 5c8d4c1f5dfa4f6fb2e73728e2c0512d3e5c7446 Mon Sep 17 00:00:00 2001 From: Jonni Nakari Date: Thu, 13 Dec 2012 14:58:18 +0200 Subject: [PATCH] Search fields from superclasses #10504 Modified buildAndBindMemberFields method to use a new getFieldsInDeclareOrder method that searches fields also from superclasses. Added a unit test to verify the new logic. Fixes the issue in ticket #10504 Change-Id: Ic855e274c5b4d1c83760d6c2c53c67413a1da42c --- .../vaadin/data/fieldgroup/FieldGroup.java | 28 +++++++++++++-- .../data/util/ReflectToolsGetSuperField.java | 34 +++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 server/tests/src/com/vaadin/data/util/ReflectToolsGetSuperField.java diff --git a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java index 51cd3126cb..8803054857 100644 --- a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java +++ b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java @@ -794,8 +794,7 @@ public class FieldGroup implements Serializable { boolean buildFields) throws BindException { Class objectClass = objectWithMemberFields.getClass(); - for (java.lang.reflect.Field memberField : objectClass - .getDeclaredFields()) { + for (java.lang.reflect.Field memberField : getFieldsInDeclareOrder(objectClass)) { if (!Field.class.isAssignableFrom(memberField.getType())) { // Process next field @@ -1001,4 +1000,27 @@ public class FieldGroup implements Serializable { field.setCaption(caption); return field; } -} \ No newline at end of file + + /** + * Returns an array containing Field objects reflecting all the fields of + * the class or interface represented by this Class object. The elements in + * the array returned are sorted in declare order from sub class to super + * class. + * + * @param searchClass + * @return + */ + protected static List getFieldsInDeclareOrder( + Class searchClass) { + ArrayList memberFieldInOrder = new ArrayList(); + + while (searchClass != null) { + for (java.lang.reflect.Field memberField : searchClass + .getDeclaredFields()) { + memberFieldInOrder.add(memberField); + } + searchClass = searchClass.getSuperclass(); + } + return memberFieldInOrder; + } +} diff --git a/server/tests/src/com/vaadin/data/util/ReflectToolsGetSuperField.java b/server/tests/src/com/vaadin/data/util/ReflectToolsGetSuperField.java new file mode 100644 index 0000000000..efba6085ac --- /dev/null +++ b/server/tests/src/com/vaadin/data/util/ReflectToolsGetSuperField.java @@ -0,0 +1,34 @@ +package com.vaadin.data.util; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.vaadin.data.fieldgroup.FieldGroup; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.ui.TextField; + +public class ReflectToolsGetSuperField { + + @Test + public void getFieldFromSuperClass() { + class MyClass { + @PropertyId("testProperty") + TextField test = new TextField("This is a test"); + } + class MySubClass extends MyClass { + // no fields here + } + + PropertysetItem item = new PropertysetItem(); + item.addItemProperty("testProperty", new ObjectProperty("Value of testProperty")); + + MySubClass form = new MySubClass(); + + FieldGroup binder = new FieldGroup(item); + binder.bindMemberFields(form); + + assertTrue("Value of testProperty".equals(form.test.getValue())); + } + +} -- 2.39.5