This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourcemerger-1.3.2 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcemerger.git
commit 152c8a5b34e563648052ae89ea0ef392f669032e Author: Konrad Windszus <[email protected]> AuthorDate: Fri Feb 12 10:57:38 2016 +0000 SLING-4915 preferably take the order from the overlying resource git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/resourcemerger@1729981 13f79535-47bb-0310-9956-ffa450edef68 --- .../impl/MergingResourceProvider.java | 15 +++++++ .../impl/CommonMergedResourceProviderTest.java | 52 ++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java b/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java index 81d3a3c..735d208 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java @@ -314,7 +314,16 @@ public class MergingResourceProvider extends ResourceProvider<Void> { for (final Resource child : parentResource.getChildren()) { final String rsrcName = child.getName(); ResourceHolder holder = null; + int childPositionInCandidateList = -1; // check if is this an overlaid resource (i.e. has the resource with the same name already be exposed through the underlying resource) + for (int index=0; index < candidates.size(); index++) { + ResourceHolder current = candidates.get(index); + if (current.name.equals(rsrcName)) { + holder = current; + childPositionInCandidateList = index; + break; + } + } for (final ResourceHolder current : candidates) { if (current.name.equals(rsrcName)) { holder = current; @@ -351,6 +360,12 @@ public class MergingResourceProvider extends ResourceProvider<Void> { if (orderBeforeIndex > -1) { candidates.add(orderBeforeIndex, holder); candidates.remove(candidates.size() - 1); + } else { + // if there was no explicit order, just assume the order given by the overlying resource + if (childPositionInCandidateList != -1) { + candidates.add(holder); + candidates.remove(childPositionInCandidateList); + } } } diff --git a/src/test/java/org/apache/sling/resourcemerger/impl/CommonMergedResourceProviderTest.java b/src/test/java/org/apache/sling/resourcemerger/impl/CommonMergedResourceProviderTest.java index 28403e4..2a8fd1d 100644 --- a/src/test/java/org/apache/sling/resourcemerger/impl/CommonMergedResourceProviderTest.java +++ b/src/test/java/org/apache/sling/resourcemerger/impl/CommonMergedResourceProviderTest.java @@ -238,4 +238,56 @@ public class CommonMergedResourceProviderTest { Assert.assertFalse(mergedResource.getValueMap().containsKey(MergedResourceConstants.PN_HIDE_CHILDREN)); Assert.assertFalse(mergedResource.getValueMap().containsKey(MergedResourceConstants.PN_HIDE_PROPERTIES)); } + + @Test + public void testOrderOfPartiallyOverwrittenChildren() throws PersistenceException { + // see https://issues.apache.org/jira/browse/SLING-4915 + + // create new child nodes below base and overlay + MockHelper.create(this.resolver) + .resource("/apps/base/child1") + .resource("/apps/base/child2") + .resource("/apps/base/child3") + .resource("/apps/overlay/child4") + .resource("/apps/overlay/child2") + .resource("/apps/overlay/child3") + .commit(); + + Resource mergedResource = this.provider.getResource(ctx, "/merged", ResourceContext.EMPTY_CONTEXT, null); + // convert the iterator returned by list children into an iterable (to be able to perform some tests) + IteratorIterable<Resource> iterable = new IteratorIterable<Resource>(provider.listChildren(ctx, mergedResource), true); + + Assert.assertThat(iterable, Matchers.contains(ResourceMatchers.resourceWithName("child1"),ResourceMatchers.resourceWithName("child4"), ResourceMatchers.resourceWithName("child2"), ResourceMatchers.resourceWithName("child3"))); + } + + @Test + public void testOrderOfNonOverlappingChildren() throws PersistenceException { + // create new child nodes below base and overlay + MockHelper.create(this.resolver) + .resource("/apps/base/child1") + .resource("/apps/base/child2") + .resource("/apps/overlay/child3") + .resource("/apps/overlay/child4") + .commit(); + Resource mergedResource = this.provider.getResource(ctx, "/merged", ResourceContext.EMPTY_CONTEXT, null); + // convert the iterator returned by list children into an iterable (to be able to perform some tests) + IteratorIterable<Resource> iterable = new IteratorIterable<Resource>(provider.listChildren(ctx, mergedResource), true); + + Assert.assertThat(iterable, Matchers.contains(ResourceMatchers.resourceWithName("child1"),ResourceMatchers.resourceWithName("child2"), ResourceMatchers.resourceWithName("child3"), ResourceMatchers.resourceWithName("child4"))); + } + + @Test + public void testOrderBeingModifiedThroughOrderBefore() throws PersistenceException { + // create new child nodes below base and overlay + MockHelper.create(this.resolver) + .resource("/apps/base/child1") + .resource("/apps/base/child2") + .resource("/apps/overlay/child3").p(MergedResourceConstants.PN_ORDER_BEFORE, "child2") + .commit(); + Resource mergedResource = this.provider.getResource(ctx, "/merged", ResourceContext.EMPTY_CONTEXT, null); + // convert the iterator returned by list children into an iterable (to be able to perform some tests) + IteratorIterable<Resource> iterable = new IteratorIterable<Resource>(provider.listChildren(ctx, mergedResource), true); + + Assert.assertThat(iterable, Matchers.contains(ResourceMatchers.resourceWithName("child1"),ResourceMatchers.resourceWithName("child3"), ResourceMatchers.resourceWithName("child2"))); + } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
