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:48:38 UTC

svn commit: r998663 - in /wicket/branches/wicket-1.4.x/wicket/src: main/java/org/apache/wicket/model/ main/java/org/apache/wicket/util/lang/ test/java/org/apache/wicket/model/

Author: mgrigorov
Date: Sun Sep 19 13:48:37 2010
New Revision: 998663

URL: http://svn.apache.org/viewvc?rev=998663&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


Added:
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java   (with props)
Modified:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java?rev=998663&r1=998662&r2=998663&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java Sun Sep 19 13:48:37 2010
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 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;
@@ -226,6 +227,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/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java?rev=998663&r1=998662&r2=998663&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java Sun Sep 19 13:48:37 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)
 		{

Added: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java?rev=998663&view=auto
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java (added)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java Sun Sep 19 13:48:37 2010
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.model;
+
+import java.io.Serializable;
+
+import junit.framework.TestCase;
+
+/**
+ * https://issues.apache.org/jira/browse/WICKET-2937
+ * 
+ * <p>
+ * If AbstractPropertyModel has an target that implements the IObjectClassAwareModel interface then
+ * the class of that target is used to infer the modeled property type.
+ * 
+ * @author Pedro Santos
+ */
+public class AbstractPropertyModelObjectClassTest extends TestCase
+{
+
+	public void testCompoundPropertyModel()
+	{
+		assertPropertyModelTargetTypeIsInteger(new CompoundPropertyModel<CustomType>(
+			new CustomType()));
+	}
+
+	public void testCompoundPropertyModelBind()
+	{
+		CompoundPropertyModel<CustomType> compoundPropertyModel = new CompoundPropertyModel<CustomType>(
+			new CustomBean());
+		IModel<?> modelForCustomTypeObject = compoundPropertyModel.bind("customType");
+		assertPropertyModelTargetTypeIsInteger(modelForCustomTypeObject);
+	}
+
+	public void testModel()
+	{
+		assertPropertyModelTargetTypeIsInteger(new Model<CustomType>(new CustomType()));
+	}
+
+	/**
+	 * Just asserting that the the property expression for the somePropety is aware of this property
+	 * type.
+	 * 
+	 * @param modelForCustomTypeObject
+	 */
+	private void assertPropertyModelTargetTypeIsInteger(IModel<?> modelForCustomTypeObject)
+	{
+		assertEquals(Integer.class, new PropertyModel<IModel<?>>(modelForCustomTypeObject,
+			"someProperty").getObjectClass());
+	}
+
+	private static class CustomType implements Serializable
+	{
+		private Integer someProperty;
+
+		public void setSomeProperty(Integer someProperty)
+		{
+			this.someProperty = someProperty;
+		}
+
+		public Integer getSomeProperty()
+		{
+			return someProperty;
+		}
+	}
+
+	private static class CustomBean implements Serializable
+	{
+		private CustomType customType;
+
+		public CustomType getCustomType()
+		{
+			return customType;
+		}
+
+		public void setCustomType(CustomType customType)
+		{
+			this.customType = customType;
+		}
+	}
+}
\ No newline at end of file

Propchange: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
------------------------------------------------------------------------------
    svn:eol-style = native