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>