You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2010/07/04 16:19:54 UTC

svn commit: r960339 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/markup/html/internal/ main/java/org/apache/wicket/markup/resolver/ main/java/org/apache/wicket/protocol/http/ test/java/org/apache/wicket/markup...

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");
 	}
-
-
 }