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