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