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 +}