You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2010/09/19 15:57:30 UTC

svn commit: r998671 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/model/AbstractPropertyModel.java main/java/org/apache/wicket/util/lang/PropertyResolver.java test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java

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);