You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by me...@apache.org on 2009/12/24 05:37:47 UTC

svn commit: r893696 - /incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Author: medgar
Date: Thu Dec 24 04:37:46 2009
New Revision: 893696

URL: http://svn.apache.org/viewvc?rev=893696&view=rev
Log:
add support for non public Bindable fields

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java?rev=893696&r1=893695&r2=893696&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java Thu Dec 24 04:37:46 2009
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -34,6 +35,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.TreeMap;
 
 import javax.servlet.ServletContext;
 
@@ -1681,19 +1683,43 @@
 
         } else if (mode == AutoBinding.ANNOTATION) {
 
-            List<Field> fieldList = new ArrayList<Field>();
+            List<Class> pageClassList = new ArrayList<Class>();
+            pageClassList.add(pageClass);
 
-            // Only include bindable fields
-            for (Field field : pageClass.getFields()) {
-                if (field.getAnnotation(Bindable.class) != null) {
-                    fieldList.add(field);
+            Class parentClass = pageClass.getSuperclass();
+            while (parentClass != null) {
+                pageClassList.add(parentClass);
+                parentClass = parentClass.getSuperclass();
+            }
+
+            // Reverse class list so parents are processed first, with the
+            // actual page class fields processed last. This will enable the
+            // page classes fields to override any
+            Collections.reverse(pageClassList);
+
+            Map<String, Field> fieldMap = new TreeMap<String, Field>();
+
+            for (Class aPageClass : pageClassList) {
+
+                for (Field field : aPageClass.getDeclaredFields()) {
+
+                    if (field.getAnnotation(Bindable.class) != null) {
+                        fieldMap.put(field.getName(), field);
+
+                        // If field is not public set accessiblity true
+                        if (!Modifier.isPublic(field.getModifiers())) {
+                            field.setAccessible(true);
+                        }
+                    }
                 }
             }
 
-            Field[] fieldArray = new Field[fieldList.size()];
+            // Copy the field map values into a field list
+            Field[] fieldArray = new Field[fieldMap.size()];
 
-            for (int i = 0; i < fieldList.size(); i++) {
-                fieldArray[i] = fieldList.get(i);
+            int i = 0;
+            for (Field field : fieldMap.values()) {
+                fieldArray[i++] = field;
             }
 
             return fieldArray;