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>