Markup driven tree - add functionality to make Enclosure first class citizen in the component tree
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/fa68ce99 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/fa68ce99 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/fa68ce99 Branch: refs/heads/markup-driven-component-tree Commit: fa68ce99a4c478c4d966ad310e36c0c22a0bc716 Parents: e801a5f Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Jan 23 15:44:24 2014 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Jan 23 15:44:24 2014 +0200 ---------------------------------------------------------------------- .../org/apache/wicket/ComponentTreeBuilder.java | 47 ++++++++++++++------ .../wicket/markup/html/internal/Enclosure.java | 6 +++ .../markupdriventree/MarkupDrivenTreeTest.java | 19 +++++++- .../PageWithAutoPanelWithinEnclosure.html | 30 +++++++++++++ .../PageWithAutoPanelWithinEnclosure.java | 18 ++++++++ .../markupdriventree/components/PanelA.html | 2 - 6 files changed, 105 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/main/java/org/apache/wicket/ComponentTreeBuilder.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ComponentTreeBuilder.java b/wicket-core/src/main/java/org/apache/wicket/ComponentTreeBuilder.java index 28d487e..556581f 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ComponentTreeBuilder.java +++ b/wicket-core/src/main/java/org/apache/wicket/ComponentTreeBuilder.java @@ -3,10 +3,10 @@ package org.apache.wicket; import java.lang.reflect.Field; import org.apache.wicket.markup.ComponentTag; -import org.apache.wicket.markup.IMarkup; import org.apache.wicket.markup.IMarkupFragment; -import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.MarkupStream; +import org.apache.wicket.markup.WicketTag; +import org.apache.wicket.markup.resolver.ComponentResolvers; /** * @@ -30,28 +30,47 @@ class ComponentTreeBuilder while (stream.skipUntil(ComponentTag.class)) { ComponentTag tag = stream.getTag(); + if (!tag.isAutoComponentTag() && (tag.isOpen() || tag.isOpenClose())) { String componentId = tag.getId(); - Component component = container.get(componentId); - if (component == null) + + if (tag instanceof WicketTag) { - try + Component component = ComponentResolvers.resolve(container, stream, tag, null); + if ((component != null) && (component.getParent() == null)) { - component = findAutoAnnotatedComponent(container, componentId); - - if (component != null) + if (component.getId().equals(tag.getId()) == false) { - container.add(component); + // make sure we are able to get() the component during rendering + tag.setId(component.getId()); + tag.setModified(true); } - - } catch (Exception e) - { - throw new WicketRuntimeException(e); + container.add(component); } } + else + { + Component component = container.get(componentId); + if (component == null) + { + try + { + component = findAutoAnnotatedComponent(container, componentId); + + if (component != null) + { + container.add(component); + } - print(tag); + } catch (Exception e) + { + throw new WicketRuntimeException(e); + } + } + + print(tag); + } } if (tag.isOpen()) http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java index 8a3c8e5..22866ae 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java @@ -178,6 +178,12 @@ public class Enclosure extends WebMarkupContainer implements IComponentResolver { String fullChildId = getChildId(); + Component child = get(fullChildId); + if (child != null) + { + return child; + } + Component controller = enclosureParent.get(fullChildId); if (controller == null) { http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/test/java/org/apache/wicket/markupdriventree/MarkupDrivenTreeTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/MarkupDrivenTreeTest.java b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/MarkupDrivenTreeTest.java index 5b2af28..1a42cda 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/MarkupDrivenTreeTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/MarkupDrivenTreeTest.java @@ -1,10 +1,14 @@ package org.apache.wicket.markupdriventree; +import org.apache.wicket.Component; +import org.apache.wicket.MarkupContainer; import org.apache.wicket.WicketTestCase; +import org.apache.wicket.markup.html.internal.Enclosure; import org.apache.wicket.markupdriventree.components.ComponentA; import org.apache.wicket.markupdriventree.components.ComponentB; import org.apache.wicket.markupdriventree.components.ComponentC; import org.apache.wicket.markupdriventree.components.PanelA; +import org.hamcrest.Matchers; import org.junit.Test; /** @@ -55,7 +59,6 @@ public class MarkupDrivenTreeTest extends WicketTestCase tester.assertComponent("panelA:a", ComponentA.class); } - @Test public void pageWithManuallyAddedPanel() { @@ -68,4 +71,18 @@ public class MarkupDrivenTreeTest extends WicketTestCase tester.assertComponent("panelA", PanelA.class); tester.assertComponent("panelA:a", ComponentA.class); } + + @Test + public void pageWithManuallyAddedPanelPlusEnclosure() + { + PageWithAutoPanelWithinEnclosure page = tester.startPage(PageWithAutoPanelWithinEnclosure.class); + + tester.assertComponent("c", ComponentC.class); + tester.assertComponent("b", ComponentB.class); + tester.assertComponent("b:a", ComponentA.class); + + Component panelA = page.panelA; + MarkupContainer parent = panelA.getParent(); + assertThat("PanelA's parent must be the Enclosure", parent, Matchers.instanceOf(Enclosure.class)); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.html b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.html new file mode 100644 index 0000000..4c3e9e5 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> + <head> + <meta charset="utf-8" /> + <title>Page with panel</title> + </head> + <body> + <div id="hd"> + <div id="logo"> + <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" /> + <h1>Apache Wicket</h1> + </div> + </div> + <div id="bd"> + + <div wicket:id="c"> + </div> + + <div wicket:id="b"> + <div wicket:id="a"></div> + </div> + + <wicket:enclosure child="panelA"> + <div wicket:id="panelA"></div> + </wicket:enclosure> + + </div> + + </body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.java b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.java new file mode 100644 index 0000000..d9ebe99 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/PageWithAutoPanelWithinEnclosure.java @@ -0,0 +1,18 @@ +package org.apache.wicket.markupdriventree; + +import org.apache.wicket.Auto; +import org.apache.wicket.markupdriventree.components.PanelA; + +/** + * + */ +public class PageWithAutoPanelWithinEnclosure extends BasePage +{ + @Auto + PanelA panelA; + + public PageWithAutoPanelWithinEnclosure() + { + panelA = new PanelA("panelA"); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/fa68ce99/wicket-core/src/test/java/org/apache/wicket/markupdriventree/components/PanelA.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/components/PanelA.html b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/components/PanelA.html index 9700fcc..4519cde 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markupdriventree/components/PanelA.html +++ b/wicket-core/src/test/java/org/apache/wicket/markupdriventree/components/PanelA.html @@ -6,8 +6,6 @@ <div wicket:id="a"> - - </div> </wicket:panel>
