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;
         }
-        
+
     }
-    
+
 }