You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Martin Grigorov <mg...@apache.org> on 2014/02/18 13:53:42 UTC

Re: [2/2] git commit: WICKET-3335 nested borders working. everything should be working. needs more cleanup and javadoc

On Sat, Feb 15, 2014 at 9:40 AM, <iv...@apache.org> 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 <ig...@gmail.com>
> Authored: Sat Feb 15 00:40:48 2014 -0800
> Committer: Igor Vaynberg <ig...@gmail.com>
> 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 &lt;wicket:body&gt; 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>
>
>

Re: [2/2] git commit: WICKET-3335 nested borders working. everything should be working. needs more cleanup and javadoc

Posted by Igor Vaynberg <ig...@gmail.com>.
On Tue, Feb 18, 2014 at 4:53 AM, Martin Grigorov <mg...@apache.org> wrote:
>
>
>
> On Sat, Feb 15, 2014 at 9:40 AM, <iv...@apache.org> 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 <ig...@gmail.com>
>> Authored: Sat Feb 15 00:40:48 2014 -0800
>> Committer: Igor Vaynberg <ig...@gmail.com>
>> 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

its not necessary, its a convenience. one of the things that people
forget to do is to call something.add(getBodyContainer()) when they
nest border body inside other components in the border. case and
point, you forgot to do that in your initial test impl. queuing the
body container will automatically place it into the correct parent. i
tweaked the code so its no longer necessary, so we still now add it by
default to Border like we used to.

-igor


>
>>
>>         }
>>
>>         /**
>> @@ -398,7 +399,7 @@ public abstract class Border extends
>> WebMarkupContainer implements IComponentRes
>>         /**
>>          * The container to be associated with the &lt;wicket:body&gt; 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>
>>
>