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/29 13:21:32 UTC

git commit: WICKET-4483 Component#setDefaultModel() should call #modelChanging()

Updated Branches:
  refs/heads/master 5fa70b1e8 -> 53442bb4a


WICKET-4483 Component#setDefaultModel() should call #modelChanging()


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

Branch: refs/heads/master
Commit: 53442bb4a821c538a19a0d0b0b1f2a8dc954ada0
Parents: 5fa70b1
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Mar 29 13:21:03 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Mar 29 13:21:03 2012 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/Component.java |    8 +--
 .../test/java/org/apache/wicket/ComponentTest.java |   46 +++++++++++++++
 2 files changed, 48 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/53442bb4/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index fb56254..342f107 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -2985,15 +2985,11 @@ public abstract class Component
 		// Change model
 		if (wrappedModel != model)
 		{
-			if (wrappedModel != null)
-			{
-				addStateChange();
-			}
-
+			modelChanging();
 			setModelImpl(wrap(model));
+			modelChanged();
 		}
 
-		modelChanged();
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53442bb4/wicket-core/src/test/java/org/apache/wicket/ComponentTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/ComponentTest.java b/wicket-core/src/test/java/org/apache/wicket/ComponentTest.java
index f0961ef..c0c6041 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ComponentTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ComponentTest.java
@@ -17,11 +17,14 @@
 package org.apache.wicket;
 
 import java.lang.reflect.Method;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 import org.junit.Test;
 
 /**
@@ -148,4 +151,47 @@ public class ComponentTest extends WicketTestCase
 		component.setVisible(false);
 		assertFalse(component.isStateless());
 	}
+
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-4483
+	 *
+	 * setDefaultModel() should call modelChanging/modelChanged only if the new model
+	 * is different that the old one. The same as setDefaultModelObject().
+	 */
+	@Test
+	public void modelChange()
+	{
+		final AtomicBoolean modelChanging = new AtomicBoolean(false);
+		final AtomicBoolean modelChanged = new AtomicBoolean(false);
+
+		WebComponent component = new WebComponent("someId")
+		{
+			@Override
+			protected void onModelChanging()
+			{
+				super.onModelChanging();
+				modelChanging.set(true);
+			}
+
+			@Override
+			protected void onModelChanged()
+			{
+				super.onModelChanged();
+				modelChanged.set(true);
+			}
+		};
+
+		assertNull(component.getDefaultModel());
+		IModel<Integer> model = Model.of(1);
+
+		// set a model which is different that the old one (old = null, new = non-null)
+		component.setDefaultModel(model);
+		assertTrue(modelChanging.getAndSet(false));
+		assertTrue(modelChanged.getAndSet(false));
+
+		// set the same instance - no change notifications should happen
+		component.setDefaultModel(model);
+		assertFalse(modelChanging.get());
+		assertFalse(modelChanged.get());
+	}
 }