You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2016/02/05 13:42:35 UTC
svn commit: r1728657 - in /sling/trunk/bundles/resourceresolver/src:
main/java/org/apache/sling/resourceresolver/impl/
main/java/org/apache/sling/resourceresolver/impl/helper/
main/java/org/apache/sling/resourceresolver/impl/providers/stateful/
test/ja...
Author: cziegeler
Date: Fri Feb 5 12:42:35 2016
New Revision: 1728657
URL: http://svn.apache.org/viewvc?rev=1728657&view=rev
Log:
SLING-5488 : Attribute handling is not correct
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/ProviderManager.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ProviderHandlerTest.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceProviderEntryTest.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/ResourceResolverFactoryActivator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java Fri Feb 5 12:42:35 2016
@@ -63,7 +63,6 @@ import org.osgi.service.event.EventAdmin
* One all required providers and provider factories are available a resource resolver factory
* is registered.
*
- * TODO : Should we implement modifiable? It would be easy but what about long running resolvers?
*/
@Component(
name = "org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl",
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java Fri Feb 5 12:42:35 2016
@@ -55,7 +55,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * This class takes a number of {@link StatefulResourceProvider} objects and
+ * This class takes a number of {@link AuthenticatedResourceProvider} objects and
* exposes it as one such object. Provider appropriate for the given operation
* is chosen basing on its {@link ResourceProviderInfo#getPath()} (more specific
* first) and service ranking.
@@ -66,6 +66,8 @@ public class ResourceResolverControl {
private static final Logger logger = LoggerFactory.getLogger(ResourceResolverControl.class);
+ private static final String FORBIDDEN_ATTRIBUTE = ResourceResolverFactory.PASSWORD;
+
/** Is this a resource resolver for an admin? */
private final boolean isAdmin;
@@ -308,27 +310,31 @@ public class ResourceResolverControl {
public Collection<String> getAttributeNames(final ResourceResolverContext context) {
final Set<String> names = new LinkedHashSet<String>();
for (final AuthenticatedResourceProvider p : context.getProviderManager().getAllBestEffort(storage.getAttributableHandlers(), this)) {
- final Collection<String> newNames = p.getAttributeNames(this.authenticationInfo);
- if (newNames != null) {
- names.addAll(newNames);
- }
+ p.getAttributeNames(names);
+ }
+ if ( this.authenticationInfo != null ) {
+ names.addAll(authenticationInfo.keySet());
}
+ names.remove(FORBIDDEN_ATTRIBUTE);
return names;
}
/**
* Returns the first non-null result of the
- * {@link StatefulResourceProvider#getAttribute(String)} invocation on
+ * {@link AuthenticatedResourceProvider#getAttribute(String)} invocation on
* the providers.
*/
public Object getAttribute(final ResourceResolverContext context, final String name) {
+ if (FORBIDDEN_ATTRIBUTE.equals(name)) {
+ return null;
+ }
for (final AuthenticatedResourceProvider p : context.getProviderManager().getAllBestEffort(storage.getAttributableHandlers(), this)) {
- Object attribute = p.getAttribute(name, this.authenticationInfo);
+ final Object attribute = p.getAttribute(name);
if (attribute != null) {
return attribute;
}
}
- return null;
+ return this.authenticationInfo != null ? this.authenticationInfo.get(name) :null;
}
/**
@@ -459,7 +465,6 @@ public class ResourceResolverControl {
*/
@SuppressWarnings("unchecked")
public <AdapterType> AdapterType adaptTo(final ResourceResolverContext context, Class<AdapterType> type) {
- // TODO - improve by providing an iterator instead of a list (getAllBestEffort)
for (AuthenticatedResourceProvider p : context.getProviderManager().getAllBestEffort(storage.getAdaptableHandlers(), this)) {
final Object adaptee = p.adaptTo(type);
if (adaptee != null) {
@@ -547,7 +552,7 @@ public class ResourceResolverControl {
/**
* Tries to find a resource provider accepting both paths and invokes
- * {@link StatefulResourceProvider#copy(String, String)} method on it.
+ * {@link AuthenticatedResourceProvider#copy(String, String)} method on it.
* Returns false if there's no such provider.
*/
public Resource copy(final ResourceResolverContext context,
@@ -575,7 +580,7 @@ public class ResourceResolverControl {
/**
* Tries to find a resource provider accepting both paths and invokes
- * {@link StatefulResourceProvider#move(String, String)} method on it.
+ * {@link AuthenticatedResourceProvider#move(String, String)} method on it.
* Returns false if there's no such provider.
*/
public Resource move(final ResourceResolverContext context,
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java Fri Feb 5 12:42:35 2016
@@ -20,7 +20,6 @@ package org.apache.sling.resourceresolve
import java.util.Collection;
import java.util.Iterator;
-import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
@@ -30,7 +29,6 @@ import javax.annotation.Nonnull;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.security.AccessSecurityException;
import org.apache.sling.api.security.ResourceAccessSecurity;
import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker;
@@ -53,8 +51,6 @@ public class AuthenticatedResourceProvid
private static final Logger logger = LoggerFactory.getLogger(ResourceResolverImpl.class);
- private static final String FORBIDDEN_ATTRIBUTE = ResourceResolverFactory.PASSWORD;
-
public static final AuthenticatedResourceProvider UNAUTHENTICATED_PROVIDER = new AuthenticatedResourceProvider(null, false, null, null);
private final ResourceProvider<Object> provider;
@@ -133,31 +129,19 @@ public class AuthenticatedResourceProvid
/**
* #see {@link ResourceProvider#getAttributeNames(ResolveContext)}
*/
- public Collection<String> getAttributeNames(final Map<String, Object> authInfo) {
- Set<String> attributeNames = new LinkedHashSet<String>();
+ public Collection<String> getAttributeNames(final Set<String> attributeNames) {
Collection<String> rpAttributeNames = this.provider.getAttributeNames(this.resolveContext);
if (rpAttributeNames != null) {
attributeNames.addAll(rpAttributeNames);
}
- if (authInfo != null) {
- attributeNames.addAll(authInfo.keySet());
- }
- attributeNames.remove(FORBIDDEN_ATTRIBUTE);
return attributeNames;
}
/**
* #see {@link ResourceProvider#getAttribute(ResolveContext, String)}
*/
- public Object getAttribute(final String name, final Map<String, Object> authInfo) {
- if (FORBIDDEN_ATTRIBUTE.equals(name)) {
- return null;
- }
- Object attribute = this.provider.getAttribute(this.resolveContext, name);
- if (attribute == null) {
- attribute = authInfo.get(name);
- }
- return attribute;
+ public Object getAttribute(final String name) {
+ return this.provider.getAttribute(this.resolveContext, name);
}
/**
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/ProviderManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/ProviderManager.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/ProviderManager.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/ProviderManager.java Fri Feb 5 12:42:35 2016
@@ -20,6 +20,7 @@ package org.apache.sling.resourceresolve
import java.util.ArrayList;
import java.util.Collection;
import java.util.IdentityHashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -31,6 +32,7 @@ import org.apache.sling.api.resource.Res
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.runtime.dto.AuthType;
import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker;
+import org.apache.sling.resourceresolver.impl.helper.AbstractIterator;
import org.apache.sling.resourceresolver.impl.helper.ResourceResolverControl;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
import org.apache.sling.spi.resource.provider.ResolveContext;
@@ -190,19 +192,30 @@ public class ProviderManager {
return refreshable;
}
- public Collection<AuthenticatedResourceProvider> getAllBestEffort(@Nonnull final List<ResourceProviderHandler> handlers,
+ public Iterable<AuthenticatedResourceProvider> getAllBestEffort(@Nonnull final List<ResourceProviderHandler> handlers,
@Nonnull final ResourceResolverControl control) {
- final List<AuthenticatedResourceProvider> result = new ArrayList<AuthenticatedResourceProvider>(handlers.size());
- for (final ResourceProviderHandler h : handlers) {
- try {
- final AuthenticatedResourceProvider rp = this.getOrCreateProvider(h, control);
- if ( rp != null ) {
- result.add(rp);
- }
- } catch ( final LoginException le) {
- // ignore
+ final Iterator<ResourceProviderHandler> handlerIter = handlers.iterator();
+ return new Iterable<AuthenticatedResourceProvider>() {
+
+ @Override
+ public Iterator<AuthenticatedResourceProvider> iterator() {
+ return new AbstractIterator<AuthenticatedResourceProvider>() {
+
+ @Override
+ protected AuthenticatedResourceProvider seek() {
+ AuthenticatedResourceProvider result = null;
+ while ( result == null && handlerIter.hasNext() ) {
+ final ResourceProviderHandler h = handlerIter.next();
+ try {
+ result = getOrCreateProvider(h, control);
+ } catch ( final LoginException le) {
+ // ignore
+ }
+ }
+ return result;
+ }
+ };
}
- }
- return result;
+ };
}
}
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ProviderHandlerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ProviderHandlerTest.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ProviderHandlerTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ProviderHandlerTest.java Fri Feb 5 12:42:35 2016
@@ -57,7 +57,9 @@ public class ProviderHandlerTest {
final ResourceProvider<?> leaveProvider = Mockito.mock(ResourceProvider.class);
Mockito.when(leaveProvider.getResource(Mockito.any(ResolveContext.class), Mockito.eq(servletpath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(servletResource);
ResourceProviderHandler h = createRPHandler(leaveProvider, "my-pid", 0, servletpath);
- ResourceResolver resolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(new ResourceResolverFactoryActivator()), false, null, new ResourceProviderStorage(Arrays.asList(h)));
+ ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator();
+ activator.resourceAccessSecurityTracker = new ResourceAccessSecurityTracker();
+ ResourceResolver resolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(activator), false, null, new ResourceProviderStorage(Arrays.asList(h)));
final Resource parent = resolver.getResource(ResourceUtil.getParent(servletpath));
assertNotNull("Parent must be available", parent);
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java Fri Feb 5 12:42:35 2016
@@ -135,6 +135,11 @@ public abstract class ResourceDecoratorT
public ResourceDecoratorTracker getResourceDecoratorTracker() {
return t;
}
+
+ @Override
+ public ResourceAccessSecurityTracker getResourceAccessSecurityTracker() {
+ return new ResourceAccessSecurityTracker();
+ }
};
List<ResourceProviderHandler> list = Arrays.asList(MockedResourceResolverImplTest.createRPHandler(provider, "A-provider", 0L, "/"));
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceProviderEntryTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceProviderEntryTest.java?rev=1728657&r1=1728656&r2=1728657&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceProviderEntryTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceProviderEntryTest.java Fri Feb 5 12:42:35 2016
@@ -242,7 +242,9 @@ public class ResourceProviderEntryTest {
private ResourceResolver getResolver() throws LoginException {
if (providersBasedResolver == null) {
- providersBasedResolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(new ResourceResolverFactoryActivator()), false, null,
+ final ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator();
+ activator.resourceAccessSecurityTracker = new ResourceAccessSecurityTracker();
+ providersBasedResolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(activator), false, null,
new ResourceProviderStorage(providers));
}
return providersBasedResolver;
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=1728657&r1=1728656&r2=1728657&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 Feb 5 12:42:35 2016
@@ -88,6 +88,7 @@ public class ResourceResolverImplTest {
when(resourceProviderTracker.getResourceProviderStorage()).thenReturn(storage);
ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator();
activator.resourceProviderTracker = resourceProviderTracker;
+ activator.resourceAccessSecurityTracker = new ResourceAccessSecurityTracker();
commonFactory = new CommonResourceResolverFactoryImpl(activator);
resFac = new ResourceResolverFactoryImpl(commonFactory, /* TODO: using Bundle */ null, null);
resResolver = resFac.getAdministrativeResourceResolver(null);
@@ -504,7 +505,7 @@ public class ResourceResolverImplTest {
@Test public void testIsResourceType() {
final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
-
+
final Resource r = resolver.add(new SyntheticResourceWithSupertype(resolver, "/a", "a:b", "d:e"));
resolver.add(new SyntheticResourceWithSupertype(resolver, "/d/e", "x:y", "t:c"));
@@ -517,7 +518,7 @@ public class ResourceResolverImplTest {
@Test public void testIsResourceTypeWithPaths() {
final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
-
+
/**
* prepare resource type hierarchy
* /types/1
@@ -553,7 +554,7 @@ public class ResourceResolverImplTest {
@Test(expected=SlingException.class) public void testIsResourceCyclicHierarchyDirect() {
final PathBasedResourceResolverImpl resolver = getPathBasedResourceResolver();
-
+
/**
* prepare resource type hierarchy
* /types/1 <---+
@@ -566,14 +567,14 @@ public class ResourceResolverImplTest {
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 <----+
@@ -617,9 +618,9 @@ public class ResourceResolverImplTest {
Map<String, Object> authenticationInfo) throws LoginException {
return resolvers.get(0);
}
- }, resourceProviderTracker);
+ }, resourceProviderTracker);
}
-
+
public PathBasedResourceResolverImpl(CommonResourceResolverFactoryImpl factory, ResourceProviderTracker resourceProviderTracker) throws LoginException {
super(factory, false, null, resourceProviderTracker.getResourceProviderStorage());
}
@@ -642,20 +643,20 @@ public class ResourceResolverImplTest {
}
private static class SyntheticResourceWithSupertype extends SyntheticResource {
-
+
private final String resourceSuperType;
-
+
public SyntheticResourceWithSupertype(ResourceResolver resourceResolver, String path,
String resourceType, String resourceSuperType) {
super(resourceResolver, path, resourceType);
this.resourceSuperType = resourceSuperType;
}
-
+
@Override
public String getResourceSuperType() {
return this.resourceSuperType;
}
-
+
}
-
+
}