Author: jdonnerstag
Date: Sun Jul  4 14:19:54 2010
New Revision: 960339

URL: http://svn.apache.org/viewvc?rev=960339&view=rev
Log:
fixed WICKET-2882: IComponentResolver usage with Enclosure
Issue: WICKET-2882

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java 
Sun Jul  4 14:19:54 2010
@@ -34,6 +34,7 @@ import org.apache.wicket.markup.MarkupSt
 import org.apache.wicket.markup.MarkupType;
 import org.apache.wicket.markup.RawMarkup;
 import org.apache.wicket.markup.WicketTag;
+import org.apache.wicket.markup.html.border.Border;
 import org.apache.wicket.markup.resolver.ComponentResolvers;
 import org.apache.wicket.model.IComponentInheritedModel;
 import org.apache.wicket.model.IModel;
@@ -138,6 +139,24 @@ public abstract class MarkupContainer ex
                                throw new IllegalArgumentException("argument 
child may not be null");
                        }
 
+                       MarkupContainer parent = getParent();
+                       while (parent != null)
+                       {
+                               if (child == parent)
+                               {
+                                       String msg = "You can not add a 
component's parent as child to the component (loop): Component: " +
+                                               this.toString(false) + "; 
parent == child: " + parent.toString(false);
+                                       if (child instanceof 
Border.BorderBodyContainer)
+                                       {
+                                               msg += ". Please consider using 
Border.addToBorder(new " +
+                                                       
this.getClass().getSimpleName() + "(\"" + this.getId() +
+                                                       "\", ...) instead of 
add(...)";
+                                       }
+                                       throw new WicketRuntimeException(msg);
+                               }
+                               parent = parent.getParent();
+                       }
+
                        checkHierarchyChange(child);
 
                        if (log.isDebugEnabled())
@@ -951,14 +970,10 @@ public abstract class MarkupContainer ex
                }
 
                final Page page = findPage();
-
                if (page != null)
                {
                        child.initialize();
-               }
 
-               if (page != null)
-               {
                        // Tell the page a component has been added
                        page.componentAdded(child);
                }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
 Sun Jul  4 14:19:54 2010
@@ -23,12 +23,14 @@ import org.apache.wicket.application.ICo
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.EnclosureContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
 import org.apache.wicket.markup.parser.filter.EnclosureHandler;
+import org.apache.wicket.markup.resolver.ComponentResolvers;
+import org.apache.wicket.markup.resolver.IComponentResolver;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.response.NullResponse;
@@ -82,7 +84,7 @@ import org.slf4j.LoggerFactory;
  * @author Juergen Donnerstag
  * @since 1.3
  */
-public class Enclosure extends TransparentWebMarkupContainer
+public class Enclosure extends WebMarkupContainer implements IComponentResolver
 {
        private static final long serialVersionUID = 1L;
 
@@ -114,6 +116,25 @@ public class Enclosure extends Transpare
        }
 
        /**
+        * @see org.apache.wicket.Component#onInitialize()
+        */
+       @Override
+       protected void onInitialize()
+       {
+               super.onInitialize();
+
+               // enclosure's parent container
+               MarkupContainer container = getEnclosureParent();
+
+               // clear the cache
+               childComponent = null;
+
+               // get Child Component. If not "added", ask a resolver to find 
it.
+               childComponent = getChildComponent(new 
MarkupStream(getMarkup()), container);
+               checkChildComponent(childComponent);
+       }
+
+       /**
         * Get the real parent container
         * 
         * @return enclosure's parent markup container
@@ -121,7 +142,7 @@ public class Enclosure extends Transpare
        private MarkupContainer getEnclosureParent()
        {
                MarkupContainer parent = getParent();
-               while (parent.isAuto())
+               while ((parent != null) && parent.isAuto())
                {
                        parent = parent.getParent();
                }
@@ -139,16 +160,11 @@ public class Enclosure extends Transpare
         *      org.apache.wicket.markup.ComponentTag)
         */
        @Override
-       protected void onComponentTagBody(MarkupStream markupStream, 
ComponentTag openTag)
+       protected void onComponentTagBody(final MarkupStream markupStream, 
final ComponentTag openTag)
        {
-               // enclosure's parent container
-               MarkupContainer container = getEnclosureParent();
-
-               Component controller = container.get(childId.toString());
-               checkChildComponent(controller);
-
+               // TODO this is where I wish we had something like "enum(TAG, 
BODY, NONE, ALL) isVisible()"
                // set the enclosure visibility
-               boolean visible = controller.determineVisibility();
+               boolean visible = childComponent.determineVisibility();
 
                // We want to know which components are rendered inside the 
enclosure
                final IComponentOnAfterRenderListener listener = new 
EnclosureListener(this);
@@ -186,6 +202,59 @@ public class Enclosure extends Transpare
        }
 
        /**
+        * @param markupStream
+        * @param container
+        * @return The component associated with the
+        */
+       private Component getChildComponent(final MarkupStream markupStream, 
MarkupContainer container)
+       {
+               Component controller = container.get(childId.toString());
+               if (controller == null)
+               {
+                       int orgIndex = markupStream.getCurrentIndex();
+                       try
+                       {
+                               while (markupStream.hasMore())
+                               {
+                                       markupStream.next();
+                                       if 
(markupStream.skipUntil(ComponentTag.class))
+                                       {
+                                               ComponentTag tag = 
markupStream.getTag();
+                                               if ((tag != null) && 
(tag.isOpen() || tag.isOpenClose()))
+                                               {
+                                                       if 
(childId.equals(tag.getId()))
+                                                       {
+                                                               controller = 
ComponentResolvers.resolveByComponentHierarchy(
+                                                                       
container, markupStream, tag);
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       finally
+                       {
+                               markupStream.setCurrentIndex(orgIndex);
+                       }
+               }
+               return controller;
+       }
+
+       /**
+        * 
+        * @see 
org.apache.wicket.markup.resolver.IComponentResolver#resolve(org.apache.wicket.MarkupContainer,
+        *      org.apache.wicket.markup.MarkupStream, 
org.apache.wicket.markup.ComponentTag)
+        */
+       public Component resolve(MarkupContainer container, MarkupStream 
markupStream, ComponentTag tag)
+       {
+               if (childId.equals(tag.getId()))
+               {
+                       return childComponent;
+               }
+               return getEnclosureParent().get(tag.getId());
+       }
+
+       /**
         * 
         * @param controller
         */
@@ -218,6 +287,7 @@ public class Enclosure extends Transpare
                /**
                 * @see 
org.apache.wicket.application.IComponentOnBeforeRenderListener#onBeforeRender(org.apache.wicket.Component)
                 */
+               @SuppressWarnings("unchecked")
                public void onAfterRender(final Component component)
                {
                        if (log.isWarnEnabled())

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/ComponentResolvers.java
 Sun Jul  4 14:19:54 2010
@@ -50,24 +50,28 @@ public class ComponentResolvers
                final MarkupStream markupStream, final ComponentTag tag)
        {
                // try to resolve using component hierarchy
+               Component component = resolveByComponentHierarchy(container, 
markupStream, tag);
 
-               Component cursor = container;
-               while (cursor != null)
+               if (component == null)
                {
-                       if (cursor instanceof IComponentResolver)
-                       {
-                               IComponentResolver resolver = 
(IComponentResolver)cursor;
-                               Component component = 
resolver.resolve(container, markupStream, tag);
-                               if (component != null)
-                               {
-                                       return component;
-                               }
-                       }
-                       cursor = cursor.getParent();
+                       // fallback to application-level resolvers
+                       component = resolveByApplication(container, 
markupStream, tag);
                }
 
-               // fallback to application-level resolvers
+               return component;
+       }
 
+       /**
+        * Attempts to resolve a component via application registered resolvers.
+        * 
+        * @param container
+        * @param markupStream
+        * @param tag
+        * @return Null, if no component was found
+        */
+       public static Component resolveByApplication(final MarkupContainer 
container,
+               final MarkupStream markupStream, final ComponentTag tag)
+       {
                for (final IComponentResolver resolver : Application.get()
                        .getPageSettings()
                        .getComponentResolvers())
@@ -81,4 +85,33 @@ public class ComponentResolvers
 
                return null;
        }
+
+       /**
+        * Attempts to resolve a component via the component hierarchy using 
resolvers.
+        * 
+        * @param container
+        * @param markupStream
+        * @param tag
+        * @return Null, if no component was found
+        */
+       public static Component resolveByComponentHierarchy(final 
MarkupContainer container,
+               final MarkupStream markupStream, final ComponentTag tag)
+       {
+               Component cursor = container;
+               while (cursor != null)
+               {
+                       if (cursor instanceof IComponentResolver)
+                       {
+                               IComponentResolver resolver = 
(IComponentResolver)cursor;
+                               Component component = 
resolver.resolve(container, markupStream, tag);
+                               if (component != null)
+                               {
+                                       return component;
+                               }
+                       }
+                       cursor = cursor.getParent();
+               }
+
+               return null;
+       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
 Sun Jul  4 14:19:54 2010
@@ -493,4 +493,13 @@ public class BufferedWebResponse extends
                        response.write(stream.toByteArray());
                }
        }
+
+       /**
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString()
+       {
+               return charSequenceAction.builder.toString();
+       }
 }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_11.html
 Sun Jul  4 14:19:54 2010
@@ -2,10 +2,10 @@
 <body>
        <wicket:enclosure child="autoCreatedPanel">
                <div>
-                       <span wicket:id="autoCreatedPanel"><span 
wicket:id="autoCreatedPanel"><wicket:panel>
+                       <span wicket:id="autoCreatedPanel"><wicket:panel>
        This is a simple test panel.
        With this component: <span wicket:id="label">hello world</span>
-</wicket:panel></span></span>
+</wicket:panel></span>
                </div>
        </wicket:enclosure>
 </body>

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePage_11.java
 Sun Jul  4 14:19:54 2010
@@ -43,12 +43,12 @@ public class EnclosurePage_11 extends We
 
        public Component resolve(MarkupContainer container, MarkupStream 
markupStream, ComponentTag tag)
        {
-               if (tag instanceof WicketTag)
+               if ((tag instanceof WicketTag) || 
!"autoCreatedPanel".equals(tag.getId()))
                {
                        // this resolver does not handle wicket tags
                        return null;
                }
 
-               return "autoCreatedPanel".equals(tag.getId()) ? new 
SimplePanel(tag.getId()) : null;
+               return new SimplePanel(tag.getId());
        }
 }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java?rev=960339&r1=960338&r2=960339&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/internal/EnclosureTest.java
 Sun Jul  4 14:19:54 2010
@@ -301,6 +301,4 @@ public class EnclosureTest extends Wicke
        {
                executeTest(EnclosurePage_11.class, 
"EnclosurePageExpectedResult_11.html");
        }
-
-
 }


Reply via email to