You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2011/11/28 18:46:16 UTC

svn commit: r1207481 - in /wicket/trunk/wicket-extensions/src: main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java

Author: pedro
Date: Mon Nov 28 17:46:15 2011
New Revision: 1207481

URL: http://svn.apache.org/viewvc?rev=1207481&view=rev
Log:
Preventing the AjaxEditableLabel from loose its model object type when initializing its editor component
Issue: WICKET-4259

Modified:
    wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
    wicket/trunk/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java

Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java?rev=1207481&r1=1207480&r2=1207481&view=diff
==============================================================================
--- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java (original)
+++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java Mon Nov 28 17:46:15 2011
@@ -30,6 +30,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.IObjectClassAwareModel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.string.JavaScriptUtils;
@@ -391,7 +392,7 @@ public class AjaxEditableLabel<T> extend
 	{
 		if (editor == null)
 		{
-			initLabelAndEditor(getDelegatingParentModel());
+			initLabelAndEditor(new WrapperModel());
 		}
 		return editor;
 	}
@@ -405,7 +406,7 @@ public class AjaxEditableLabel<T> extend
 	{
 		if (label == null)
 		{
-			initLabelAndEditor(getDelegatingParentModel());
+			initLabelAndEditor(new WrapperModel());
 		}
 		return label;
 	}
@@ -420,7 +421,7 @@ public class AjaxEditableLabel<T> extend
 		// lazily add label and editor
 		if (editor == null)
 		{
-			initLabelAndEditor(getDelegatingParentModel());
+			initLabelAndEditor(new WrapperModel());
 		}
 		// obsolete with WICKET-1919
 		// label.setEnabled(isEnabledInHierarchy());
@@ -510,35 +511,41 @@ public class AjaxEditableLabel<T> extend
 	}
 
 	/**
-	 * get a model that accesses the parent model lazily. this is required since we eventually
-	 * request the parents model before the component is added to the parent.
-	 * 
-	 * @return model
+	 * Model that accesses the parent model lazily. this is required since we eventually request the
+	 * parents model before the component is added to the parent.
 	 */
-	private IModel<T> getDelegatingParentModel()
+	private class WrapperModel implements IModel<T>, IObjectClassAwareModel<T>
 	{
-		return new IModel<T>()
+
+		public T getObject()
 		{
-			private static final long serialVersionUID = 1L;
+			return getParentModel().getObject();
+		}
 
-			public T getObject()
-			{
-				return getParentModel().getObject();
-			}
+		public void setObject(final T object)
+		{
+			getParentModel().setObject(object);
+		}
+
+		public void detach()
+		{
+			getParentModel().detach();
+
+		}
 
-			public void setObject(final T object)
+		public Class<T> getObjectClass()
+		{
+			if (getParentModel() instanceof IObjectClassAwareModel)
 			{
-				getParentModel().setObject(object);
+				return ((IObjectClassAwareModel)getParentModel()).getObjectClass();
 			}
-
-			public void detach()
+			else
 			{
-				getParentModel().detach();
+				return null;
 			}
-		};
+		}
 	}
 
-
 	/**
 	 * @return Gets the parent model in case no explicit model was specified.
 	 */

Modified: wicket/trunk/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java?rev=1207481&r1=1207480&r2=1207481&view=diff
==============================================================================
--- wicket/trunk/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java (original)
+++ wicket/trunk/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java Mon Nov 28 17:46:15 2011
@@ -16,11 +16,18 @@
  */
 package org.apache.wicket.extensions.ajax.markup.html;
 
+import java.util.Arrays;
+
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketTestCase;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.IObjectClassAwareModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.IWritableRequestParameters;
+import org.apache.wicket.util.string.StringValue;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -137,4 +144,34 @@ public class AjaxEditableTest extends Wi
 		tester.assertVisible("ajaxLabel:label");
 		tester.assertLabel("ajaxLabel:label", "something");
 	}
+
+	/**
+	 * <a href="https://issues.apache.org/jira/browse/WICKET-4259">WICKET-4259</a>
+	 */
+	@Test
+	public void testModelObjectClassInference()
+	{
+		class IntegerModel extends Model<Integer> implements IObjectClassAwareModel<Integer>
+		{
+
+			public Class<Integer> getObjectClass()
+			{
+				return Integer.class;
+			}
+		}
+		IModel<Integer> integerModel = new IntegerModel();
+		AjaxEditableLabel<Integer> editableLabel = new AjaxEditableLabel<Integer>("test",
+			integerModel);
+		editableLabel.getEditor().setVisible(true);
+
+		IWritableRequestParameters postParameters = (IWritableRequestParameters)tester.getRequestCycle()
+			.getRequest()
+			.getPostParameters();
+		postParameters.setParameterValues(editableLabel.getEditor().getInputName(),
+			Arrays.asList(new StringValue[] { StringValue.valueOf("5") }));
+		editableLabel.getEditor().processInput();
+
+		assertNotNull(integerModel.getObject());
+		assertTrue(integerModel.getObject() instanceof Integer);
+	}
 }
\ No newline at end of file