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>

Reply via email to