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/11/21 17:17:47 UTC

svn commit: r1037497 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/markup/html/ main/java/org/apache/wicket/markup/renderStrategy/ test/java/org/apache/wicket/markup/renderStrategy/

Author: jdonnerstag
Date: Sun Nov 21 16:17:47 2010
New Revision: 1037497

URL: http://svn.apache.org/viewvc?rev=1037497&view=rev
Log:
changes related execution order of header contributions (WICKET-2693)
Issue: WICKET-2693

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/WebPage.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategy.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/DeepChildFirstVisitor.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/IHeaderRenderStrategy.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ParentFirstHeaderRenderStrategy.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage1_ExpectedResult.html_2
    wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage2_ExpectedResult.html_2

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java Sun Nov 21 16:17:47 2010
@@ -275,6 +275,12 @@ public abstract class Page extends Marku
 		init();
 	}
 
+	/**
+	 * Construct.
+	 * 
+	 * @param parameters
+	 * @param model
+	 */
 	private Page(final PageParameters parameters, IModel<?> model)
 	{
 		super(null, model);
@@ -312,9 +318,8 @@ public abstract class Page extends Marku
 	 *            the listener of that component that is to be called
 	 */
 	// TODO Post-1.3: We should create a listener on Application like
-	// IComponentInstantiationListener
-	// that forwards to IAuthorizationStrategy for RequestListenerInterface
-	// invocations.
+	// IComponentInstantiationListener that forwards to IAuthorizationStrategy for
+	// RequestListenerInterface invocations.
 	public void afterCallComponent(final Component component,
 		final RequestListenerInterface listener)
 	{
@@ -380,6 +385,9 @@ public abstract class Page extends Marku
 		super.detachModels();
 	}
 
+	/**
+	 * @see org.apache.wicket.Component#prepareForRender(boolean)
+	 */
 	@Override
 	public void prepareForRender(boolean setRenderingFlag)
 	{
@@ -446,7 +454,6 @@ public abstract class Page extends Marku
 	 * MarkupContainer</code> then the rendering for that container is checked.
 	 * 
 	 * @param component
-	 * 
 	 */
 	public final void endComponentRender(Component component)
 	{
@@ -490,6 +497,10 @@ public abstract class Page extends Marku
 		return getPageId();
 	}
 
+	/**
+	 * 
+	 * @return page class
+	 */
 	public final Class<? extends Page> getPageClass()
 	{
 		return getClass();
@@ -888,7 +899,6 @@ public abstract class Page extends Marku
 		setNumericId(getSession().nextPageId());
 	}
 
-
 	/**
 	 * This method will be called for all components that are changed on the page So also auto
 	 * components or components that are not versioned.
@@ -909,23 +919,24 @@ public abstract class Page extends Marku
 
 	/**
 	 * 
-	 * @param s
+	 * @param stream
 	 * @throws IOException
 	 * @throws ClassNotFoundException
 	 */
-	void readPageObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException
+	void readPageObject(java.io.ObjectInputStream stream) throws IOException,
+		ClassNotFoundException
 	{
-		int id = s.readShort();
-		String name = (String)s.readObject();
+		int id = stream.readShort();
+		String name = (String)stream.readObject();
 
 		IPageSerializer ps = serializer.get();
 		if (ps != null)
 		{
-			ps.deserializePage(id, name, this, s);
+			ps.deserializePage(id, name, this, stream);
 		}
 		else
 		{
-			s.defaultReadObject();
+			stream.defaultReadObject();
 		}
 	}
 
@@ -936,7 +947,6 @@ public abstract class Page extends Marku
 	 */
 	protected Object writeReplace() throws ObjectStreamException
 	{
-
 		IPageSerializer ps = serializer.get();
 
 		if (ps != null)
@@ -1025,7 +1035,6 @@ public abstract class Page extends Marku
 		});
 	}
 
-
 	/**
 	 * 
 	 * @see org.apache.wicket.Component#onBeforeRender()
@@ -1196,7 +1205,6 @@ public abstract class Page extends Marku
 		}
 	}
 
-
 	/**
 	 * Set page stateless
 	 * 
@@ -1304,5 +1312,4 @@ public abstract class Page extends Marku
 		}
 		return (Page)session.getPageManager().getPage(id);
 	}
-
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/WebPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/WebPage.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/WebPage.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/WebPage.java Sun Nov 21 16:17:47 2010
@@ -22,6 +22,7 @@ import org.apache.wicket.markup.MarkupTy
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler;
+import org.apache.wicket.markup.renderStrategy.AbstractHeaderRenderStrategy;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Response;
@@ -135,7 +136,7 @@ public class WebPage extends Page
 	{
 		if (getRequestCycle().getResponse() instanceof WebResponse)
 		{
-			final WebResponse response = (WebResponse)getRequestCycle().getResponse();
+			WebResponse response = (WebResponse)getRequestCycle().getResponse();
 			setHeaders(response);
 		}
 
@@ -227,21 +228,7 @@ public class WebPage extends Page
 				getRequestCycle().setResponse(response);
 
 				// Render all header sections of all components on the page
-				renderHead(header);
-
-				// Make sure all Components interested in contributing to the header
-				// and there attached behaviors are asked.
-				final HtmlHeaderContainer finalHeader = header;
-				visitChildren(new IVisitor<Component, Void>()
-				{
-					/**
-					 * @see org.apache.wicket.IVisitor#component(org.apache.wicket.Component)
-					 */
-					public void component(final Component component, final IVisit<Void> visit)
-					{
-						component.renderHead(finalHeader);
-					}
-				});
+				AbstractHeaderRenderStrategy.get().renderHeader(header, getPage());
 				response.close();
 
 				if (response.getBuffer().length() > 0)

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/AbstractHeaderRenderStrategy.java Sun Nov 21 16:17:47 2010
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.markup.renderStrategy;
 
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -25,18 +24,19 @@ import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
 import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Generics;
 
 /**
  * An abstract implementation of a header render strategy which is only missing the code to traverse
  * the child hierarchy, since the sequence of that traversal is what will make the difference
  * between the different header render strategies.
  * 
- * Beside the child hierarchy the render sequence by default (may be changed via subclassing) is as
+ * Besides the child hierarchy the render sequence by default (may be changed via subclassing) is as
  * follows:
  * <ul>
  * <li>1. application level headers</li>
  * <li>2. the root component's headers</li>
- * <li>3. the childs hierarchy (to be implemented per subclass)</li>
+ * <li>3. the children hierarchy (to be implemented per subclass)</li>
  * </ul>
  * 
  * @author Juergen Donnerstag
@@ -46,56 +46,51 @@ public abstract class AbstractHeaderRend
 	/** Application level contributors */
 	private List<IHeaderContributor> renderHeadListeners;
 
-	/** It is not in IRenderSettings since it is highly experimental only */
-	private static IHeaderRenderStrategy strategy;
-
 	/**
 	 * @return Gets the strategy registered with the application
 	 */
 	public static IHeaderRenderStrategy get()
 	{
-		if (strategy == null)
+		// NOT OFFICIALLY SUPPORTED BY WICKET
+		// By purpose it is "difficult" to change to another render strategy.
+		// We don't want it to be modifiable by users, but we needed a way to easily test other
+		// strategies.
+		String className = System.getProperty("Wicket_HeaderRenderStrategy");
+		if (className != null)
 		{
-			// By purpose it is "difficult" to change to another render strategy.
-			// We don't want it to be modifiable by users, but we needed a way to easily test other
-			// strategies.
-			String className = System.getProperty("Wicket_HeaderRenderStrategy");
-			if (className != null)
+			Class<?> clazz = null;
+			try
 			{
-				Class<?> clazz = null;
-				try
-				{
-					clazz = Application.get()
-						.getApplicationSettings()
-						.getClassResolver()
-						.resolveClass(className);
-
-					if (clazz != null)
-					{
-						strategy = (IHeaderRenderStrategy)clazz.newInstance();
-					}
-				}
-				catch (ClassNotFoundException ex)
-				{
-					// ignore
-				}
-				catch (InstantiationException ex)
-				{
-					// ignore
-				}
-				catch (IllegalAccessException ex)
+				clazz = Application.get()
+					.getApplicationSettings()
+					.getClassResolver()
+					.resolveClass(className);
+
+				if (clazz != null)
 				{
-					// ignore
+					return (IHeaderRenderStrategy)clazz.newInstance();
 				}
 			}
+			catch (ClassNotFoundException ex)
+			{
+				// ignore
+			}
+			catch (InstantiationException ex)
+			{
+				// ignore
+			}
+			catch (IllegalAccessException ex)
+			{
+				// ignore
+			}
 		}
 
-		if (strategy == null)
-		{
-			strategy = new ParentFirstHeaderRenderStrategy();
-		}
+		// Our default header render strategy
+		// Pre 1.5
+		return new ParentFirstHeaderRenderStrategy();
 
-		return strategy;
+		// Since 1.5
+		// return new ChildFirstHeaderRenderStrategy();
 	}
 
 	/**
@@ -175,25 +170,8 @@ public abstract class AbstractHeaderRend
 	{
 		if (renderHeadListeners == null)
 		{
-			renderHeadListeners = new ArrayList<IHeaderContributor>();
+			renderHeadListeners = Generics.newArrayList();
 		}
 		renderHeadListeners.add(contributor);
 	}
-
-	/**
-	 * Remove an application level contributor
-	 * 
-	 * @param contributor
-	 */
-	public void removeListener(final IHeaderContributor contributor)
-	{
-		if (renderHeadListeners != null)
-		{
-			renderHeadListeners.remove(contributor);
-			if (renderHeadListeners.isEmpty())
-			{
-				renderHeadListeners = null;
-			}
-		}
-	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategy.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategy.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategy.java Sun Nov 21 16:17:47 2010
@@ -23,16 +23,13 @@ import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.visit.IVisit;
 
 /**
- * THIS IS EXPERIMENTAL ONLY. YOU MUST NOT USE IT IN YOUR APPLICATION. SOME WICKET CORE COMPONENT
- * WILL NOT WORK PROPERLY. THIS CLASS MAY AS WELL BE REMOVED AGAIN.
- * 
- * This a header render strategy which sequence is child->parent->root, and thus inverse to Wicket's
- * default implementation. To your application it means, that parent containers can effectively
- * replace child contributions, since their contribution is added to the markup after the child
- * ones.
+ * This a header render strategy implements a child->parent->root sequence, which is inverse to how
+ * it was until Wicket 1.5. It now allows parent containers to replace child contributions, since
+ * their contribution is added to the markup after the child ones. See {@link href
+ * https://issues.apache.org/jira/browse/WICKET-2693}.
  * 
  * Please note that irrespective of the render strategy, if the same header content (e.g. CSS file)
- * gets added twice to the header, only the first will be rendered and the 2nd will skipped.
+ * gets added twice to the header, only the first will be rendered and the 2nd will be skipped.
  * 
  * @author Juergen Donnerstag
  */
@@ -84,39 +81,17 @@ public class ChildFirstHeaderRenderStrat
 			new DeepChildFirstVisitor()
 			{
 				@Override
-				public void component(final Component component, final IVisit<Component> visit)
+				public void component(final Component component, final IVisit<Void> visit)
 				{
 					component.renderHead(headerContainer);
 				}
+
+				@Override
+				public boolean preCheck(Component component)
+				{
+					return component.isVisibleInHierarchy();
+				}
 			}.visit(rootComponent);
 		}
 	}
-
-	/**
-	 * In case you need mixed strategies depending on the component, you can subclass this method
-	 * and return true when traversing shall stop of that specific component.
-	 * 
-	 * This check happens <b>before</b> the component's header gets rendered
-	 * 
-	 * @param component
-	 * @return true, if traversal shall stop with that component
-	 */
-	protected boolean stopTraversingBefore(final Component component)
-	{
-		return false;
-	}
-
-	/**
-	 * In case you need mixed strategies depending on the component, you can subclass this method
-	 * and return true when traversing shall stop of that specific component.
-	 * 
-	 * This check happens <b>after</b> the component's header gets rendered
-	 * 
-	 * @param component
-	 * @return true, if traversal shall stop with that component
-	 */
-	protected boolean stopTraversingAfter(final Component component)
-	{
-		return false;
-	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/DeepChildFirstVisitor.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/DeepChildFirstVisitor.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/DeepChildFirstVisitor.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/DeepChildFirstVisitor.java Sun Nov 21 16:17:47 2010
@@ -27,7 +27,7 @@ import org.apache.wicket.util.visit.Visi
  * 
  * @author Juergen Donnerstag
  */
-public abstract class DeepChildFirstVisitor implements IVisitor<Component, Component>
+public abstract class DeepChildFirstVisitor implements IVisitor<Component, Void>
 {
 	/**
 	 * Construct.
@@ -42,132 +42,71 @@ public abstract class DeepChildFirstVisi
 	 * @param rootComponent
 	 * @return The object return by component()
 	 */
-	public final Object visit(final Component rootComponent)
+	public final Visit<Void> visit(final Component rootComponent)
+	{
+		Visit<Void> visitor = new Visit<Void>();
+		return visit(rootComponent, visitor);
+	}
+
+	/**
+	 * Render the child hierarchy headers.
+	 * 
+	 * @param rootComponent
+	 * @param visit
+	 * @return The object return by component()
+	 */
+	public final Visit<Void> visit(final Component rootComponent, final Visit<Void> visit)
 	{
 		Args.notNull(rootComponent, "rootComponent");
+		Args.notNull(visit, "visit");
 
-		if (rootComponent instanceof MarkupContainer)
+		// Component's don't have children; only MarkupContainers do
+		if (!(rootComponent instanceof MarkupContainer))
 		{
-			final Visit<Component> visit = new Visit<Component>();
-			final Component[] lastComponent = new Component[1];
-			Object rtn = ((MarkupContainer)rootComponent).visitChildren(new IVisitor<Component, Component>()
-			{
-				public void component(final Component component, final IVisit<Component> visit)
-				{
-					// skip invisible components
-					if (component.isVisibleInHierarchy())
-					{
-						// In case it is a 'leaf' component, than ...
-						if (!(component instanceof MarkupContainer) ||
-							((MarkupContainer)component).size() == 0)
-						{
-							// Lets assume we rendered the 1st leaf already and we now reached
-							// the 2nd leaf. If the 2nd leave has the very same parent, than we
-							// don't do anything. If not, than we need to render the 1st component's
-							// parents until such a parent is equal to the 2nd component parent.
-							if (lastComponent[0] != null)
-							{
-								MarkupContainer parent = lastComponent[0].getParent();
-								while ((parent != null) && (parent != rootComponent) &&
-									isCommonParent(parent, lastComponent[0], component) == false)
-								{
-									// Render the container since all its children have been
-									// rendered by now
-									component(parent, visit);
-
-									// If visitor returns a non-null value, it halts the traversal
-									if (((Visit)visit).isStopped())
-									{
-										return;
-									}
-
-									parent = parent.getParent();
-								}
-							}
-
-							// The 'leafs' header
-							component(component, visit);
-
-							// If visitor returns a non-null value, it halts the traversal
-							if (((Visit)visit).isStopped())
-							{
-								return;
-							}
-
-							// Remember the current leaf, we need it for comparison later on
-							visit.stop(component);
-						}
-					}
-					else
-					{
-						// Remember the current leaf, we need it for comparison later on
-						lastComponent[0] = component;
-						visit.dontGoDeeper();
-					}
-				}
-
-				/**
-				 * 
-				 * @param parent
-				 * @param lastComponent
-				 * @param currentComponent
-				 * @return true, if parent is a common parent of both components
-				 */
-				private boolean isCommonParent(final MarkupContainer parent,
-					final Component lastComponent, final Component currentComponent)
-				{
-					MarkupContainer p = lastComponent.getParent();
-					while ((p != null) && (p != rootComponent) && (p != parent))
-					{
-						p = p.getParent();
-					}
-
-					if (p == parent)
-					{
-						p = currentComponent.getParent();
-						while ((p != null) && (p != rootComponent) && (p != parent))
-						{
-							p = p.getParent();
-						}
-
-						if (p == parent)
-						{
-							return true;
-						}
-					}
+			// Call the visitor's callback method
+			component(rootComponent, visit);
+			return visit;
+		}
 
-					return false;
-				}
-			});
+		// while walking down, towards the deep child, we validate if the component is visible. If
+		// not, there is no need to go any deeper
+		if (preCheck(rootComponent) == false)
+		{
+			return visit;
+		}
 
-			// We still need to render the remaining containers
-			if (lastComponent[0] != null)
+		if (visit.isContinue())
+		{
+			// Iterate over all children
+			for (Component child : (MarkupContainer)rootComponent)
 			{
-				MarkupContainer parent = lastComponent[0].getParent();
-				while ((parent != null) && (parent != rootComponent))
+				// visit the child
+				visit(child, visit);
+				if (visit.isStopped())
 				{
-					// Render the container since all its children have been
-					// rendered by now
-					component(parent, visit);
-
-					// If visitor returns a non-null value, it halts the traversal
-					if (visit.isStopped())
-					{
-						return rtn;
-					}
-
-					parent = parent.getParent();
+					return visit;
 				}
 			}
-
-			return rtn;
 		}
 
-		return null;
+		// visit "this"
+		component(rootComponent, visit);
+		return visit;
 	}
 
 	/**
 	 * @see org.apache.wicket.IVisitor#component(org.apache.wicket.Component)
 	 */
-	public abstract void component(Component component, IVisit<Component> visit);
+	public abstract void component(Component component, IVisit<Void> visit);
+
+	/**
+	 * In order to find the deepest component, we traverse downwards starting from the root (e.g.
+	 * Page). However, once a component is not disabled (preCheck() returns false), iteration will
+	 * stop and traversal continues with the sibling.
+	 * 
+	 * @param component
+	 *            The component to be tested
+	 * @return True, if component is enabled
+	 */
+	public abstract boolean preCheck(Component component);
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/IHeaderRenderStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/IHeaderRenderStrategy.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/IHeaderRenderStrategy.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/IHeaderRenderStrategy.java Sun Nov 21 16:17:47 2010
@@ -21,9 +21,10 @@ import org.apache.wicket.markup.html.int
 
 /**
  * Allows for different header render strategies. The difference per strategy will be order in which
- * components will be asked to add to the markup header section. It might be page->container->child,
- * it might be child->container->parent, but it might also be a mixture depending on your specific
- * application needs.
+ * components are asked to add to the markup header section. Before 1.5 it was
+ * page->container->child. Since 1.5 it has been changed to child->container->parent.
+ * 
+ * @see {@link href http://issues.apache.org/jira/browse/WICKET-2693 }
  * 
  * @author Juergen Donnerstag
  */
@@ -33,7 +34,9 @@ public interface IHeaderRenderStrategy
 	 * Implements the render strategy
 	 * 
 	 * @param headerContainer
+	 *            The HeaderContainer associated to the response
 	 * @param component
+	 *            The root component (e.g. Page) to start the render process
 	 */
-	void renderHeader(final HtmlHeaderContainer headerContainer, final Component component);
+	void renderHeader(HtmlHeaderContainer headerContainer, Component component);
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ParentFirstHeaderRenderStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ParentFirstHeaderRenderStrategy.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ParentFirstHeaderRenderStrategy.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/renderStrategy/ParentFirstHeaderRenderStrategy.java Sun Nov 21 16:17:47 2010
@@ -24,16 +24,13 @@ import org.apache.wicket.util.visit.IVis
 import org.apache.wicket.util.visit.IVisitor;
 
 /**
- * This is Wicket's default header render strategy which uses
+ * This has been Wicket's default header render strategy before WICKET 1.5 which uses
  * {@link MarkupContainer#visitChildren(org.apache.wicket.IVisitor)} to traverse the hierarchy to
  * render the children headers.
  * 
  * Since child contributions are added to the markup after the parent contributions, children may
- * replace / modify existing settings.
- * 
- * Note that in order to mix different render strategies, a "stop traversal" mechanism has been
- * implemented. It allows you to use strategy A for Wicket core components and strategy B for your
- * own.
+ * replace / modify existing settings. Which is not good. Instead the parent (container) should be
+ * in control. See {@link href https://issues.apache.org/jira/browse/WICKET-2693}
  * 
  * @author Juergen Donnerstag
  */
@@ -47,10 +44,8 @@ public class ParentFirstHeaderRenderStra
 	}
 
 	/**
-	 * Render the child hierarchy headers.
-	 * 
-	 * @param headerContainer
-	 * @param rootComponent
+	 * @see org.apache.wicket.markup.renderStrategy.AbstractHeaderRenderStrategy#renderChildHeaders(org.apache.wicket.markup.html.internal.HtmlHeaderContainer,
+	 *      org.apache.wicket.Component)
 	 */
 	@Override
 	protected void renderChildHeaders(final HtmlHeaderContainer headerContainer,
@@ -59,8 +54,10 @@ public class ParentFirstHeaderRenderStra
 		Args.notNull(headerContainer, "headerContainer");
 		Args.notNull(rootComponent, "rootComponent");
 
+		// Only MarkupContainer can have children. Component's don't
 		if (rootComponent instanceof MarkupContainer)
 		{
+			// Visit the children with parent first, than children
 			((MarkupContainer)rootComponent).visitChildren(new IVisitor<Component, Void>()
 			{
 				public void component(final Component component, final IVisit<Void> visit)

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/ChildFirstHeaderRenderStrategyTest.java Sun Nov 21 16:17:47 2010
@@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory;
 
 /**
  * 
+ * @author juergen donnerstag
  */
 public class ChildFirstHeaderRenderStrategyTest extends WicketTestCase
 {
@@ -46,6 +47,13 @@ public class ChildFirstHeaderRenderStrat
 		executeCombinedTest(SimplePage2.class, "SimplePage2_ExpectedResult.html");
 	}
 
+	/**
+	 * 
+	 * @param <T>
+	 * @param pageClass
+	 * @param filename
+	 * @throws Exception
+	 */
 	private <T extends Page> void executeCombinedTest(final Class<T> pageClass,
 		final String filename) throws Exception
 	{
@@ -60,8 +68,7 @@ public class ChildFirstHeaderRenderStrat
 		log.error("=== CHILD first header render strategy ===");
 		System.setProperty("Wicket_HeaderRenderStrategy",
 			ChildFirstHeaderRenderStrategy.class.getName());
-		// tester.getApplication().getApplicationSettings().setHeaderRenderStrategy(
-		// new ChildFirstHeaderRenderStrategy());
+		tester = new WicketTester();
 		tester.startPage(pageClass);
 		tester.assertRenderedPage(pageClass);
 		tester.assertResultPage(getClass(), filename + "_2");

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage1_ExpectedResult.html_2
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage1_ExpectedResult.html_2?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage1_ExpectedResult.html_2 (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage1_ExpectedResult.html_2 Sun Nov 21 16:17:47 2010
@@ -1,38 +1,38 @@
-<html xmlns:wicket>
-<head><link rel="stylesheet" type="text/css" href="../../SimplePage1.css" />
-<link rel="stylesheet" type="text/css" href="../../container1.css" />
-<link rel="stylesheet" type="text/css" href="../../container2.css" />
-<link rel="stylesheet" type="text/css" href="../../container2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container3.css" />
-<link rel="stylesheet" type="text/css" href="../../container3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container3_1_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_2.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3_1_1.css" />
-</head><body>
- <span wicket:id="container1"></span>
- <span wicket:id="container2">
- 	<span wicket:id="container2_1"></span>
- </span>
- <span wicket:id="container3">
-	<span wicket:id="container3_1">
- 		<span wicket:id="container3_1_1"></span>
- 	</span>
- </span>
- <span wicket:id="container4">
-	 <span wicket:id="container4_1"></span>
-	 <span wicket:id="container4_2">
-	 	<span wicket:id="container4_2_1"></span>
-	 </span>
-	 <span wicket:id="container4_3">
-		<span wicket:id="container4_3_1">
-	 		<span wicket:id="container4_3_1_1"></span>
-	 	</span>
-	 </span>
- </span>
-</body>
-</html>
+<html xmlns:wicket>
+<head><link rel="stylesheet" type="text/css" href="../../container1.css" />
+<link rel="stylesheet" type="text/css" href="../../container2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container2.css" />
+<link rel="stylesheet" type="text/css" href="../../container3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container3.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_2.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3.css" />
+<link rel="stylesheet" type="text/css" href="../../container4.css" />
+<link rel="stylesheet" type="text/css" href="../../SimplePage1.css" />
+</head><body>
+ <span wicket:id="container1"></span>
+ <span wicket:id="container2">
+ 	<span wicket:id="container2_1"></span>
+ </span>
+ <span wicket:id="container3">
+	<span wicket:id="container3_1">
+ 		<span wicket:id="container3_1_1"></span>
+ 	</span>
+ </span>
+ <span wicket:id="container4">
+	 <span wicket:id="container4_1"></span>
+	 <span wicket:id="container4_2">
+	 	<span wicket:id="container4_2_1"></span>
+	 </span>
+	 <span wicket:id="container4_3">
+		<span wicket:id="container4_3_1">
+	 		<span wicket:id="container4_3_1_1"></span>
+	 	</span>
+	 </span>
+ </span>
+</body>
+</html>

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage2_ExpectedResult.html_2
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage2_ExpectedResult.html_2?rev=1037497&r1=1037496&r2=1037497&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage2_ExpectedResult.html_2 (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/renderStrategy/SimplePage2_ExpectedResult.html_2 Sun Nov 21 16:17:47 2010
@@ -1,96 +1,96 @@
-<html xmlns:wicket>
-<head><link rel="stylesheet" type="text/css" href="../../SimplePage2.css" />
-<link rel="stylesheet" type="text/css" href="../../container1.css" />
-<link rel="stylesheet" type="text/css" href="../../container2.css" />
-<link rel="stylesheet" type="text/css" href="../../container2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container3.css" />
-<link rel="stylesheet" type="text/css" href="../../container3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container3_1_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_2.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../container4_3_1_1.css" />
-<link rel="stylesheet" type="text/css" href="../../SimplePanel1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container2.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container3.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container3_1_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_2.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_2_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_3.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_3_1.css" />
-<link rel="stylesheet" type="text/css" href="../../pre_container4_3_1_1.css" />
-</head><body>
- <span wicket:id="container1"></span>
- <span wicket:id="container2">
- 	<span wicket:id="container2_1"></span>
- </span>
- <span wicket:id="container3">
-	<span wicket:id="container3_1">
- 		<span wicket:id="container3_1_1"></span>
- 	</span>
- </span>
- <span wicket:id="container4">
-	 <span wicket:id="container4_1"></span>
-	 <span wicket:id="container4_2">
-	 	<span wicket:id="container4_2_1"></span>
-	 </span>
-	 <span wicket:id="container4_3">
-		<span wicket:id="container4_3_1">
-	 		<span wicket:id="container4_3_1_1"></span>
-	 	</span>
-	 </span>
- </span>
- <span wicket:id="panel1"><wicket:panel>
- <span wicket:id="container1"></span>
- <span wicket:id="container2">
- 	<span wicket:id="container2_1"></span>
- </span>
- <span wicket:id="container3">
-	<span wicket:id="container3_1">
- 		<span wicket:id="container3_1_1"></span>
- 	</span>
- </span>
- <span wicket:id="container4">
-	 <span wicket:id="container4_1"></span>
-	 <span wicket:id="container4_2">
-	 	<span wicket:id="container4_2_1"></span>
-	 </span>
-	 <span wicket:id="container4_3">
-		<span wicket:id="container4_3_1">
-	 		<span wicket:id="container4_3_1_1"></span>
-	 	</span>
-	 </span>
- </span>
- 
- <span wicket:id="pre_container1"></span>
- <span wicket:id="pre_container2">
- 	<span wicket:id="pre_container2_1"></span>
- </span>
- <span wicket:id="pre_container3">
-	<span wicket:id="pre_container3_1">
- 		<span wicket:id="pre_container3_1_1"></span>
- 	</span>
- </span>
- <span wicket:id="pre_container4">
-	 <span wicket:id="pre_container4_1"></span>
-	 <span wicket:id="pre_container4_2">
-	 	<span wicket:id="pre_container4_2_1"></span>
-	 </span>
-	 <span wicket:id="pre_container4_3">
-		<span wicket:id="pre_container4_3_1">
-	 		<span wicket:id="pre_container4_3_1_1"></span>
-	 	</span>
-	 </span>
- </span>
- 
-</wicket:panel></span>
-</body>
-</html>
+<html xmlns:wicket>
+<head><link rel="stylesheet" type="text/css" href="../../container1.css" />
+<link rel="stylesheet" type="text/css" href="../../container2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container2.css" />
+<link rel="stylesheet" type="text/css" href="../../container3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container3.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_2.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../container4_3.css" />
+<link rel="stylesheet" type="text/css" href="../../container4.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container2.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container3.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_2_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_2.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_3_1_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_3_1.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4_3.css" />
+<link rel="stylesheet" type="text/css" href="../../pre_container4.css" />
+<link rel="stylesheet" type="text/css" href="../../SimplePanel1.css" />
+<link rel="stylesheet" type="text/css" href="../../SimplePage2.css" />
+</head><body>
+ <span wicket:id="container1"></span>
+ <span wicket:id="container2">
+ 	<span wicket:id="container2_1"></span>
+ </span>
+ <span wicket:id="container3">
+	<span wicket:id="container3_1">
+ 		<span wicket:id="container3_1_1"></span>
+ 	</span>
+ </span>
+ <span wicket:id="container4">
+	 <span wicket:id="container4_1"></span>
+	 <span wicket:id="container4_2">
+	 	<span wicket:id="container4_2_1"></span>
+	 </span>
+	 <span wicket:id="container4_3">
+		<span wicket:id="container4_3_1">
+	 		<span wicket:id="container4_3_1_1"></span>
+	 	</span>
+	 </span>
+ </span>
+ <span wicket:id="panel1"><wicket:panel>
+ <span wicket:id="container1"></span>
+ <span wicket:id="container2">
+ 	<span wicket:id="container2_1"></span>
+ </span>
+ <span wicket:id="container3">
+	<span wicket:id="container3_1">
+ 		<span wicket:id="container3_1_1"></span>
+ 	</span>
+ </span>
+ <span wicket:id="container4">
+	 <span wicket:id="container4_1"></span>
+	 <span wicket:id="container4_2">
+	 	<span wicket:id="container4_2_1"></span>
+	 </span>
+	 <span wicket:id="container4_3">
+		<span wicket:id="container4_3_1">
+	 		<span wicket:id="container4_3_1_1"></span>
+	 	</span>
+	 </span>
+ </span>
+ 
+ <span wicket:id="pre_container1"></span>
+ <span wicket:id="pre_container2">
+ 	<span wicket:id="pre_container2_1"></span>
+ </span>
+ <span wicket:id="pre_container3">
+	<span wicket:id="pre_container3_1">
+ 		<span wicket:id="pre_container3_1_1"></span>
+ 	</span>
+ </span>
+ <span wicket:id="pre_container4">
+	 <span wicket:id="pre_container4_1"></span>
+	 <span wicket:id="pre_container4_2">
+	 	<span wicket:id="pre_container4_2_1"></span>
+	 </span>
+	 <span wicket:id="pre_container4_3">
+		<span wicket:id="pre_container4_3_1">
+	 		<span wicket:id="pre_container4_3_1_1"></span>
+	 	</span>
+	 </span>
+ </span>
+ 
+</wicket:panel></span>
+</body>
+</html>