On Sat, Feb 15, 2014 at 9:40 AM, <[email protected]> wrote:
> WICKET-3335 nested borders working. everything should be working. needs
> more cleanup and javadoc
>
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/384d748c
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/384d748c
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/384d748c
>
> Branch: refs/heads/sandbox/component-queueing-2
> Commit: 384d748c150031fa584aa44fce2f0a7e05e98531
> Parents: 14797ed
> Author: Igor Vaynberg <[email protected]>
> Authored: Sat Feb 15 00:40:48 2014 -0800
> Committer: Igor Vaynberg <[email protected]>
> Committed: Sat Feb 15 00:40:48 2014 -0800
>
> ----------------------------------------------------------------------
> .../java/org/apache/wicket/DequeueContext.java | 5 +-
> .../java/org/apache/wicket/MarkupContainer.java | 11 +-
> .../wicket/markup/html/border/Border.java | 102 ++++++++++++++++++-
> .../wicket/queueing/ComponentQueueingTest.java | 24 ++---
> .../org/apache/wicket/queueing/HasPath.java | 7 +-
> .../queueing/nestedborders/OuterBorder.html | 2 +-
> 6 files changed, 128 insertions(+), 23 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
> b/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
> index 8324161..4e62c3e 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
> @@ -1,13 +1,14 @@
> package org.apache.wicket;
>
> import org.apache.wicket.markup.ComponentTag;
> +import org.apache.wicket.markup.IMarkupFragment;
> import org.apache.wicket.markup.Markup;
> import org.apache.wicket.markup.MarkupElement;
> import org.apache.wicket.util.collections.ArrayListStack;
>
> public class DequeueContext
> {
> - private final Markup markup;
> + private final IMarkupFragment markup;
> private int index;
> private ComponentTag next;
> private ArrayListStack<ComponentTag> tags = new ArrayListStack<>();
> @@ -37,7 +38,7 @@ public class DequeueContext
> }
> }
>
> - public DequeueContext(Markup markup, MarkupContainer root)
> + public DequeueContext(IMarkupFragment markup, MarkupContainer root)
> {
> this.markup = markup;
> containers.push(root);
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/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 72f7cc9..e213f35 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
> @@ -2080,7 +2080,7 @@ public abstract class MarkupContainer extends
> Component implements Iterable<Comp
>
> private void internalDequeue()
> {
> - Markup markup = getAssociatedMarkup();
> + IMarkupFragment markup = getDequeueMarkup();
> if (markup == null)
> {
> // markup not found, skip dequeuing
> @@ -2121,7 +2121,7 @@ public abstract class MarkupContainer extends
> Component implements Iterable<Comp
>
> if (child != null)
> {
> - add(child);
> + addDequeuedComponent(child, tag);
> if (child instanceof IQueueRegion)
> {
>
> ((MarkupContainer)child).dequeue();
> @@ -2159,6 +2159,11 @@ public abstract class MarkupContainer extends
> Component implements Iterable<Comp
> }
>
> }
> +
> + protected IMarkupFragment getDequeueMarkup() {
> + return getAssociatedMarkup();
> + }
> +
> protected boolean supportsDequeueingFrom(ComponentTag tag) {
> if (tag instanceof WicketTag) {
> WicketTag wicketTag=(WicketTag)tag;
> @@ -2172,7 +2177,7 @@ public abstract class MarkupContainer extends
> Component implements Iterable<Comp
> return true;
> }
>
> - protected Component findComponentToDequeue(ComponentTag tag)
> + public Component findComponentToDequeue(ComponentTag tag)
> {
> return queue == null ? null : queue.remove(tag.getId());
> }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
> index 3c5b0d7..54fa141 100644
> ---
> a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
> +++
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
> @@ -26,6 +26,7 @@ import org.apache.wicket.markup.MarkupException;
> import org.apache.wicket.markup.MarkupFragment;
> import org.apache.wicket.markup.MarkupStream;
> import org.apache.wicket.markup.TagUtils;
> +import org.apache.wicket.markup.WicketTag;
> import org.apache.wicket.markup.html.WebMarkupContainer;
> import org.apache.wicket.markup.html.panel.BorderMarkupSourcingStrategy;
> import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
> @@ -162,7 +163,7 @@ public abstract class Border extends
> WebMarkupContainer implements IComponentRes
> super(id, model);
>
>
> body = new BorderBodyContainer(id + "_" + BODY);
> - addToBorder(body);
> + queueToBorder(body);
>
why it is necessary to use queueing for the border body ?
it makes me think that something got broken in the default ( add(child) )
functionality and maybe user applications that don't want to use queueing
will be required to
> }
>
> /**
> @@ -398,7 +399,7 @@ public abstract class Border extends
> WebMarkupContainer implements IComponentRes
> /**
> * The container to be associated with the <wicket:body> tag
> */
> - public class BorderBodyContainer extends WebMarkupContainer
> + public class BorderBodyContainer extends WebMarkupContainer
> implements IQueueRegion
> {
> private static final long serialVersionUID = 1L;
>
> @@ -535,5 +536,102 @@ public abstract class Border extends
> WebMarkupContainer implements IComponentRes
>
> return markup.find(child.getId());
> }
> +
> + protected IMarkupFragment getDequeueMarkup() {
> + Border border=findParent(Border.class);
> + IMarkupFragment
> fragment=findParent(Border.class).getMarkup();
> + /*
> + * we want to get the contents of the border here
> (the markup that
> + * is represented by the body tag) to do this we
> need to strip the
> + * tag that the border is attached to (usually the
> first tag)
> + */
> +
> + int i=0;
> + while (i<fragment.size()) {
> + MarkupElement element=fragment.get(i);
> + if (element instanceof
> ComponentTag&&((ComponentTag)element).getId().equals(border.getId()) ){
> + break;
> + }
> + i++;
> + }
> +
> + if (i>=fragment.size()) {
> + throw new IllegalStateException("Could not
> find starting border tag for border: "+border.getId()+" in markup:
> "+fragment);
> + }
> +
> +
> + /*
> + * (i) is now at the border tag, find the next
> component tag which
> + */
> +
> + i++;
> + while (i<fragment.size()) {
> + MarkupElement element = fragment.get(i);
> + if (element instanceof ComponentTag) {
> + break;
> + }
> + i++;
> + }
> +
> + ComponentTag tag=(ComponentTag) fragment.get(i);
> + if (tag.isClose()) {
> + // this closes the border tag, border only
> has raw markup
> + return null;
> + }
> +
> + return new MarkupFragment(fragment, i);
> +
> +
> + }
> +
> + @Override
> + public Component findComponentToDequeue(ComponentTag tag) {
> + /* the body container is allowed to search for
> queued components
> + * all the way to the page even though it is an
> IQueueRegion so it can
> + * find components queueud below the border
> + */
> +
> + Component
> component=super.findComponentToDequeue(tag);
> + if (component!=null) {
> + return component;
> + }
> +
> + MarkupContainer cursor=getParent();
> + while (cursor!=null) {
> +
> component=cursor.findComponentToDequeue(tag);
> + if (component!=null) {
> + return component;
> + }
> + if (cursor instanceof BorderBodyContainer)
> {
> + // optimization - find call above
> wouldve already recursed to page
> + break;
> + }
> + cursor=cursor.getParent();
> + }
> + return null;
> + }
> + }
> +
> +
> + @Override
> + protected boolean supportsDequeueingFrom(ComponentTag tag) {
> + if ((tag instanceof
> WicketTag)&&((WicketTag)tag).isBodyTag()) {
> + return true;
> + }
> +
> + return super.supportsDequeueingFrom(tag);
> + }
> +
> + @Override
> + public Component findComponentToDequeue(ComponentTag tag) {
> + if ((tag instanceof
> WicketTag)&&((WicketTag)tag).isBodyTag()) {
> + return getBodyContainer();
> + }
> + return super.findComponentToDequeue(tag);
> + }
> +
> + @Override
> + protected void addDequeuedComponent(Component component,
> ComponentTag tag) {
> + addToBorder(component);
> }
> }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
> b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
> index 751462e..e716329 100644
> ---
> a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
> +++
> b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
> @@ -584,22 +584,21 @@ public class ComponentQueueingTest extends
> WicketTestCase
> MarkupContainer a = new A(), b = new B(), r = new R(), s =
> new S();
>
> TestBorder border = new TestBorder("border");
> - border.setBorderMarkup("<wicket:border><p wicket:id='r'><p
> wicket:id='s'>" +
> - "<wicket:body/></p></p></wicket:border>");
> + border.setBorderMarkup("<wicket:border><b1
> wicket:id='r'><b2 wicket:id='s'>" +
> +
> "<wicket:body/></b2></b1></wicket:border>");
> border.queueToBorder(r, s);
>
> TestPage p = new TestPage();
> - p.setPageMarkup("<p wicket:id='a'><p wicket:id='border'><p
> wicket:id='b'></p></p></p>");
> + p.setPageMarkup("<out1 wicket:id='a'><p
> wicket:id='border'><in1 wicket:id='b'></in1></p></out1>");
>
> p.queue(a, border, b);
>
> tester.startPage(p);
>
> - assertThat(p, hasPath(new Path(a, border, r, s)));
> - assertThat(p, hasPath(new Path(a, border,
> border.getBodyContainer(), b)));
> + assertThat(p, hasPath(new Path(a, border, r, s,
> border.getBodyContainer(), b)));
> }
>
> - @Ignore
> +
> @Test
> public void dequeueWithNestedBorders()
> {
> @@ -613,19 +612,18 @@ public class ComponentQueueingTest extends
> WicketTestCase
>
> innerBorder.queueToBorder(c, d);
>
> - // TODO WICKET-3335 Where to queue 's' to make it work ?!
> - outerBorder.queue(s);
> + outerBorder.queueToBorder(s);
> +
>
> TestPage p = new TestPage();
> p.setPageMarkup("<p wicket:id='a'><p
> wicket:id='outerBorder'><p wicket:id='b'></p></p></p>");
> -
> +
> p.queue(b, outerBorder, a);
>
> tester.startPage(p);
> -
> - assertThat(p, hasPath(new Path(a, outerBorder,
> outerBorder.getBodyContainer(), b)));
> - assertThat(p, hasPath(new Path(a, outerBorder, r,
> innerBorder, c, d)));
> - assertThat(p, hasPath(new Path(a, outerBorder, r,
> innerBorder, innerBorder.getBodyContainer(), s)));
> +
> + assertThat(p, hasPath(new Path(a, outerBorder, r,
> innerBorder, c, d, innerBorder.getBodyContainer(), s)));
> + assertThat(p, hasPath(new Path(a, outerBorder, r,
> outerBorder.getBodyContainer(), b)));
> }
>
> private static class A extends WebMarkupContainer
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java
> b/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java
> index 3095095..3613f1f 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/queueing/HasPath.java
> @@ -48,11 +48,14 @@ class HasPath extends TypeSafeMatcher<Component>
> return false;
> }
>
> - cursor =
> ((MarkupContainer)cursor).get(path.get(i).getId());
> - if (cursor == null)
> + String id = path.get(i).getId();
> + Component child =
> ((MarkupContainer)cursor).get(id);
> + if (child== null)
> {
> return false;
> }
> +
> + cursor=child;
> if
> (!path.get(i).getType().isAssignableFrom(cursor.getClass()))
> {
> return false;
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/384d748c/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html
> ----------------------------------------------------------------------
> diff --git
> a/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html
> b/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html
> index cbe392d..4986b1d 100644
> ---
> a/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html
> +++
> b/wicket-core/src/test/java/org/apache/wicket/queueing/nestedborders/OuterBorder.html
> @@ -3,7 +3,7 @@
> <wicket:border>
> <p wicket:id="r">
> <p wicket:id="innerBorder">
> - <p wicket="s"></p>
> + <p wicket:id="s"></p>
> </p>
> <wicket:body/>
> </p>
>
>