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>();