Repository: wicket Updated Branches: refs/heads/master 3f1e1dfe3 -> b92591f64
WICKET-5724 Queueing component in autocomponent Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b92591f6 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b92591f6 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b92591f6 Branch: refs/heads/master Commit: b92591f6496c15bf5615765539017ad702c67a43 Parents: 3f1e1df Author: adelbene <[email protected]> Authored: Mon Oct 13 20:07:01 2014 +0200 Committer: adelbene <[email protected]> Committed: Mon Oct 13 20:07:01 2014 +0200 ---------------------------------------------------------------------- .../java/org/apache/wicket/MarkupContainer.java | 2 +- .../org/apache/wicket/markup/ComponentTag.java | 3 +- .../markup/parser/filter/EnclosureHandler.java | 2 +- .../parser/filter/HtmlHeaderSectionHandler.java | 4 +- .../parser/filter/InlineEnclosureHandler.java | 2 +- .../filter/RelativePathPrefixHandler.java | 69 +++++++++++++++++--- .../markup/resolver/IComponentResolver.java | 2 + ...eueingTransparentWebMarkupContainerTest.java | 48 ++++++++++++-- .../TransparentContainerQueuePage.html | 12 ++++ .../TransparentContainerQueuePage.java | 32 +++++++++ 10 files changed, 155 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java index b607b4e..1ec4f02 100644 --- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java +++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java @@ -1535,7 +1535,7 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp ComponentTag.IAutoComponentFactory autoComponentFactory = tag.getAutoComponentFactory(); if (autoComponentFactory != null) { - queue(autoComponentFactory.newComponent(tag)); + queue(autoComponentFactory.newComponent(this, tag)); } } } http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java b/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java index b572677..bffde4e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/ComponentTag.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import org.apache.wicket.Component; +import org.apache.wicket.MarkupContainer; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.parser.XmlTag; import org.apache.wicket.markup.parser.XmlTag.TagType; @@ -65,7 +66,7 @@ public class ComponentTag extends MarkupElement /** * Creates a new instance of auto component to be queued */ - Component newComponent(ComponentTag tag); + Component newComponent(MarkupContainer container, ComponentTag tag); } http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/EnclosureHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/EnclosureHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/EnclosureHandler.java index 4a47f38..098533c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/EnclosureHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/EnclosureHandler.java @@ -56,7 +56,7 @@ public final class EnclosureHandler extends AbstractMarkupFilter implements ICom private static final IAutoComponentFactory FACTORY = new IAutoComponentFactory() { @Override - public Component newComponent(ComponentTag tag) + public Component newComponent(MarkupContainer container, ComponentTag tag) { return new Enclosure(tag.getId(), tag .getAttribute(EnclosureHandler.CHILD_ATTRIBUTE)); http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java index 0f85964..6d08c95 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/HtmlHeaderSectionHandler.java @@ -49,8 +49,8 @@ import org.apache.wicket.markup.resolver.HtmlHeaderResolver; */ public final class HtmlHeaderSectionHandler extends AbstractMarkupFilter { - private static final String BODY = "body"; - private static final String HEAD = "head"; + public static final String BODY = "body"; + public static final String HEAD = "head"; /** The automatically assigned wicket:id to >head< tag */ public static final String HEADER_ID = "_header_"; http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/InlineEnclosureHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/InlineEnclosureHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/InlineEnclosureHandler.java index e3c953a..0014b92 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/InlineEnclosureHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/InlineEnclosureHandler.java @@ -127,7 +127,7 @@ public final class InlineEnclosureHandler extends AbstractMarkupFilter tag.setAutoComponentFactory(new ComponentTag.IAutoComponentFactory() { @Override - public Component newComponent(ComponentTag tag) + public Component newComponent(MarkupContainer container, ComponentTag tag) { String attributeName = getInlineEnclosureAttributeName(null); String childId = tag.getAttribute(attributeName); http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java index 0ae97ee..79edb52 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/RelativePathPrefixHandler.java @@ -86,8 +86,8 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter { String attrValue = tag.getAttributes().getString(attrName); - if ((attrValue != null) && (attrValue.startsWith("/") == false) && - (!attrValue.contains(":")) && !(attrValue.startsWith("#"))) + if ((attrValue != null) && (attrValue.startsWith("/") == false) + && (!attrValue.contains(":")) && !(attrValue.startsWith("#"))) { tag.getAttributes().put(attrName, UrlUtils.rewriteToContextRelative(attrValue, RequestCycle.get())); @@ -95,6 +95,14 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter } } }; + + /** + * https://issues.apache.org/jira/browse/WICKET-5724 + * + * Says if we are inside an head tag or wicket:head tag. + * + * */ + private boolean insideHead; /** * Constructor for the IComponentResolver role. @@ -106,8 +114,9 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter /** * Constructor for the IMarkupFilter role + * * @param markup - * The markup created by reading the markup file + * The markup created by reading the markup file */ public RelativePathPrefixHandler(final MarkupResourceStream markup) { @@ -119,30 +128,62 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter { if (tag.isClose()) { + if (isHeadTag(tag)) + { + //outside head tag + insideHead = false; + } + return tag; } + if (isHeadTag(tag)) + { + //inside head tag + insideHead = true; + } + String wicketIdAttr = getWicketNamespace() + ":" + "id"; // Don't touch any wicket:id component and any auto-components - if ((tag instanceof WicketTag) || (tag.isAutolinkEnabled() == true) || - (tag.getAttributes().get(wicketIdAttr) != null)) + if ((tag instanceof WicketTag) || (tag.isAutolinkEnabled() == true) + || (tag.getAttributes().get(wicketIdAttr) != null)) { return tag; } - + // Work out whether we have any attributes that require us to add a // behavior that prepends the relative path. for (String attrName : attributeNames) { String attrValue = tag.getAttributes().getString(attrName); - if ((attrValue != null) && (attrValue.startsWith("/") == false) && - (!attrValue.contains(":")) && !(attrValue.startsWith("#"))) + if ((attrValue != null) && (attrValue.startsWith("/") == false) + && (!attrValue.contains(":")) && !(attrValue.startsWith("#"))) { if (tag.getId() == null) { tag.setId(getWicketRelativePathPrefix(null)); tag.setAutoComponentTag(true); + + /** + * https://issues.apache.org/jira/browse/WICKET-5724 + * Transparent component inside page body must allow + * queued children components. + */ + if(!insideHead) + { + tag.setAutoComponentFactory(new ComponentTag.IAutoComponentFactory() + { + @Override + public Component newComponent(MarkupContainer container, ComponentTag tag) + { + String id = tag.getId() + container.getPage().getAutoIndex(); + tag.setId(id); + + return new TransparentWebMarkupContainer(id); + } + }); + } } tag.addBehavior(RELATIVE_PATH_BEHAVIOR); tag.setModified(true); @@ -152,7 +193,17 @@ public final class RelativePathPrefixHandler extends AbstractMarkupFilter return tag; } - + + private boolean isHeadTag(ComponentTag tag) + { + if (HtmlHeaderSectionHandler.HEAD.equalsIgnoreCase(tag.getName())) + { + return true; + } + + return false; + } + @Override public Component resolve(final MarkupContainer container, final MarkupStream markupStream, final ComponentTag tag) http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/main/java/org/apache/wicket/markup/resolver/IComponentResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/IComponentResolver.java b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/IComponentResolver.java index b8d1588..9e83b71 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/IComponentResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/IComponentResolver.java @@ -28,6 +28,8 @@ import org.apache.wicket.util.io.IClusterable; * are first looked up in a component's hierarchy before falling back to a list of * IComponentResolvers maintained in {@link PageSettings}. * + * NOTE: implementations for this interface must be thread-safe! + * * @see ComponentResolvers * * @author Juergen Donnerstag http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/DequeueingTransparentWebMarkupContainerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/DequeueingTransparentWebMarkupContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/DequeueingTransparentWebMarkupContainerTest.java index 4320aa0..7cc8e1d 100644 --- a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/DequeueingTransparentWebMarkupContainerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/DequeueingTransparentWebMarkupContainerTest.java @@ -16,20 +16,56 @@ */ package org.apache.wicket.queueing.transparentresolvers; +import org.apache.wicket.Component; +import org.apache.wicket.Page; import org.apache.wicket.WicketTestCase; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.util.visit.IVisit; +import org.apache.wicket.util.visit.IVisitor; import org.junit.Test; -/** - * Test case for: - * - https://issues.apache.org/jira/browse/WICKET-5572 - * - https://issues.apache.org/jira/browse/WICKET-5722 - */ public class DequeueingTransparentWebMarkupContainerTest extends WicketTestCase { + /** + * Test case for: + * - https://issues.apache.org/jira/browse/WICKET-5572 + * - https://issues.apache.org/jira/browse/WICKET-5722 + */ @Test - public void startSubPageWithTWMCinTheParentPage() { + public void startSubPageWithTWMCinTheParentPage() + { tester.startPage(SubPage.class); tester.assertRenderedPage(SubPage.class); tester.assertComponent("html", HtmlTag.class); } + + /** + * https://issues.apache.org/jira/browse/WICKET-5724 + * + * Transparent component inside page body must allow + * queued children components. + */ + @Test + public void queuedComponentsInsideTransparentContainer() + { + tester.startPage(TransparentContainerQueuePage.class); + tester.assertRenderedPage(TransparentContainerQueuePage.class); + + Page lastRenderedPage = tester.getLastRenderedPage(); + + //test if page contains the queued label + boolean containsQueuedLabel = lastRenderedPage.visitChildren(new IVisitor<Component, Boolean>() + { + @Override + public void component(Component component, IVisit<Boolean> visit) + { + if(component instanceof Label) + { + visit.stop(true); + } + } + }); + + assertTrue(containsQueuedLabel); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.html b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.html new file mode 100644 index 0000000..06e8f3f --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="UTF-8"> +<title>Insert title here</title> +</head> +<body> + <a href="ref/transparentContainer.html"> + <span wicket:id="queuedComponent"></span> + </a> +</body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/b92591f6/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java new file mode 100644 index 0000000..ba2c2d8 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.queueing.transparentresolvers; + +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +public class TransparentContainerQueuePage extends WebPage +{ + + public TransparentContainerQueuePage(PageParameters parameters) + { + super(parameters); + queue(new Label("queuedComponent", "Queued label.")); + } + +}
