You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2010/06/28 17:23:36 UTC

svn commit: r958601 - in /sling/trunk/bundles/servlets/resolver/src: main/java/org/apache/sling/servlets/resolver/internal/helper/ test/java/org/apache/sling/servlets/resolver/internal/helper/

Author: justin
Date: Mon Jun 28 15:23:36 2010
New Revision: 958601

URL: http://svn.apache.org/viewvc?rev=958601&view=rev
Log:
SLING-1446 - resolving super resource type against correct resource

Modified:
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
    sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java?rev=958601&r1=958600&r2=958601&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java Mon Jun 28 15:23:36 2010
@@ -72,7 +72,7 @@ public abstract class AbstractResourceCo
 
         final SortedSet<Resource> resources = new TreeSet<Resource>();
         final Iterator<String> locations = new LocationIterator(resourceType, resourceSuperType,
-                                                                baseResourceType, resolver);
+                                                                baseResourceType, workspaceName, resolver);
         while (locations.hasNext()) {
             final String location = locations.next();
 

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java?rev=958601&r1=958600&r2=958601&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java Mon Jun 28 15:23:36 2010
@@ -23,6 +23,7 @@ import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.slf4j.LoggerFactory;
@@ -85,6 +86,9 @@ public class LocationIterator implements
 
     /** Set of used resource types to detect a circular resource type hierarchy. */
     private final Set<String> usedResourceTypes = new HashSet<String>();
+    
+    // the workspace name
+    private String workspaceName;
 
     /**
      * Creates an instance of this iterator starting with a location built from
@@ -96,9 +100,11 @@ public class LocationIterator implements
      * @param baseResourceType The base resource type.
      * @param resolver The resource resolver
      */
-    public LocationIterator(String resourceType, String resourceSuperType, String baseResourceType, ResourceResolver resolver) {
+    public LocationIterator(String resourceType, String resourceSuperType, String baseResourceType,
+            String workspaceName, ResourceResolver resolver) {
         this.resolver = resolver;
         this.baseResourceType = baseResourceType;
+        this.workspaceName = workspaceName;
 
         String[] tmpPath = resolver.getSearchPath();
         if (tmpPath == null || tmpPath.length == 0) {
@@ -200,8 +206,7 @@ public class LocationIterator implements
                 && this.firstResourceSuperType != null ) {
             superType = this.firstResourceSuperType;
         } else {
-            superType = ResourceUtil.getResourceSuperType(resolver,
-                resourceType);
+            superType = getResourceSuperType(resolver, resourceType);
         }
 
         // detect circular dependency
@@ -220,5 +225,46 @@ public class LocationIterator implements
 
         return superType;
     }
+   
+    // this method is largely duplicated from ResourceUtil, but takes the configured
+    // workspaceName into account.
+    private String getResourceSuperType(final ResourceResolver resourceResolver,
+                                              final String resourceType) {
+        // normalize resource type to a path string
+        final String rtPath = ResourceUtil.resourceTypeToPath(resourceType);
+        // get the resource type resource and check its super type
+        String resourceSuperType = null;
+        // if the path is absolute, use it directly
+        if ( rtPath != null && rtPath.startsWith("/") ) {
+            final String candidatePath;
+            if ( this.workspaceName != null ) {
+                candidatePath = workspaceName + ':' + rtPath;
+            } else {
+                candidatePath = rtPath;
+            }
+            
+            final Resource rtResource = resourceResolver.getResource(candidatePath);
+            if ( rtResource != null ) {
+                resourceSuperType = rtResource.getResourceSuperType();
+            }
+
+        } else {
+            // if the path is relative we use the search paths
+            for(final String searchPath : resourceResolver.getSearchPath()) {
+                final String candidatePath;
+                if ( this.workspaceName != null ) {
+                    candidatePath = workspaceName + ':' + searchPath + rtPath;
+                } else {
+                    candidatePath = searchPath + rtPath;
+                }
+                final Resource rtResource = resourceResolver.getResource(candidatePath);
+                if ( rtResource != null && rtResource.getResourceSuperType() != null ) {
+                    resourceSuperType = rtResource.getResourceSuperType();
+                    break;
+                }
+            }
+        }
+        return resourceSuperType;
+    }
 
 }

Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java?rev=958601&r1=958600&r2=958601&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java Mon Jun 28 15:23:36 2010
@@ -33,7 +33,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -55,7 +55,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /apps/foo/bar
@@ -78,7 +78,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /apps/foo/bar
@@ -113,7 +113,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -140,7 +140,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -168,7 +168,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -199,7 +199,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -230,7 +230,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /apps/foo/bar
@@ -262,7 +262,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /apps/foo/bar
@@ -310,7 +310,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -346,7 +346,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -383,7 +383,7 @@ public class LocationIteratorTest extend
         final Resource r = request.getResource();
         LocationIterator li = new LocationIterator(r.getResourceType(),
                 r.getResourceSuperType(),
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /foo/bar
@@ -416,7 +416,7 @@ public class LocationIteratorTest extend
         resourceResolver.setSearchPath(root0, root1);
         LocationIterator li = new LocationIterator("",
                 null,
-                "",
+                "", null,
                 resourceResolver);
         assertTrue(li.hasNext());
         assertEquals("/apps/", li.next());
@@ -431,7 +431,7 @@ public class LocationIteratorTest extend
         resourceResolver.setSearchPath(root0, root1);
         LocationIterator li = new LocationIterator("a/b",
                 null,
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
         assertTrue(li.hasNext());
         assertEquals(root0 + "/a/b", li.next());
@@ -450,7 +450,7 @@ public class LocationIteratorTest extend
         resourceResolver.setSearchPath(root0, root1);
         LocationIterator li = new LocationIterator("a/b",
                 "c/d",
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
         assertTrue(li.hasNext());
         assertEquals(root0 + "/a/b", li.next());
@@ -487,7 +487,7 @@ public class LocationIteratorTest extend
 
         LocationIterator li = new LocationIterator(resourceType,
                 resourceSuperType,
-                DEFAULT_SERVLET_NAME,
+                DEFAULT_SERVLET_NAME, null,
                 resourceResolver);
 
         // 1. /libs/foo/bar