Author: justin
Date: Mon Mar  2 15:35:44 2015
New Revision: 1663332

URL: http://svn.apache.org/r1663332
Log:
SLING-4468 - fixing case where parent is missing but grandparent is available

Modified:
    
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
    
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java

Modified: 
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java?rev=1663332&r1=1663331&r2=1663332&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
 (original)
+++ 
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
 Mon Mar  2 15:35:44 2015
@@ -63,25 +63,25 @@ public class OverridingResourcePicker im
         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 im
         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, '/');
+        }
+    }
+
 }

Modified: 
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java?rev=1663332&r1=1663331&r2=1663332&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
 Mon Mar  2 15:35:44 2015
@@ -58,8 +58,10 @@ public class OverridingResourceProviderT
      * /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 OverridingResourceProviderT
                     .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 OverridingResourceProviderT
     }
 
     @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);


Reply via email to