You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:00:40 UTC

[sling-org-apache-sling-resourcemerger] 03/11: SLING-4915 preferably take the order from the overlying resource

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 <kw...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.