You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2019/06/05 14:43:24 UTC

[wicket] 01/02: WICKET-6673 parent-first preserving sibling order

This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a commit to branch WICKET-6673-priority-ordering
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 1dfdad7e998c00b59a6fc839b5e7c3eef518ba27
Author: Sven Meier <sv...@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>