WICKET-5302 Using InlineEnclosure leads to two re-renderings of the controlling 
child component

Pass the original/modifiable map of components added to the AjaxRequestTarget 
for re-rendering to all registered AjaxRequestTarget.IListeners.
This way they can modify it if needed


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

Branch: refs/heads/5299-ajax-strategy
Commit: fa01402233fb56abc0709bcdc6f6a6c008a1abc7
Parents: f0cfce8
Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Authored: Tue Aug 6 16:41:16 2013 +0200
Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Committed: Tue Aug 6 16:41:16 2013 +0200

----------------------------------------------------------------------
 .../apache/wicket/ajax/AjaxRequestHandler.java  |  4 +---
 .../apache/wicket/ajax/AjaxRequestTarget.java   |  2 +-
 .../protocol/http/AjaxEnclosureListener.java    | 24 +++++++++++---------
 .../markup/html/internal/TogglePageTest.java    |  6 +++--
 4 files changed, 19 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
index 3de3519..a77f60f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
@@ -161,11 +161,9 @@ public class AjaxRequestHandler implements 
AjaxRequestTarget
 
                                if (listeners != null)
                                {
-                                       final Map<String, Component> components 
= Collections.unmodifiableMap(markupIdToComponent);
-
                                        for (AjaxRequestTarget.IListener 
listener : listeners)
                                        {
-                                               
listener.onBeforeRespond(components, AjaxRequestHandler.this);
+                                               
listener.onBeforeRespond(markupIdToComponent, AjaxRequestHandler.this);
                                        }
                                }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
index 662fe1f..bf4c284 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
@@ -44,7 +44,7 @@ public interface AjaxRequestTarget extends 
IPageRequestHandler, ILoggableRequest
                 * Triggered before ajax request target begins its response 
cycle
                 *
                 * @param map
-                *            read-only map:markupId->component of components 
already added to the target
+                *            modifiable map (markupId -> component) of 
components already added to the target
                 * @param target
                 *            the target itself. Could be used to add 
components or to append/prepend
                 *            javascript

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
index 1c583a7..f07be63 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AjaxEnclosureListener.java
@@ -16,9 +16,6 @@
  */
 package org.apache.wicket.protocol.http;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.wicket.Component;
@@ -70,18 +67,16 @@ public class AjaxEnclosureListener extends 
AjaxRequestTarget.AbstractListener
        @Override
        public void onBeforeRespond(final Map<String, Component> map, final 
AjaxRequestTarget target)
        {
-               // We need to iterate over the map, but the map changes if we 
add an
-               // InlineEnclosure to the target. --> make a copy of the map 
and iterate that instead.
-               final List<Component> originalComponents = 
Collections.unmodifiableList(new ArrayList<Component>(
-                       map.values()));
-
-               target.getPage().visitChildren(InlineEnclosure.class, new 
IVisitor<InlineEnclosure, Void>()
+               String key = 
target.getPage().visitChildren(InlineEnclosure.class, new 
IVisitor<InlineEnclosure, String>()
                {
                        @Override
-                       public void component(final InlineEnclosure enclosure, 
final IVisit<Void> visit)
+                       public void component(final InlineEnclosure enclosure, 
final IVisit<String> visit)
                        {
-                               for (Component component : originalComponents)
+                               for (Map.Entry<String, Component> entry : 
map.entrySet())
                                {
+                                       String key = entry.getKey();
+                                       Component component = entry.getValue();
+
                                        if (isControllerOfEnclosure(component, 
enclosure))
                                        {
                                                // update the visibility of the 
enclosure
@@ -89,10 +84,17 @@ public class AjaxEnclosureListener extends 
AjaxRequestTarget.AbstractListener
 
                                                // add enclosure to Ajax target
                                                target.add(enclosure);
+                                               visit.stop(key);
+                                               break;
                                        }
                                }
                        }
                });
+
+               if (key != null)
+               {
+                       map.remove(key);
+               }
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa014022/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
index 8a843f0..7d48517 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/TogglePageTest.java
@@ -127,7 +127,9 @@ public class TogglePageTest extends WicketTestCase
                {
                        // On
                        InlineEnclosureWithAdditionalAjaxTargetPage ajaxPage = 
(InlineEnclosureWithAdditionalAjaxTargetPage)tester.getLastRenderedPage();
-                       
tester.assertComponentOnAjaxResponse(ajaxPage.getLabel1());
+                       // WICKET-5302 - only the InlineEnclosure is in the 
Ajax response
+                       // Label1 is inside the InlineEncosure
+                       
tester.assertComponentOnAjaxResponse("wicket_InlineEnclosure-0");
                        
tester.assertComponentOnAjaxResponse(ajaxPage.getLabel2());
                        assertVisible(ajaxPage.getLabel1());
                        assertVisible(ajaxPage.getLabel2());
@@ -232,4 +234,4 @@ public class TogglePageTest extends WicketTestCase
        }
 
 
-}
\ No newline at end of file
+}

Reply via email to