You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2015/10/28 14:31:22 UTC
svn commit: r1711007 - in /sling/trunk/bundles/resourceresolver/src:
main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
Author: sseifert
Date: Wed Oct 28 13:31:22 2015
New Revision: 1711007
URL: http://svn.apache.org/viewvc?rev=1711007&view=rev
Log:
SLING-5207 detect cyclic resource super type hierarchies
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java?rev=1711007&r1=1711006&r2=1711007&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java Wed Oct 28 13:31:22 2015
@@ -23,10 +23,12 @@ import static org.apache.commons.lang.St
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
@@ -1265,12 +1267,17 @@ public class ResourceResolverImpl extend
if (resourceType.equals(resource.getResourceType())) {
result = true;
} else {
+ Set<String> superTypesChecked = new HashSet<String>();
String superType = this.getParentResourceType(resource);
while (!result && superType != null) {
if (resourceType.equals(superType)) {
result = true;
} else {
+ superTypesChecked.add(superType);
superType = this.getParentResourceType(superType);
+ if (superType != null && superTypesChecked.contains(superType)) {
+ throw new SlingException("Cyclic dependency for resourceSuperType hierarchy detected on resource " + resource.getPath(), null);
+ }
}
}
}
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java?rev=1711007&r1=1711006&r2=1711007&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java Wed Oct 28 13:31:22 2015
@@ -40,6 +40,7 @@ import java.util.Map;
import javax.jcr.Session;
import javax.servlet.http.HttpServletRequest;
+import org.apache.sling.api.SlingException;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.PersistenceException;
@@ -550,6 +551,49 @@ public class ResourceResolverImplTest {
assertFalse(resolver.isResourceType(resourceT3, "/types/unknown"));
}
+ @Test(expected=SlingException.class) public void testIsResourceCyclicHierarchyDirect() {
+ final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
+
+ /**
+ * prepare resource type hierarchy
+ * /types/1 <---+
+ * +- /types/2 -+
+ */
+ resolver.add(new SyntheticResourceWithSupertype(resolver, "/types/1", "/types/component", "/types/2"));
+ resolver.add(new SyntheticResourceWithSupertype(resolver, "/types/2", "/types/component", "/types/1"));
+
+ Resource resource = resolver.add(new SyntheticResource(resolver, "/resourceT1", "/types/1"));
+
+ assertTrue(resolver.isResourceType(resource, "/types/1"));
+ assertTrue(resolver.isResourceType(resource, "/types/2"));
+
+ // this should throw a SlingException when detecting the cyclic hierarchy
+ resolver.isResourceType(resource, "/types/unknown");
+ }
+
+ @Test(expected=SlingException.class) public void testIsResourceCyclicHierarchyIndirect() {
+ final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
+
+ /**
+ * prepare resource type hierarchy
+ * /types/1 <----+
+ * +- /types/2 |
+ * +- /types/3 -+
+ */
+ resolver.add(new SyntheticResourceWithSupertype(resolver, "/types/1", "/types/component", "/types/2"));
+ resolver.add(new SyntheticResourceWithSupertype(resolver, "/types/2", "/types/component", "/types/3"));
+ resolver.add(new SyntheticResourceWithSupertype(resolver, "/types/3", "/types/component", "/types/1"));
+
+ Resource resource = resolver.add(new SyntheticResource(resolver, "/resourceT1", "/types/1"));
+
+ assertTrue(resolver.isResourceType(resource, "/types/1"));
+ assertTrue(resolver.isResourceType(resource, "/types/2"));
+ assertTrue(resolver.isResourceType(resource, "/types/3"));
+
+ // this should throw a SlingException when detecting the cyclic hierarchy
+ resolver.isResourceType(resource, "/types/unknown");
+ }
+
private PathBasedResourceResolverImpl getPathBasedResourceResolver() {
try {
final List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();