You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2016/11/25 12:17:45 UTC

svn commit: r1771302 - in /sling/trunk/bundles: api/src/main/java/org/apache/sling/api/resource/ api/src/test/java/org/apache/sling/api/resource/ resourceresolver/ resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ resourceresolver/...

Author: kwin
Date: Fri Nov 25 12:17:45 2016
New Revision: 1771302

URL: http://svn.apache.org/viewvc?rev=1771302&view=rev
Log:
SLING-6327 ResourceResolverImpl.isResourceType() should compare relative resource types (and ignore any search path prefixes)

Modified:
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/Resource.java
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/package-info.java
    sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java
    sling/trunk/bundles/resourceresolver/pom.xml
    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/api/src/main/java/org/apache/sling/api/resource/Resource.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/Resource.java?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/Resource.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/Resource.java Fri Nov 25 12:17:45 2016
@@ -179,16 +179,8 @@ public interface Resource extends Adapta
     boolean hasChildren();
 
     /**
-     * Returns <code>true</code> if the resource type or any of the resource's
-     * super type(s) equals the given resource type.
-     *
-     * @param resourceType The resource type to check this resource against.
-     * @return <code>true</code> if the resource type or any of the resource's
-     *         super type(s) equals the given resource type. <code>false</code>
-     *         is also returned if <code>resourceType</code> is
-     *         <code>null</code>.
-     * @throws IllegalStateException if this resource resolver has already been
-     *             {@link ResourceResolver#close() closed}.
+     * Is just a shortcut for {@code getResourceResolver().isResourceType(this, resourceType)}.
+     * @see ResourceResolver#isResourceType(Resource, String)
      * @since 2.1.0 (Sling API Bundle 2.1.0)
      */
     boolean isResourceType(String resourceType);

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java Fri Nov 25 12:17:45 2016
@@ -698,6 +698,11 @@ public interface ResourceResolver extend
     /**
      * Returns <code>true</code> if the resource type or any of the resource's
      * super type(s) equals the given resource type.
+     * 
+     * In case the type of the given resource or the given resource type is absolute (i.e. start with a "/") 
+     * and starts with one of the resource resolver's search paths
+     * it is converted to relative resource types by stripping off the resource resolver's search path 
+     * before doing the comparison.
      *
      * @param resource The resource to check
      * @param resourceType The resource type to check this resource against.

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java Fri Nov 25 12:17:45 2016
@@ -475,6 +475,41 @@ public class ResourceUtil {
     }
 
     /**
+     * Returns <code>true</code> if the given resource type are equal.
+     * 
+     * In case the value of any of the given resource types 
+     * starts with one of the resource resolver's search paths
+     * it is converted to a relative resource type by stripping off 
+     * the resource resolver's search path before doing the comparison.
+     *
+     * @param resourceType A resource type
+     * @param anotherResourceType Another resource type to compare with {@link resourceType}.
+     * @return <code>true</code> if the resource type equals the given resource type.
+     * @since 2.10.0
+     */
+    public static boolean areResourceTypesEqual(@Nonnull String resourceType, @Nonnull String anotherResourceType, @Nonnull String[] searchPath) {
+        return relativizeResourceType(resourceType, searchPath).equals(relativizeResourceType(anotherResourceType, searchPath));
+    }
+
+    /**
+     * Makes the given resource type relative by stripping off any prefix which equals one of the given search paths.
+     * In case the given resource type does not start with any of the given search paths it is returned unmodified.
+     * @param resourceType the resourceType to relativize.
+     * @param searchPath the search paths to strip off from the given resource type.
+     * @return the relative resource type
+     */
+    public static String relativizeResourceType(@Nonnull String resourceType, @Nonnull String[] searchPath) {
+        if (resourceType.startsWith("/")) {
+            for (String prefix : searchPath) {
+                if (resourceType.startsWith(prefix)) {
+                    return resourceType.substring(prefix.length());
+                }
+            }
+        }
+        return resourceType;
+    }
+
+    /**
      * Return an iterator for objects of the specified type. A new iterator is
      * returned which tries to adapt the provided resources to the given type
      * (using {@link Resource#adaptTo(Class)}. If a resource in the original

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/package-info.java?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/package-info.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/package-info.java Fri Nov 25 12:17:45 2016
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("2.9.2")
+@Version("2.10.0")
 package org.apache.sling.api.resource;
 
 import org.osgi.annotation.versioning.Version;

Modified: sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java (original)
+++ sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java Fri Nov 25 12:17:45 2016
@@ -416,4 +416,21 @@ public class ResourceUtilTest {
     @Test public void testFindResourceSuperType() {
         assertNull(ResourceUtil.findResourceSuperType(null));
     }
+
+    @Test public void testAreResourceTypesEqual() {
+        assertTrue(ResourceUtil.areResourceTypesEqual("some/type", "/apps/some/type", new String[]{"/apps/", "/libs/"}));
+        assertTrue(ResourceUtil.areResourceTypesEqual("/apps/some/type", "some/type", new String[]{"/apps/", "/libs/"}));
+        assertTrue(ResourceUtil.areResourceTypesEqual("/apps/some/type", "/apps/some/type", new String[]{"/apps/", "/libs/"}));
+        assertTrue(ResourceUtil.areResourceTypesEqual("some/type", "some/type", new String[]{"/apps/", "/libs/"}));
+        assertTrue(ResourceUtil.areResourceTypesEqual("/apps/some/type", "/libs/some/type", new String[]{"/apps/", "/libs/"}));
+        assertFalse(ResourceUtil.areResourceTypesEqual("/apps/some/type", "/libs/some/type", new String[]{}));
+    }
+
+    @Test public void testRelativizeResourceType() {
+        assertEquals("relative/type", ResourceUtil.relativizeResourceType("relative/type", new String[]{"/apps/", "/libs/"}));
+        assertEquals("relative/type", ResourceUtil.relativizeResourceType("/apps/relative/type", new String[]{"/apps/", "/libs/"}));
+        assertEquals("relative/type", ResourceUtil.relativizeResourceType("/libs/relative/type", new String[]{"/apps/", "/libs/"}));
+        assertEquals("", ResourceUtil.relativizeResourceType("/apps/", new String[]{"/apps/", "/libs/"}));
+        assertEquals("/some/prefix/type", ResourceUtil.relativizeResourceType("/some/prefix/type", new String[]{"/apps/", "/libs/"}));
+    }
 }

Modified: sling/trunk/bundles/resourceresolver/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/pom.xml?rev=1771302&r1=1771301&r2=1771302&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/pom.xml (original)
+++ sling/trunk/bundles/resourceresolver/pom.xml Fri Nov 25 12:17:45 2016
@@ -109,7 +109,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.api</artifactId>
-            <version>2.15.0</version>
+            <version>2.15.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

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=1771302&r1=1771301&r2=1771302&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 Fri Nov 25 12:17:45 2016
@@ -1311,13 +1311,13 @@ public class ResourceResolverImpl extend
              // Check if the resource is of the given type. This method first checks the
              // resource type of the resource, then its super resource type and continues
              //  to go up the resource super type hierarchy.
-             if (resourceType.equals(resource.getResourceType())) {
+             if (ResourceUtil.areResourceTypesEqual(resourceType, resource.getResourceType(), getSearchPath())) {
                  result = true;
              } else {
                  Set<String> superTypesChecked = new HashSet<String>();
                  String superType = this.getParentResourceType(resource);
                  while (!result && superType != null) {
-                     if (resourceType.equals(superType)) {
+                     if (ResourceUtil.areResourceTypesEqual(resourceType, superType, getSearchPath())) {
                          result = true;
                      } else {
                          superTypesChecked.add(superType);

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=1771302&r1=1771301&r2=1771302&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 Fri Nov 25 12:17:45 2016
@@ -556,6 +556,35 @@ public class ResourceResolverImplTest {
         assertFalse(resolver.isResourceType(resourceT3, "/types/unknown"));
     }
 
+    /**
+     * @see <a href="https://issues.apache.org/jira/browse/SLING-6327">SLING-6327</a>
+     */
+    @Test public void testIsResourceTypeWithMixedAbsoluteAndRelativePaths() {
+        final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver(new String[] {"/apps/", "/libs/"});
+
+        Resource resourceT1 = resolver.add(new SyntheticResource(resolver, "/resourceT1", "types/1"));
+        Resource resourceT2 = resolver.add(new SyntheticResource(resolver, "/resourceT2", "/apps/types/2"));
+        Resource resourceT3 = resolver.add(new SyntheticResource(resolver, "/resourceT3", "/libs/types/3"));
+        Resource resourceT4 = resolver.add(new SyntheticResource(resolver, "/resourceT3", "/someprefix/types/4"));
+
+        assertTrue(resolver.isResourceType(resourceT1, "/libs/types/1"));
+        assertTrue(resolver.isResourceType(resourceT1, "/apps/types/1"));
+        assertTrue(resolver.isResourceType(resourceT1, "types/1"));
+        
+        assertTrue(resolver.isResourceType(resourceT2, "/apps/types/2"));
+        assertTrue(resolver.isResourceType(resourceT2, "types/2"));
+        assertTrue(resolver.isResourceType(resourceT2, "/libs/types/2"));
+        
+        assertTrue(resolver.isResourceType(resourceT3, "/apps/types/3"));
+        assertTrue(resolver.isResourceType(resourceT3, "types/3"));
+        assertTrue(resolver.isResourceType(resourceT3, "/libs/types/3"));
+        
+        assertFalse(resolver.isResourceType(resourceT4, "/apps/types/4"));
+        assertFalse(resolver.isResourceType(resourceT4, "types/4"));
+        assertFalse(resolver.isResourceType(resourceT4, "/libs/types/4"));
+        assertTrue(resolver.isResourceType(resourceT4, "/someprefix/types/4"));
+    }
+
     @Test(expected=SlingException.class)  public void testIsResourceCyclicHierarchyDirect() {
         final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
 
@@ -600,9 +629,14 @@ public class ResourceResolverImplTest {
     }
 
     private PathBasedResourceResolverImpl getPathBasedResourceResolver() {
+        return getPathBasedResourceResolver(new String[] {""});
+    }
+    
+    
+    private PathBasedResourceResolverImpl getPathBasedResourceResolver(String[] searchPaths) {
         try {
             final List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
-            final PathBasedResourceResolverImpl resolver = new PathBasedResourceResolverImpl(resolvers, resourceProviderTracker);
+            final PathBasedResourceResolverImpl resolver = new PathBasedResourceResolverImpl(resolvers, resourceProviderTracker, searchPaths);
             resolvers.add(resolver);
             return resolver;
         }
@@ -614,19 +648,21 @@ public class ResourceResolverImplTest {
     private static class PathBasedResourceResolverImpl extends ResourceResolverImpl {
 
         private final Map<String, Resource> resources = new HashMap<String, Resource>();
+        private final String[] searchPaths;
 
-        public PathBasedResourceResolverImpl(final List<ResourceResolver> resolvers, final ResourceProviderTracker resourceProviderTracker) throws LoginException {
+        public PathBasedResourceResolverImpl(final List<ResourceResolver> resolvers, final ResourceProviderTracker resourceProviderTracker, String[] searchPaths) throws LoginException {
             this(new CommonResourceResolverFactoryImpl(new ResourceResolverFactoryActivator()) {
                 @Override
                 public ResourceResolver getAdministrativeResourceResolver(
                         Map<String, Object> authenticationInfo) throws LoginException {
                     return resolvers.get(0);
                 }
-            }, resourceProviderTracker);
+            }, resourceProviderTracker, searchPaths);
         }
 
-        public PathBasedResourceResolverImpl(CommonResourceResolverFactoryImpl factory, ResourceProviderTracker resourceProviderTracker) throws LoginException {
+        public PathBasedResourceResolverImpl(CommonResourceResolverFactoryImpl factory, ResourceProviderTracker resourceProviderTracker, String[] searchPaths) throws LoginException {
             super(factory, false, null, resourceProviderTracker);
+            this.searchPaths = searchPaths;
         }
 
         public Resource add(final Resource r) {
@@ -636,7 +672,7 @@ public class ResourceResolverImplTest {
 
         @Override
         public String[] getSearchPath() {
-            return new String[] {""};
+            return searchPaths;
         }
 
         @Override