This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/wicket.git
commit f82fd5de34a7142aab2567bed51c258c875cdc2c Author: Sven Meier <svenme...@apache.org> AuthorDate: Wed Jun 5 09:30:12 2019 +0200 WICKET-6673 parent-first preserving sibling order --- .../src/main/java/org/apache/wicket/Component.java | 10 ++- .../markup/head/PriorityFirstComparator.java | 38 ++++++---- .../wicket/markup/head/ResourceAggregator.java | 85 +++++++--------------- .../apache/wicket/markup/head/ExpectedResult.html | 2 +- .../markup/head/ExpectedResultPageFirst.html | 2 +- 5 files changed, 57 insertions(+), 80 deletions(-) diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java index 2b932ca..9da8ec5 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Component.java +++ b/wicket-core/src/main/java/org/apache/wicket/Component.java @@ -2619,7 +2619,8 @@ public abstract class Component IHeaderResponse response = container.getHeaderResponse(); // Allow component to contribute - if (response.wasRendered(this) == false) + boolean wasRendered = response.wasRendered(this); + if (wasRendered == false) { StringResponse markupHeaderResponse = new StringResponse(); Response oldResponse = getResponse(); @@ -2641,8 +2642,6 @@ public abstract class Component } // Then let the component itself to contribute to the header renderHead(response); - - response.markRendered(this); } // Then ask all behaviors @@ -2658,6 +2657,11 @@ public abstract class Component } } } + + if (wasRendered == false) + { + response.markRendered(this); + } } } diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/PriorityFirstComparator.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/PriorityFirstComparator.java index 3e70228..fc15255 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/PriorityFirstComparator.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/PriorityFirstComparator.java @@ -57,7 +57,9 @@ public class PriorityFirstComparator implements Comparator<RecordedHeaderItem>, HeaderItemType o2Type = getItemType(o2); if (o1Type != o2Type) + { return o1Type.ordinal() - o2Type.ordinal(); + } if (o1Type == HeaderItemType.PRIORITY) { @@ -69,11 +71,11 @@ public class PriorityFirstComparator implements Comparator<RecordedHeaderItem>, /** * Compares two header items that belong in the same group. * - * @param o1 - * @param o2 + * @param item1 + * @param item2 * @return 0 by default to preserve the order */ - protected int compareWithinGroup(RecordedHeaderItem o1, RecordedHeaderItem o2) + protected int compareWithinGroup(RecordedHeaderItem item1, RecordedHeaderItem item2) { return 0; } @@ -81,22 +83,16 @@ public class PriorityFirstComparator implements Comparator<RecordedHeaderItem>, /** * Compares two priority header items, converting the child-first order into parent-first. * - * @param o1 - * @param o2 - * @return -1, 0 or 1 if o1 needs to be rendered before, unchanged or after o2. + * @param item1 + * @param item2 + * @return -1, 0 or 1 if item1 needs to be rendered before, unchanged or after item2. */ - protected int inversedComponentOrder(RecordedHeaderItem o1, RecordedHeaderItem o2) + protected int inversedComponentOrder(RecordedHeaderItem item1, RecordedHeaderItem item2) { - RecordedHeaderItemLocation lastO1Location = o1.getLocations().get( - o1.getLocations().size() - 1); - RecordedHeaderItemLocation lastO2Location = o2.getLocations().get( - o2.getLocations().size() - 1); - - // within a component, preserve order - if (lastO1Location.getRenderBase() == lastO2Location.getRenderBase()) - return 0; + RecordedHeaderItemLocation location1 = item1.getLocations().get(item1.getLocations().size() - 1); + RecordedHeaderItemLocation location2 = item2.getLocations().get(item2.getLocations().size() - 1); - return lastO1Location.getIndexInRequest() < lastO2Location.getIndexInRequest() ? 1 : -1; + return location1.getDepth() - location2.getDepth(); } /** @@ -108,14 +104,24 @@ public class PriorityFirstComparator implements Comparator<RecordedHeaderItem>, protected HeaderItemType getItemType(RecordedHeaderItem item) { if (item.getItem() instanceof PriorityHeaderItem) + { return HeaderItemType.PRIORITY; + } + if (renderPageFirst) { if (item.getItem() instanceof PageHeaderItem) + { return HeaderItemType.PAGE; + } + for (RecordedHeaderItemLocation curLocation : item.getLocations()) + { if (curLocation.getRenderBase() instanceof Page) + { return HeaderItemType.PAGE; + } + } } return HeaderItemType.COMPONENT; diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java index a0400c9..224c8f5 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java @@ -27,14 +27,12 @@ import java.util.Set; import org.apache.wicket.Application; import org.apache.wicket.Component; -import org.apache.wicket.behavior.Behavior; import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; import org.apache.wicket.markup.html.DecoratingHeaderResponse; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.resource.CircularDependencyException; import org.apache.wicket.resource.bundles.ReplacementResourceBundleReference; -import org.apache.wicket.util.lang.Classes; /** * {@code ResourceAggregator} implements resource dependencies, resource bundles and sorting of @@ -46,66 +44,47 @@ import org.apache.wicket.util.lang.Classes; public class ResourceAggregator extends DecoratingHeaderResponse { /** - * The location in which a {@link HeaderItem} is added, consisting of the component/behavior - * that added the item, the index in the list for that component/behavior at which the item was - * added and the index in the request. + * The location in which a {@link HeaderItem} is added, i.e. the responsible component. * * @author papegaaij */ public static class RecordedHeaderItemLocation { - private final Object renderBase; - private final int indexInRenderBase; - private final int indexInRequest; + private final Component renderBase; + + private int depth = -1; /** * Construct. * * @param renderBase - * The component or behavior that added the item. - * @param indexInRenderBase - * Indicates the number of items added before this one on the same component or - * behavior. - * @param indexInRequest - * Indicates the number of items added before this one in the same request. + * the component that added the item. */ - public RecordedHeaderItemLocation(Object renderBase, int indexInRenderBase, - int indexInRequest) + public RecordedHeaderItemLocation(Component renderBase) { this.renderBase = renderBase; - this.indexInRenderBase = indexInRenderBase; - this.indexInRequest = indexInRequest; } /** * @return the component or behavior that added the item. */ - public Object getRenderBase() + public Component getRenderBase() { return renderBase; } - /** - * @return the number of items added before this one on the same component or behavior. - */ - public int getIndexInRenderBase() - { - return indexInRenderBase; - } - - /** - * @return the number of items added before this one in the same request. - */ - public int getIndexInRequest() + public int getDepth() { - return indexInRequest; - } - - @Override - public String toString() - { - return (renderBase == null ? "null" : Classes.simpleName(renderBase.getClass())) + '@' + - indexInRenderBase; + if (depth == -1) { + Component d = renderBase; + while (d != null) { + depth++; + + d = d.getParent(); + } + } + + return depth; } } @@ -135,17 +114,11 @@ public class ResourceAggregator extends DecoratingHeaderResponse * Records a location at which the item was added. * * @param renderBase - * The component or behavior that added the item. - * @param indexInRenderBase - * Indicates the number of items added before this one on the same component or - * behavior. - * @param indexInRequest - * Indicates the number of items added before this one in this request. + * the component that added the item. */ - public void addLocation(Object renderBase, int indexInRenderBase, int indexInRequest) + public void addLocation(Component renderBase) { - locations.add(new RecordedHeaderItemLocation(renderBase, indexInRenderBase, - indexInRequest)); + locations.add(new RecordedHeaderItemLocation(renderBase)); } /** @@ -180,9 +153,7 @@ public class ResourceAggregator extends DecoratingHeaderResponse private final List<HeaderItem> domReadyItemsToBeRendered; private final List<OnLoadHeaderItem> loadItemsToBeRendered; - private Object renderBase; - private int indexInRenderBase; - private int indexInRequest; + private Component renderBase; /** * Construct. @@ -202,10 +173,9 @@ public class ResourceAggregator extends DecoratingHeaderResponse public void markRendered(Object object) { super.markRendered(object); - if (object instanceof Component || object instanceof Behavior) + if (object instanceof Component) { renderBase = null; - indexInRenderBase = 0; } } @@ -213,10 +183,9 @@ public class ResourceAggregator extends DecoratingHeaderResponse public boolean wasRendered(Object object) { boolean ret = super.wasRendered(object); - if (!ret && object instanceof Component || object instanceof Behavior) + if (!ret && object instanceof Component) { - renderBase = object; - indexInRenderBase = 0; + renderBase = (Component)object; } return ret; } @@ -230,9 +199,7 @@ public class ResourceAggregator extends DecoratingHeaderResponse recordedItem = new RecordedHeaderItem(item); itemsToBeRendered.put(item, recordedItem); } - recordedItem.addLocation(renderBase, indexInRenderBase, indexInRequest); - indexInRenderBase++; - indexInRequest++; + recordedItem.addLocation(renderBase); } private void renderDependencies(HeaderItem item, Set<HeaderItem> depsDone) diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResult.html index d952637..195628e 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResult.html +++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResult.html @@ -1,9 +1,9 @@ <html> <head><title>PriorityHeaderContributionInAbstractPage</title> <title>PriorityHeaderContributionInConcretePage</title> +<title>PriorityHeaderContributionInHeaderPanel</title> <title>DependencyOfPriorityHeaderContributionInPanelWithHeader</title> <title>PriorityHeaderContributionInPanelWithHeader</title> -<title>PriorityHeaderContributionInHeaderPanel</title> <title>WicketHeadOfHeaderPanel</title> <title>HeaderContributionInHeaderPanel</title> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResultPageFirst.html b/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResultPageFirst.html index d9b7abf..177f677 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResultPageFirst.html +++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/ExpectedResultPageFirst.html @@ -1,9 +1,9 @@ <html> <head><title>PriorityHeaderContributionInAbstractPage</title> <title>PriorityHeaderContributionInConcretePage</title> +<title>PriorityHeaderContributionInHeaderPanel</title> <title>DependencyOfPriorityHeaderContributionInPanelWithHeader</title> <title>PriorityHeaderContributionInPanelWithHeader</title> -<title>PriorityHeaderContributionInHeaderPanel</title> <title>HeadOfAbstractPage</title> <style>