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