You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by dj...@apache.org on 2007/03/07 00:18:46 UTC

svn commit: r515352 - in /geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe: ObjectRecipe.java Option.java

Author: djencks
Date: Tue Mar  6 15:18:45 2007
New Revision: 515352

URL: http://svn.apache.org/viewvc?view=rev&rev=515352
Log:
XBEAN-79 make the static support actually work

Modified:
    geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java
    geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/Option.java

Modified: geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java?view=diff&rev=515352&r1=515351&r2=515352
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java (original)
+++ geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java Tue Mar  6 15:18:45 2007
@@ -195,7 +195,7 @@
         }
         Object instance = result;
 
-        setProperties(propertyValues, instance, classLoader);
+        setProperties(propertyValues, instance, instance.getClass(), classLoader);
         // call instance factory method
         if (factoryMethod != null && !Modifier.isStatic(factoryMethod.getModifiers())) {
             try {
@@ -234,21 +234,21 @@
         // clone the properties so they can be used again
         Map<Property,Object> propertyValues = new LinkedHashMap<Property,Object>(properties);
 
-        setProperties(propertyValues, null, classLoader);
+        setProperties(propertyValues, null, typeClass, classLoader);
 
         return typeClass;
     }
 
-    private void setProperties(Map<Property, Object> propertyValues, Object instance, ClassLoader classLoader) {
+    private void setProperties(Map<Property, Object> propertyValues, Object instance, Class clazz, ClassLoader classLoader) {
         boolean allowPrivate = options.contains(Option.PRIVATE_PROPERTIES);
+        boolean allowStatic = options.contains(Option.STATIC_PROPERTIES);
         boolean ignoreMissingProperties = options.contains(Option.IGNORE_MISSING_PROPERTIES);
-
         // set remaining properties
         for (Map.Entry<Property, Object> entry : RecipeHelper.prioritizeProperties(propertyValues)) {
             Property propertyName = entry.getKey();
             Object propertyValue = entry.getValue();
 
-            setProperty(instance, propertyName, propertyValue, allowPrivate, ignoreMissingProperties, classLoader);
+            setProperty(instance, clazz, propertyName, propertyValue, allowPrivate, allowStatic, ignoreMissingProperties, classLoader);
         }
 
     }
@@ -263,23 +263,23 @@
         return typeClass;
     }
 
-    private void setProperty(Object instance, Property propertyName, Object propertyValue, boolean allowPrivate, boolean ignoreMissingProperties, ClassLoader classLoader) {
+    private void setProperty(Object instance, Class clazz, Property propertyName, Object propertyValue, boolean allowPrivate, boolean allowStatic, boolean ignoreMissingProperties, ClassLoader classLoader) {
         Member member;
         try {
             if (propertyName instanceof SetterProperty){
-                member = new MethodMember(findSetter(instance.getClass(), propertyName.name, propertyValue, allowPrivate, classLoader));
+                member = new MethodMember(findSetter(clazz, propertyName.name, propertyValue, allowPrivate, allowStatic, classLoader));
             } else if (propertyName instanceof FieldProperty){
-                member = new FieldMember(findField(instance.getClass(), propertyName.name, propertyValue, allowPrivate, classLoader));
+                member = new FieldMember(findField(clazz, propertyName.name, propertyValue, allowPrivate, allowStatic, classLoader));
             } else {
                 try {
-                    member = new MethodMember(findSetter(instance.getClass(), propertyName.name, propertyValue, allowPrivate, classLoader));
+                    member = new MethodMember(findSetter(clazz, propertyName.name, propertyValue, allowPrivate, allowStatic, classLoader));
                 } catch (MissingAccessorException noSetter) {
                     if (!options.contains(Option.FIELD_INJECTION)) {
                         throw noSetter;
                     }
 
                     try {
-                        member = new FieldMember(findField(instance.getClass(), propertyName.name, propertyValue, allowPrivate, classLoader));
+                        member = new FieldMember(findField(clazz, propertyName.name, propertyValue, allowPrivate, allowStatic, classLoader));
                     } catch (MissingAccessorException noField) {
                         throw (noField.getMatchLevel() > noSetter.getMatchLevel())? noField: noSetter;
                     }
@@ -576,7 +576,20 @@
         }
     }
 
+    /**
+     * @deprecated use the method with allowStatic
+     * @param typeClass
+     * @param propertyName
+     * @param propertyValue
+     * @param allowPrivate
+     * @param classLoader
+     * @return
+     */
     public static Method findSetter(Class typeClass, String propertyName, Object propertyValue, boolean allowPrivate, ClassLoader classLoader) {
+        return findSetter(typeClass, propertyName,  propertyValue, allowPrivate, false, classLoader);
+    }
+
+    public static Method findSetter(Class typeClass, String propertyName, Object propertyValue, boolean allowPrivate, boolean allowStatic, ClassLoader classLoader) {
         if (propertyName == null) throw new NullPointerException("name is null");
         if (propertyName.length() == 0) throw new IllegalArgumentException("name is an empty string");
 
@@ -633,7 +646,7 @@
                     continue;
                 }
 
-                if (Modifier.isStatic(method.getModifiers())) {
+                if (!allowStatic && Modifier.isStatic(method.getModifiers())) {
                     if (matchLevel < 4) {
                         matchLevel = 4;
                         missException = new MissingAccessorException("Setter is static: " + method, matchLevel);
@@ -680,7 +693,20 @@
         }
     }
 
+    /**
+     * @deprecated use the method with allowStatic
+     * @param typeClass
+     * @param propertyName
+     * @param propertyValue
+     * @param allowPrivate
+     * @param classLoader
+     * @return
+     */
     public static Field findField(Class typeClass, String propertyName, Object propertyValue, boolean allowPrivate, ClassLoader classLoader) {
+        return findField(typeClass, propertyName,  propertyValue, allowPrivate, false, classLoader);
+    }
+
+    public static Field findField(Class typeClass, String propertyName, Object propertyValue, boolean allowPrivate, boolean allowStatic, ClassLoader classLoader) {
         if (propertyName == null) throw new NullPointerException("name is null");
         if (propertyName.length() == 0) throw new IllegalArgumentException("name is an empty string");
 
@@ -705,7 +731,7 @@
                     continue;
                 }
 
-                if (Modifier.isStatic(field.getModifiers())) {
+                if (!allowStatic && Modifier.isStatic(field.getModifiers())) {
                     if (matchLevel < 4) {
                         matchLevel = 4;
                         missException = new MissingAccessorException("Field is static: " + field, matchLevel);

Modified: geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/Option.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/Option.java?view=diff&rev=515352&r1=515351&r2=515352
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/Option.java (original)
+++ geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/Option.java Tue Mar  6 15:18:45 2007
@@ -22,6 +22,7 @@
 public class Option {
 
     public static final Option PRIVATE_PROPERTIES = new Option("PRIVATE_PROPERTIES");
+    public static final Option STATIC_PROPERTIES = new Option("STATIC_PROPERTIES");
     public static final Option FIELD_INJECTION = new Option("FIELD_INJECTION");
     public static final Option IGNORE_MISSING_PROPERTIES = new Option("IGNORE_MISSING_PROPERTIES");