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 2012/03/02 16:38:16 UTC

git commit: WICKET-2498 IChainingModel implementation

Updated Branches:
  refs/heads/master dda0c067f -> e1d284298


WICKET-2498 IChainingModel implementation

Extract the common code related to IChainingModel in default impl


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e1d28429
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e1d28429
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e1d28429

Branch: refs/heads/master
Commit: e1d28429865b5564b5ad87f6499ad2793a11767d
Parents: dda0c06
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Mar 2 17:36:05 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Mar 2 17:37:57 2012 +0200

----------------------------------------------------------------------
 .../apache/wicket/model/AbstractPropertyModel.java |  101 +--------
 .../org/apache/wicket/model/ChainingModel.java     |  173 +++++++++++++++
 .../apache/wicket/model/CompoundPropertyModel.java |   88 +-------
 .../AbstractPropertyModelObjectClassTest.java      |    8 +-
 4 files changed, 191 insertions(+), 179 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e1d28429/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java b/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
index c4ee729..a0ca887 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java
@@ -25,8 +25,6 @@ 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;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Serves as a base class for different kinds of property models. By default, this class uses
@@ -45,20 +43,12 @@ import org.slf4j.LoggerFactory;
  * @param <T>
  *            The Model object type
  */
-public abstract class AbstractPropertyModel<T>
+public abstract class AbstractPropertyModel<T> extends ChainingModel<T>
 	implements
-		IChainingModel<T>,
 		IObjectClassAwareModel<T>,
 		IPropertyReflectionAwareModel<T>
 {
-	private static final Logger logger = LoggerFactory.getLogger(AbstractPropertyModel.class);
-
-	/**
-	 * 
-	 */
 	private static final long serialVersionUID = 1L;
-	/** Any model object (which may or may not implement IModel) */
-	private Object target;
 
 	/**
 	 * Constructor
@@ -68,48 +58,7 @@ public abstract class AbstractPropertyModel<T>
 	 */
 	public AbstractPropertyModel(final Object modelObject)
 	{
-		if (modelObject == null)
-		{
-			throw new IllegalArgumentException("Parameter modelObject cannot be null");
-		}
-
-		if (modelObject instanceof Session)
-		{
-			logger.warn("It is not a good idea to reference the Session instance "
-				+ "in models directly as it may lead to serialization problems. "
-				+ "If you need to access a property of the session via the model use the "
-				+ "page instance as the model object and 'session.attribute' as the path.");
-		}
-
-		target = modelObject;
-	}
-
-	/**
-	 * Unsets this property model's instance variables and detaches the model.
-	 * 
-	 * @see org.apache.wicket.model.IDetachable#detach()
-	 */
-	@Override
-	public void detach()
-	{
-		// Detach nested object if it's a detachable
-		if (target instanceof IDetachable)
-		{
-			((IDetachable)target).detach();
-		}
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IChainingModel#getChainedModel()
-	 */
-	@Override
-	public IModel<?> getChainedModel()
-	{
-		if (target instanceof IModel)
-		{
-			return (IModel<?>)target;
-		}
-		return null;
+		super(modelObject);
 	}
 
 	/**
@@ -150,15 +99,6 @@ public abstract class AbstractPropertyModel<T>
 	}
 
 	/**
-	 * @see org.apache.wicket.model.IChainingModel#setChainedModel(org.apache.wicket.model.IModel)
-	 */
-	@Override
-	public void setChainedModel(IModel<?> model)
-	{
-		target = model;
-	}
-
-	/**
 	 * Applies the property expression on the model object using the given object argument.
 	 * 
 	 * @param object
@@ -174,13 +114,14 @@ public abstract class AbstractPropertyModel<T>
 		{
 			// TODO check, really do this?
 			// why not just set the target to the object?
+			Object target = getPlainTarget();
 			if (target instanceof IModel)
 			{
 				((IModel<T>)target).setObject(object);
 			}
 			else
 			{
-				target = object;
+				setPlainTarget(object);
 			}
 		}
 		else
@@ -193,36 +134,6 @@ public abstract class AbstractPropertyModel<T>
 	}
 
 	/**
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString()
-	{
-	 StringBuilder sb = new StringBuilder("Model:classname=[");
-		sb.append(getClass().getName()).append("]");
-		sb.append(":nestedModel=[").append(target).append("]");
-		return sb.toString();
-	}
-
-	/**
-	 * @return The target object
-	 */
-	public final Object getTarget()
-	{
-		Object object = target;
-		while (object instanceof IModel)
-		{
-			Object tmp = ((IModel<?>)object).getObject();
-			if (tmp == object)
-			{
-				break;
-			}
-			object = tmp;
-		}
-		return object;
-	}
-
-	/**
 	 * @return model object class
 	 */
 	@Override
@@ -249,11 +160,11 @@ public abstract class AbstractPropertyModel<T>
 				// ignore.
 			}
 		}
-		else if (this.target instanceof IObjectClassAwareModel)
+		else if (getPlainTarget() instanceof IObjectClassAwareModel)
 		{
 			try
 			{
-				Class<?> targetClass = ((IObjectClassAwareModel<?>)this.target).getObjectClass();
+				Class<?> targetClass = ((IObjectClassAwareModel<?>)getPlainTarget()).getObjectClass();
 				if (targetClass != null)
 				{
 					return PropertyResolver.getPropertyClass(expression, targetClass);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e1d28429/wicket-core/src/main/java/org/apache/wicket/model/ChainingModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/ChainingModel.java b/wicket-core/src/main/java/org/apache/wicket/model/ChainingModel.java
new file mode 100644
index 0000000..97545a4
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/model/ChainingModel.java
@@ -0,0 +1,173 @@
+/*
+ * 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 org.apache.wicket.Session;
+import org.apache.wicket.util.lang.Args;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Default implementation of IChainingModel
+ *
+ * @param <T>
+ *            The Model object type
+ *
+ * @see CompoundPropertyModel
+ * @see AbstractPropertyModel
+ *
+ * @since 6.0.0
+ */
+public abstract class ChainingModel<T> implements IChainingModel<T>
+{
+	private static final Logger LOG = LoggerFactory.getLogger(ChainingModel.class);
+
+	/** Any model object (which may or may not implement IModel) */
+	private Object target;
+
+	public ChainingModel(final Object modelObject)
+	{
+		Args.notNull(modelObject, "modelObject");
+
+		if (modelObject instanceof Session)
+		{
+			LOG.warn("It is not a good idea to reference the Session instance "
+					+ "in models directly as it may lead to serialization problems. "
+					+ "If you need to access a property of the session via the model use the "
+					+ "page instance as the model object and 'session.attribute' as the path.");
+		}
+
+		target = modelObject;
+	}
+
+	/**
+	 * Unsets this property model's instance variables and detaches the model.
+	 *
+	 * @see org.apache.wicket.model.IDetachable#detach()
+	 */
+	@Override
+	public void detach()
+	{
+		// Detach nested object if it's a detachable
+		if (target instanceof IDetachable)
+		{
+			((IDetachable)target).detach();
+		}
+	}
+
+	/**
+	 * @see org.apache.wicket.model.IModel#setObject(java.lang.Object)
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public void setObject(T object)
+	{
+		if (target instanceof IModel)
+		{
+			((IModel<T>)target).setObject(object);
+		}
+		else
+		{
+			target = object;
+		}
+	}
+
+	/**
+	 * @see org.apache.wicket.model.IModel#getObject()
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public T getObject()
+	{
+		if (target instanceof IModel)
+		{
+			return ((IModel<T>)target).getObject();
+		}
+		return (T)target;
+	}
+
+	/**
+	 * @see org.apache.wicket.model.IChainingModel#getChainedModel()
+	 */
+	@Override
+	public IModel<?> getChainedModel()
+	{
+		if (target instanceof IModel)
+		{
+			return (IModel<?>)target;
+		}
+		return null;
+	}
+
+	/**
+	 * @see org.apache.wicket.model.IChainingModel#setChainedModel(org.apache.wicket.model.IModel)
+	 */
+	@Override
+	public void setChainedModel(IModel<?> model)
+	{
+		target = model;
+	}
+
+	/**
+	 * @return The target - object or model
+	 */
+	protected final Object getPlainTarget()
+	{
+		return target;
+	}
+
+	/**
+	 * Sets a new target - object or model
+	 * @return this object
+	 */
+	protected final ChainingModel<T> setPlainTarget(final Object modelObject)
+	{
+		this.target = modelObject;
+		return this;
+	}
+
+	/**
+	 * @return The innermost model or the object if the target is not a model
+	 */
+	// legacy method ...
+	public final Object getTarget()
+	{
+		Object object = target;
+		while (object instanceof IModel)
+		{
+			Object tmp = ((IModel<?>)object).getObject();
+			if (tmp == object)
+			{
+				break;
+			}
+			object = tmp;
+		}
+		return object;
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString()
+	{
+		StringBuilder sb = new StringBuilder("Model:classname=[");
+		sb.append(getClass().getName()).append("]");
+		sb.append(":nestedModel=[").append(target).append("]");
+		return sb.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e1d28429/wicket-core/src/main/java/org/apache/wicket/model/CompoundPropertyModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/CompoundPropertyModel.java b/wicket-core/src/main/java/org/apache/wicket/model/CompoundPropertyModel.java
index 95fa53a..e0e3dc6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/CompoundPropertyModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/CompoundPropertyModel.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.model;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.util.string.AppendingStringBuffer;
 
 /**
  * A simple compound model which uses the component's name as the property expression to retrieve
@@ -36,12 +35,10 @@ import org.apache.wicket.util.string.AppendingStringBuffer;
  * @param <T>
  *            The model object type
  */
-public class CompoundPropertyModel<T> implements IComponentInheritedModel<T>, IChainingModel<T>
+public class CompoundPropertyModel<T> extends ChainingModel<T> implements IComponentInheritedModel<T>
 {
 	private static final long serialVersionUID = 1L;
 
-	private Object target;
-
 	/**
 	 * Constructor
 	 * 
@@ -50,7 +47,7 @@ public class CompoundPropertyModel<T> implements IComponentInheritedModel<T>, IC
 	 */
 	public CompoundPropertyModel(final IModel<T> model)
 	{
-		target = model;
+		super(model);
 	}
 
 	/**
@@ -61,72 +58,7 @@ public class CompoundPropertyModel<T> implements IComponentInheritedModel<T>, IC
 	 */
 	public CompoundPropertyModel(final T object)
 	{
-		target = object;
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IModel#getObject()
-	 */
-	@Override
-	@SuppressWarnings("unchecked")
-	public T getObject()
-	{
-		if (target instanceof IModel)
-		{
-			return ((IModel<T>)target).getObject();
-		}
-		return (T)target;
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IModel#setObject(java.lang.Object)
-	 */
-	@Override
-	@SuppressWarnings("unchecked")
-	public void setObject(T object)
-	{
-		if (target instanceof IModel)
-		{
-			((IModel<T>)target).setObject(object);
-		}
-		else
-		{
-			target = object;
-		}
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IChainingModel#getChainedModel()
-	 */
-	@Override
-	public IModel<?> getChainedModel()
-	{
-		if (target instanceof IModel)
-		{
-			return (IModel<?>)target;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IChainingModel#setChainedModel(org.apache.wicket.model.IModel)
-	 */
-	@Override
-	public void setChainedModel(IModel<?> model)
-	{
-		target = model;
-	}
-
-	/**
-	 * @see org.apache.wicket.model.IDetachable#detach()
-	 */
-	@Override
-	public void detach()
-	{
-		if (target instanceof IDetachable)
-		{
-			((IDetachable)target).detach();
-		}
+		super(object);
 	}
 
 	/**
@@ -155,6 +87,7 @@ public class CompoundPropertyModel<T> implements IComponentInheritedModel<T>, IC
 	 * id of the Component isn't a valid property for the data object.
 	 * 
 	 * @param property
+	 *      the name that will be used to find
 	 * @return The IModel that is a wrapper around the current model and the property
 	 * @param <S>
 	 *            the type of the property
@@ -222,21 +155,10 @@ public class CompoundPropertyModel<T> implements IComponentInheritedModel<T>, IC
 	}
 
 	/**
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString()
-	{
-		AppendingStringBuffer sb = new AppendingStringBuffer().append("Model:classname=[" +
-			getClass().getName() + "]");
-		sb.append(":nestedModel=[").append(target).append("]");
-		return sb.toString();
-	}
-
-	/**
 	 * Type-infering factory method
 	 * 
 	 * @param <Z>
+	 *     the type of the model's object
 	 * @param model
 	 *            model
 	 * @return {@link CompoundPropertyModel} instance

http://git-wip-us.apache.org/repos/asf/wicket/blob/e1d28429/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java b/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
index df1e830..1d141fc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java
@@ -19,6 +19,8 @@ package org.apache.wicket.model;
 import java.io.Serializable;
 
 import junit.framework.TestCase;
+import org.junit.Assert;
+import org.junit.Test;
 
 /**
  * <p>
@@ -29,12 +31,13 @@ import junit.framework.TestCase;
  * @see <a href="https://issues.apache.org/jira/browse/WICKET-2937">WICKET-2937</a>
  * @author Pedro Santos
  */
-public class AbstractPropertyModelObjectClassTest extends TestCase
+public class AbstractPropertyModelObjectClassTest extends Assert
 {
 
 	/**
 	 * 
 	 */
+	@Test
 	public void testCompoundPropertyModel()
 	{
 		assertPropertyModelTargetTypeIsInteger(new CompoundPropertyModel<CustomType>(
@@ -44,6 +47,7 @@ public class AbstractPropertyModelObjectClassTest extends TestCase
 	/**
 	 * 
 	 */
+	@Test
 	public void testCompoundPropertyModelBind()
 	{
 		CompoundPropertyModel<CustomBean> compoundPropertyModel = new CompoundPropertyModel<CustomBean>(
@@ -55,6 +59,7 @@ public class AbstractPropertyModelObjectClassTest extends TestCase
 	/**
 	 * 
 	 */
+	@Test
 	public void testModel()
 	{
 		assertPropertyModelTargetTypeIsInteger(new Model<CustomType>(new CustomType()));
@@ -78,6 +83,7 @@ public class AbstractPropertyModelObjectClassTest extends TestCase
 	 * 
 	 * @see <a href="https://issues.apache.org/jira/browse/WICKET-3253">WICKET-3253</a>
 	 */
+	@Test
 	public void testLazyClassResolution()
 	{
 		Model<CustomBean> modelCustomBean = new Model<CustomBean>(null);