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:00 UTC

[sling-org-apache-sling-resourcemerger] 19/31: SLING-4468 - fixing case where parent is missing but grandparent is available

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

rombert pushed a commit to annotated tag org.apache.sling.resourcemerger-1.2.10
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcemerger.git

commit 0b50e2121367c96a822ee3bd75e2b4693aba7328
Author: Justin Edelson <ju...@apache.org>
AuthorDate: Mon Mar 2 15:35:44 2015 +0000

    SLING-4468 - fixing case where parent is missing but grandparent is available
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/resourcemerger@1663332 13f79535-47bb-0310-9956-ffa450edef68
---
 .../impl/picker/OverridingResourcePicker.java      | 43 +++++++++++++++-------
 .../impl/OverridingResourceProviderTest.java       | 11 ++++++
 2 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java b/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
index 878db88..febeffc 100644
--- a/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
+++ b/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
@@ -63,25 +63,25 @@ public class OverridingResourcePicker implements MergedResourcePicker {
         resources.add(currentTarget);
 
         while (currentTarget != null) {
-            final Resource inheritanceRootResource = findInheritanceRoot(currentTarget);
-            if (inheritanceRootResource == null) {
+            final InheritanceRootInfo info = new InheritanceRootInfo();
+            findInheritanceRoot(currentTarget, info);
+            if (info.resource == null) {
                 currentTarget = null;
             } else {
-                final String relPath = currentTarget.getPath()
-                        .substring(inheritanceRootResource.getPath().length());
+                final Resource inheritanceRootResource = info.resource;
+                final String pathRelativeToInheritanceRoot = info.getPathRelativeToInheritanceRoot();
                 final String superType = inheritanceRootResource.getResourceSuperType();
                 if (superType == null) {
                     currentTarget = null;
                 } else {
-                    final String superTypeChildPath = superType + relPath;
+                    final String superTypeChildPath = superType + pathRelativeToInheritanceRoot;
                     final Resource superTypeResource = resolver.getResource(superTypeChildPath);
                     if (superTypeResource != null) {
-                        resources.add(superTypeResource);
                         currentTarget = superTypeResource;
                     } else {
-                        resources.add(new NonExistingResource(resolver, superTypeChildPath));
-                        currentTarget = null;
+                        currentTarget = new StubResource(resolver, superTypeChildPath);
                     }
+                    resources.add(currentTarget);
                 }
             }
         }
@@ -91,18 +91,33 @@ public class OverridingResourcePicker implements MergedResourcePicker {
         return resources;
     }
 
-    private Resource findInheritanceRoot(final Resource target) {
+    private void findInheritanceRoot(final Resource target, final InheritanceRootInfo info) {
         String superType = target.getResourceSuperType();
         if (superType != null) {
-            return target;
+            info.resource = target;
         } else {
             Resource parent = target.getParent();
-            if (parent == null) {
-                return null;
-            } else {
-                return findInheritanceRoot(parent);
+            if (parent != null) {
+                info.addLevel(target.getName());
+                findInheritanceRoot(parent, info);
             }
         }
     }
 
+    // Using a value object here as a sort-of tuple because the original
+    // way of calculating the relative path of the current resource from the
+    // inheritance root did not deal with missing resources.
+    private class InheritanceRootInfo {
+        private Resource resource;
+        private final StringBuilder pathRelativeToInheritanceRoot = new StringBuilder();
+
+        private String getPathRelativeToInheritanceRoot() {
+            return pathRelativeToInheritanceRoot.toString();
+        }
+
+        private void addLevel(String name) {
+            pathRelativeToInheritanceRoot.insert(0, name).insert(0, '/');
+        }
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java b/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
index fced547..acbe0b8 100644
--- a/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
+++ b/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
@@ -58,8 +58,10 @@ public class OverridingResourceProviderTest {
      * /apps/a/1/d/1/b/1
      * /apps/a/1/c
      * /apps/a/2/c
+     * /apps/a/3
      * 
      * /apps/a/2 has the super type of /apps/a/1
+     * /apps/a/3 has the super type of /apps/a/2
      */
     @Before
     public void setup() throws Exception {
@@ -82,6 +84,7 @@ public class OverridingResourceProviderTest {
                     .resource("/apps/a/1/c").p("1", "a").p("2", "b")
                     .resource("/apps/a/2").p(SUPER_TYPE, "a/1").p("b", "2").p(MergedResourceConstants.PN_HIDE_CHILDREN, new String[] {"b"})
                     .resource("c").p("1", "c")
+                    .resource("/apps/a/3").p(SUPER_TYPE, "a/2")
                     .commit();
 
         this.provider = new MergingResourceProvider("/override", new OverridingResourcePicker(), true);
@@ -108,6 +111,14 @@ public class OverridingResourceProviderTest {
     }
 
     @Test
+    public void testInheritingFromGrandParent() {
+        assertNotNull(this.provider.getResource(this.resolver, "/override/apps/a/3/a"));
+        assertNull(this.provider.getResource(this.resolver, "/override/apps/a/3/b"));
+        assertNotNull(this.provider.getResource(this.resolver, "/override/apps/a/3/c"));
+        assertNotNull(this.provider.getResource(this.resolver, "/override/apps/a/3/d"));
+    }
+
+    @Test
     public void testHideChildrenFromList() {
         final Resource rsrcA2 = this.provider.getResource(this.resolver, "/override/apps/a/2");
         final Iterator<Resource> children = this.provider.listChildren(rsrcA2);

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.