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 <mgrigo...@apache.org>
Authored: Thu Mar 29 13:21:03 2012 +0200
Committer: Martin Tzvetanov Grigorov <mgrigo...@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());
+       }
 }

Reply via email to