Author: mgrigorov
Date: Sun Sep 19 13:57:30 2010
New Revision: 998671

URL: http://svn.apache.org/viewvc?rev=998671&view=rev
Log:
WICKET-2937 AbstractPropertyModel getObjectClass don't consider nested 
IObjectClassAwareModel targets

Use the IObjectClassAwareModel's target class if available.
patch-provided-by: Pedro Santos

merge r998663 and r998668 from 1.4.x


Added:
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
      - copied, changed from r998663, 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java?rev=998671&r1=998670&r2=998671&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
 Sun Sep 19 13:57:30 2010
@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.util.lang.PropertyResolver;
 import org.apache.wicket.util.lang.PropertyResolverConverter;
 import org.apache.wicket.util.string.Strings;
@@ -230,6 +231,19 @@ public abstract class AbstractPropertyMo
                                // ignore.
                        }
                }
+               else if (this.target instanceof IObjectClassAwareModel)
+               {
+                       try
+                       {
+                               return 
PropertyResolver.getPropertyClass(expression,
+                                       
((IObjectClassAwareModel<?>)this.target).getObjectClass());
+                       }
+                       catch (WicketRuntimeException e)
+                       {
+                               // it was just a try.
+                       }
+
+               }
                return null;
        }
 

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java?rev=998671&r1=998670&r2=998671&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 Sun Sep 19 13:57:30 2010
@@ -28,6 +28,7 @@ import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.util.convert.ConversionException;
+import org.apache.wicket.util.lang.PropertyResolver.IClassCache;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -154,6 +155,23 @@ public final class PropertyResolver
        }
 
        /**
+        * @param <T>
+        * @param expression
+        * @param clz
+        * @return class of the target Class property expression
+        */
+       public static <T> Class<T> getPropertyClass(String expression, Class<?> 
clz)
+       {
+               ObjectAndGetSetter setter = getObjectAndGetSetter(expression, 
null, RESOLVE_CLASS, clz);
+               if (setter == null)
+               {
+                       throw new WicketRuntimeException("No Class returned for 
expression: " + expression +
+                               " for getting the target classs of: " + clz);
+               }
+               return (Class<T>)setter.getTargetClass();
+       }
+
+       /**
         * @param expression
         * @param object
         * @return Field for the property expression or null if such field 
doesn't exist (only getters
@@ -204,15 +222,40 @@ public final class PropertyResolver
                return setter.getSetter();
        }
 
+       /**
+        * Just delegating the call to the original getObjectAndGetSetter 
passing the object type as
+        * parameter.
+        * 
+        * @param expression
+        * @param object
+        * @param tryToCreateNull
+        * @return {...@link ObjectAndGetSetter}
+        */
        private static ObjectAndGetSetter getObjectAndGetSetter(final String 
expression,
                final Object object, int tryToCreateNull)
        {
+               return getObjectAndGetSetter(expression, object, 
tryToCreateNull, object.getClass());
+       }
+
+
+       /**
+        * Receives the class parameter also, since this method can resolve the 
type for some
+        * expression, only knowing the target class
+        * 
+        * @param expression
+        * @param object
+        * @param tryToCreateNull
+        * @param clz
+        * @return {...@link ObjectAndGetSetter}
+        */
+       private static ObjectAndGetSetter getObjectAndGetSetter(final String 
expression,
+               final Object object, int tryToCreateNull, Class<?> clz)
+       {
                final String expressionBracketsSeperated = 
Strings.replaceAll(expression, "[", ".[")
                        .toString();
                int index = getNextDotIndex(expressionBracketsSeperated, 0);
                int lastIndex = 0;
                Object value = object;
-               Class<?> clz = value.getClass();
                String exp = expressionBracketsSeperated;
                while (index != -1)
                {

Copied: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
 (from r998663, 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java)
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java?p2=wicket/trunk/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java&p1=wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java&r1=998663&r2=998671&rev=998671&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
 Sun Sep 19 13:57:30 2010
@@ -40,7 +40,7 @@ public class AbstractPropertyModelObject
 
        public void testCompoundPropertyModelBind()
        {
-               CompoundPropertyModel<CustomType> compoundPropertyModel = new 
CompoundPropertyModel<CustomType>(
+               CompoundPropertyModel<CustomBean> compoundPropertyModel = new 
CompoundPropertyModel<CustomBean>(
                        new CustomBean());
                IModel<?> modelForCustomTypeObject = 
compoundPropertyModel.bind("customType");
                
assertPropertyModelTargetTypeIsInteger(modelForCustomTypeObject);


Reply via email to