You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2015/07/15 10:30:35 UTC
svn commit: r1691143 - in /sling/trunk/contrib/extensions/resourcemerger/src:
main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
Author: radu
Date: Wed Jul 15 08:30:34 2015
New Revision: 1691143
URL: http://svn.apache.org/r1691143
Log:
SLING-4878 - Resource Merger: Infinite loop in case a parent resource has one of its children as a supertype
* fixed infinite loop if an inheritance loop exists
(applied patch from Vlad Bailescu)
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=1691143&r1=1691142&r2=1691143&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 Wed Jul 15 08:30:34 2015
@@ -20,7 +20,9 @@ package org.apache.sling.resourcemerger.
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
@@ -52,6 +54,7 @@ public class OverridingResourcePicker im
public List<Resource> pickResources(ResourceResolver resolver, String relativePath) {
String absPath = "/" + relativePath;
final List<Resource> resources = new ArrayList<Resource>();
+ final Set<String> roots = new HashSet<String>();
Resource currentTarget = resolver.getResource(absPath);
@@ -70,7 +73,9 @@ public class OverridingResourcePicker im
final Resource inheritanceRootResource = info.resource;
final String pathRelativeToInheritanceRoot = info.getPathRelativeToInheritanceRoot();
final String superType = inheritanceRootResource.getResourceSuperType();
- if (superType == null) {
+
+ if (superType == null
+ || roots.contains(inheritanceRootResource.getPath())) { // avoid inheritance loops
currentTarget = null;
} else {
final String superTypeChildPath = superType + pathRelativeToInheritanceRoot;
@@ -81,6 +86,7 @@ public class OverridingResourcePicker im
currentTarget = new StubResource(resolver, superTypeChildPath);
}
resources.add(currentTarget);
+ roots.add(inheritanceRootResource.getPath());
}
}
}
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=1691143&r1=1691142&r2=1691143&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 Wed Jul 15 08:30:34 2015
@@ -62,6 +62,9 @@ public class OverridingResourceProviderT
*
* /apps/a/2 has the super type of /apps/a/1
* /apps/a/3 has the super type of /apps/a/2
+ *
+ * /apps/a/4 has the super type of /apps/a/4/b/4
+ * /apps/x has the super type of x/y
*/
@Before
public void setup() throws Exception {
@@ -85,6 +88,13 @@ public class OverridingResourceProviderT
.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")
+ .resource("/apps/a/4").p(SUPER_TYPE, "/apps/a/4/b/4")
+ .resource("b")
+ .resource("4")
+ .resource("d")
+ .resource("/apps/x").p(SUPER_TYPE, "x/y")
+ .resource("y")
+ .resource("z")
.commit();
this.provider = new MergingResourceProvider("/override", new OverridingResourcePicker(), false, true);
@@ -168,4 +178,14 @@ public class OverridingResourceProviderT
assertNotNull(d1a);
}
+ @Test
+ public void testLoopInInheritance() {
+ final Resource rsrcA4 = this.provider.getResource(this.resolver, "/override/apps/a/4");
+
+ Resource d = getChildResource(rsrcA4, "d");
+ assertNotNull(d);
+
+ final Resource z = this.provider.getResource(this.resolver, "/override/apps/x/z");
+ assertNotNull(z);
+ }
}