Author: fmeschbe
Date: Fri Jan 17 15:17:09 2014
New Revision: 1559135

URL: http://svn.apache.org/r1559135
Log:
Feature Flags Simplification Prototype

- Implement feature flag check in the ResourceResolver, actually
   the ProviderHandler.getReadableResource method: Feature flags
   are expected in the String or String[] property sling:features. If
   set, then a resource is considered if any one of the listed features are
   enabled.
- If the Features service is available, the value of the sling:features
   property is copied to the sling:features ResourceMetadata property.
- Adapt a few places to be able to pass around the Features service
- Availability of the Features service (and API) is optional. If not available
   sling:feature properties are ignored.

Added:
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
   (with props)
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java
   (with props)
Modified:
    sling/whiteboard/fmeschbe/featureflags/resourceresolver/pom.xml
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ProviderHandler.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecorationTest.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverMangleNamespacesTest.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/SortedProviderListTest.java
    
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java

Modified: sling/whiteboard/fmeschbe/featureflags/resourceresolver/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/pom.xml?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/featureflags/resourceresolver/pom.xml (original)
+++ sling/whiteboard/fmeschbe/featureflags/resourceresolver/pom.xml Fri Jan 17 
15:17:09 2014
@@ -78,6 +78,7 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
+                            org.apache.sling.featureflags;resolution:=optional,
                             javax.annotation;resolution:=optional,
                             org.apache.sling.api.resource;provide:=true,
                             org.apache.sling.commons.osgi;version="$(@)",
@@ -87,6 +88,9 @@
                             org.apache.sling.resourceresolver.impl.*,
                             org.apache.sling.resourceresolver.accessgate.impl.*
                         </Private-Package>
+                        <DynamicImport-Package>
+                            org.apache.sling.featureflags;version="[1.0,2.0)"
+                        </DynamicImport-Package>
                     </instructions>
                 </configuration>
             </plugin>
@@ -145,6 +149,14 @@
             <scope>provided</scope>
         </dependency>
 
+        <!-- Feature Flag Support -->
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.featureflags</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+
         <!-- For the Console Plugin of the ResourceResolverFactoryImpl -->
         <dependency>
             <groupId>javax.servlet</groupId>

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
 Fri Jan 17 15:17:09 2014
@@ -100,7 +100,7 @@ public class CommonResourceResolverFacto
                     final boolean isAdmin)
     throws LoginException {
         // create context
-        final ResourceResolverContext ctx = new 
ResourceResolverContext(isAdmin, authenticationInfo, 
this.activator.getResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = new 
ResourceResolverContext(isAdmin, authenticationInfo, 
this.activator.getResourceAccessSecurityTracker(), this.activator);
 
         // login
         this.activator.getRootProviderEntry().loginToRequiredFactories(ctx);

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
 Fri Jan 17 15:17:09 2014
@@ -41,6 +41,8 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceProviderFactory;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.featureflags.Features;
+import org.apache.sling.resourceresolver.impl.helper.FeaturesHolder;
 import org.apache.sling.resourceresolver.impl.helper.ResourceDecoratorTracker;
 import org.apache.sling.resourceresolver.impl.mapping.MapEntries;
 import org.apache.sling.resourceresolver.impl.mapping.Mapping;
@@ -76,7 +78,7 @@ import org.osgi.service.event.EventAdmin
     @Reference(name = "ResourceProvider", referenceInterface = 
ResourceProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, 
policy = ReferencePolicy.DYNAMIC),
     @Reference(name = "ResourceProviderFactory", referenceInterface = 
ResourceProviderFactory.class, cardinality = 
ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
     @Reference(name = "ResourceDecorator", referenceInterface = 
ResourceDecorator.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, 
policy = ReferencePolicy.DYNAMIC) })
-public class ResourceResolverFactoryActivator {
+public class ResourceResolverFactoryActivator implements FeaturesHolder {
 
     private static final class FactoryRegistration {
         /** Registration .*/
@@ -219,6 +221,11 @@ public class ResourceResolverFactoryActi
     @Reference
     ResourceAccessSecurityTracker resourceAccessSecurityTracker;
 
+    @Reference(
+            policy = ReferencePolicy.DYNAMIC,
+            cardinality = ReferenceCardinality.OPTIONAL_UNARY)
+    private Features featuresService;
+
     /** ComponentContext */
     private volatile ComponentContext componentContext;
 
@@ -243,6 +250,10 @@ public class ResourceResolverFactoryActi
         return this.resourceAccessSecurityTracker;
     }
 
+    public Features getFeatures() {
+        return this.featuresService;
+    }
+
     public EventAdmin getEventAdmin() {
         return this.eventAdmin;
     }

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
 Fri Jan 17 15:17:09 2014
@@ -122,7 +122,7 @@ public class ResourceResolverImpl extend
 
         // create new context
         final ResourceResolverContext newContext = new 
ResourceResolverContext(this.context.isAdmin(),
-                newAuthenticationInfo, 
factory.getResourceAccessSecurityTracker() );
+                newAuthenticationInfo, 
factory.getResourceAccessSecurityTracker(), this.context.getFeaturesHolder() );
         
this.factory.getRootProviderEntry().loginToRequiredFactories(newContext);
 
         // create a regular resource resolver

Added: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java?rev=1559135&view=auto
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
 (added)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
 Fri Jan 17 15:17:09 2014
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl.helper;
+
+import org.apache.sling.featureflags.Features;
+
+/**
+ * The <code>FeaturesHolder</code> interface is an API to provide dynamic
+ * access to the Features service without having to hold on to the
+ * Features instance directly.
+ */
+public interface FeaturesHolder {
+
+    /**
+     * @return The {@code Features} service if available, {@code null} 
otherwise
+     */
+    public Features getFeatures();
+
+}

Propchange: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
 Fri Jan 17 15:17:09 2014
@@ -32,6 +32,9 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.featureflags.ClientContext;
+import org.apache.sling.featureflags.Features;
 import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker;
 
 /**
@@ -67,13 +70,17 @@ public class ResourceResolverContext {
     /** Resource type resource resolver (admin resolver) */
     private ResourceResolver resourceTypeResourceResolver;
 
+    /** Features ServiceTracker */
+    private final FeaturesHolder featuresService;
+
     /**
      * Create a new resource resolver context.
      */
-    public ResourceResolverContext(final boolean isAdmin, final Map<String, 
Object> originalAuthInfo, final ResourceAccessSecurityTracker 
resourceAccessSecurityTracker) {
+    public ResourceResolverContext(final boolean isAdmin, final Map<String, 
Object> originalAuthInfo, final ResourceAccessSecurityTracker 
resourceAccessSecurityTracker, final FeaturesHolder featuresService) {
         this.isAdmin = isAdmin;
         this.originalAuthInfo = originalAuthInfo;
         this.resourceAccessSecurityTracker = resourceAccessSecurityTracker;
+        this.featuresService = featuresService;
     }
 
     /**
@@ -84,6 +91,13 @@ public class ResourceResolverContext {
     }
 
     /**
+     * @return the Features service tracker used by this context
+     */
+    public FeaturesHolder getFeaturesHolder() {
+        return this.featuresService;
+    }
+
+    /**
      * Return the authentication info.
      */
     public Map<String, Object> getAuthenticationInfo() {
@@ -235,4 +249,51 @@ public class ResourceResolverContext {
         }
         return resourceSuperType;
     }
+
+    /**
+     * Checks whether the resource has a sling:features property. If so the
+     * Features service is consulted to indicate whether any of the named
+     * features is enabled and thus the resource is visible at all.
+     * <p>
+     * If none of the listed features is enabled, the resource is not visible
+     * and null is returned. Otherwise the list of features configured on the
+     * Resource is stored in the ResourceMetadata and the resource is returned.
+     * <p>
+     * If the Features service is not available, the features property is not
+     * consulted and not added to the ResourceMetadata. The resource is 
returned
+     * unmodified in this case.
+     *
+     * @param resource The resource to check for features
+     * @return The unmodified resource if the Features service is not available
+     *         or no features are set on the property. Otherwise the features
+     *         are added to the ResourceMetadata and the resource is returned 
if
+     *         one of the listed features is enabled. Otherwise null is
+     *         returned.
+     */
+    public Resource applyFeatures(final Resource resource) {
+        if (resource != null) {
+            Features featuresService = this.featuresService.getFeatures();
+            if (featuresService != null) {
+                ValueMap props = resource.adaptTo(ValueMap.class);
+                if (props != null) {
+                    ClientContext featureContext = 
featuresService.getCurrentClientContext();
+                    String[] features = props.get(Features.FEATURE_PROPERTY, 
String[].class);
+                    if (features != null && features.length > 0) {
+                        for (String feature : features) {
+                            if (featureContext.isEnabled(feature)) {
+                                
resource.getResourceMetadata().put(Features.FEATURE_PROPERTY, features);
+                                return resource;
+                            }
+                        }
+
+                        // invariant: none of the named features enabled
+                        return null;
+                    }
+                }
+            }
+        }
+
+        // invariant: null resource or no feature check on resource
+        return resource;
+    }
 }

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ProviderHandler.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ProviderHandler.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ProviderHandler.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ProviderHandler.java
 Fri Jan 17 15:17:09 2014
@@ -176,7 +176,8 @@ public abstract class ProviderHandler im
                 returnValue = 
resourceAccessSecurity.getReadableResource(resource);
             }
         }
-        return returnValue;
+
+        return ctx.applyFeatures(returnValue);
     }
 
     /**

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecorationTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecorationTest.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecorationTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecorationTest.java
 Fri Jan 17 15:17:09 2014
@@ -18,9 +18,9 @@
  */
 package org.apache.sling.resourceresolver.impl;
 
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Iterator;

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceDecoratorTestBase.java
 Fri Jan 17 15:17:09 2014
@@ -37,6 +37,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceProvider;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.resourceresolver.impl.helper.MockFeaturesHolder;
 import org.apache.sling.resourceresolver.impl.helper.ResourceDecoratorTracker;
 import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext;
 import org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry;
@@ -132,7 +133,7 @@ public abstract class ResourceDecoratorT
                 return rrp;
             }
         };
-        resolver = new ResourceResolverImpl(crf, new 
ResourceResolverContext(false, null, new ResourceAccessSecurityTracker()));
+        resolver = new ResourceResolverImpl(crf, new 
ResourceResolverContext(false, null, new ResourceAccessSecurityTracker(), 
MockFeaturesHolder.INSTANCE));
     }
 
     protected void assertExistent(Resource r, boolean existent) {

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
 Fri Jan 17 15:17:09 2014
@@ -41,6 +41,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.api.resource.SyntheticResource;
+import org.apache.sling.resourceresolver.impl.helper.MockFeaturesHolder;
 import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext;
 import org.junit.Before;
 import org.junit.Test;
@@ -57,11 +58,11 @@ public class ResourceResolverImplTest {
     @Before public void setup() {
         commonFactory = new CommonResourceResolverFactoryImpl(new 
ResourceResolverFactoryActivator());
         resFac = new ResourceResolverFactoryImpl(commonFactory, /* TODO: using 
Bundle */ null, null);
-        resResolver = new ResourceResolverImpl(commonFactory, new 
ResourceResolverContext(false, null, new ResourceAccessSecurityTracker()));
+        resResolver = new ResourceResolverImpl(commonFactory, new 
ResourceResolverContext(false, null, new ResourceAccessSecurityTracker(), 
MockFeaturesHolder.INSTANCE));
     }
 
     @Test public void testClose() throws Exception {
-        final ResourceResolver rr = new ResourceResolverImpl(commonFactory, 
new ResourceResolverContext(false, null, new ResourceAccessSecurityTracker()));
+        final ResourceResolver rr = new ResourceResolverImpl(commonFactory, 
new ResourceResolverContext(false, null, new ResourceAccessSecurityTracker(), 
MockFeaturesHolder.INSTANCE));
         assertTrue(rr.isLive());
         rr.close();
         assertFalse(rr.isLive());
@@ -358,7 +359,7 @@ public class ResourceResolverImplTest {
                     }
 
                 },
-                new ResourceResolverContext(false, null, new 
ResourceAccessSecurityTracker()));
+                new ResourceResolverContext(false, null, new 
ResourceAccessSecurityTracker(), null));
         resolvers.add(resolver);
 
         // the resources to test
@@ -394,7 +395,7 @@ public class ResourceResolverImplTest {
                     }
 
                 },
-                new ResourceResolverContext(false, null, new 
ResourceAccessSecurityTracker()));
+                new ResourceResolverContext(false, null, new 
ResourceAccessSecurityTracker(), null));
         resolvers.add(resolver);
         final Resource r = new SyntheticResource(resolver, "/a", "a:b") {
             @Override

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverMangleNamespacesTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverMangleNamespacesTest.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverMangleNamespacesTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverMangleNamespacesTest.java
 Fri Jan 17 15:17:09 2014
@@ -24,6 +24,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.resourceresolver.impl.helper.MockFeaturesHolder;
 import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext;
 import org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry;
 import org.junit.Before;
@@ -77,7 +78,7 @@ public class ResourceResolverMangleNames
             }
         };
 
-        rr = new ResourceResolverImpl(fac, new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker()));
+        rr = new ResourceResolverImpl(fac, new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker(), MockFeaturesHolder.INSTANCE));
     }
 
     @Test

Added: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java?rev=1559135&view=auto
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java
 (added)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java
 Fri Jan 17 15:17:09 2014
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl.helper;
+
+import org.apache.sling.featureflags.Features;
+
+public class MockFeaturesHolder implements FeaturesHolder {
+    public static final FeaturesHolder INSTANCE = new MockFeaturesHolder();
+
+    public Features getFeatures() {
+        return null;
+    }
+}

Propchange: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/MockFeaturesHolder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/SortedProviderListTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/SortedProviderListTest.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/SortedProviderListTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/helper/SortedProviderListTest.java
 Fri Jan 17 15:17:09 2014
@@ -100,7 +100,7 @@ public class SortedProviderListTest {
         final AdaptableResourceProviderImpl rp3 = new 
AdaptableResourceProviderImpl(new String[] {"/hello"}, 3L);
         final ResourceProviderImpl rp4 = new ResourceProviderImpl(new String[] 
{"/you"}, 4L);
 
-        final ResourceResolverContext ctx = new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker(), MockFeaturesHolder.INSTANCE);
 
         final SortedProviderList<Adaptable> spl = new 
SortedProviderList<Adaptable>(Adaptable.class);
         check(spl, ctx);
@@ -132,7 +132,7 @@ public class SortedProviderListTest {
         final AdaptableResourceProviderImpl rp4 = new 
AdaptableResourceProviderImpl(new String[] {"/a/a"}, 4L);
         final AdaptableResourceProviderImpl rp5 = new 
AdaptableResourceProviderImpl(new String[] {"/all/or/nothing"}, 5L);
 
-        final ResourceResolverContext ctx = new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = new ResourceResolverContext(false, 
null, new ResourceAccessSecurityTracker(), null);
 
         final SortedProviderList<Adaptable> spl = new 
SortedProviderList<Adaptable>(Adaptable.class);
         check(spl, ctx);

Modified: 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java?rev=1559135&r1=1559134&r2=1559135&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/featureflags/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
 Fri Jan 17 15:17:09 2014
@@ -37,6 +37,8 @@ import org.apache.sling.resourceresolver
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 import org.osgi.framework.Constants;
 
 public class ResourceProviderEntryTest {
@@ -56,8 +58,7 @@ public class ResourceProviderEntryTest {
 
     @Test public void testRootProvider() {
         assertNull(root.getResource(null, null, "relpath"));
-        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
-        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = getResourceResolverContext();
         assertEqualsResolver(this.rootResolver, root.getResource(ctx, null, 
"/"));
         assertEqualsResolver(this.rootResolver, root.getResource(ctx, null, 
"/rootel"));
         assertEqualsResolver(this.rootResolver, root.getResource(ctx, null, 
"/rootel/child"));
@@ -68,8 +69,7 @@ public class ResourceProviderEntryTest {
 
     @Test public void testAdd1Provider() {
         String firstPath = "/rootel";
-        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
-        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = getResourceResolverContext();
         final ResourceResolver resolver = Mockito.mock(ResourceResolver.class);
         final ResourceProvider first = Mockito.mock(ResourceProvider.class);
         Mockito.when(first.getResource(Mockito.any(ResourceResolver.class), 
Mockito.startsWith(firstPath))).thenReturn(new TestResource(resolver));
@@ -95,8 +95,7 @@ public class ResourceProviderEntryTest {
         String thirdPath = "/apps/sling/sample";
         String secondPath = firstPath + "/child";
 
-        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
-        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = getResourceResolverContext();
         final ResourceResolver firstResolver = 
Mockito.mock(ResourceResolver.class);
         final ResourceProvider first = Mockito.mock(ResourceProvider.class);
         Mockito.when(first.getResource(Mockito.any(ResourceResolver.class), 
Mockito.startsWith(firstPath))).thenReturn(new TestResource(firstResolver));
@@ -135,8 +134,7 @@ public class ResourceProviderEntryTest {
         String thirdPath = "/apps/sling/sample";
         String secondPath = firstPath + "/child";
 
-        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
-        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = getResourceResolverContext();
         final ResourceResolver firstResolver = 
Mockito.mock(ResourceResolver.class);
         final ResourceProvider first = Mockito.mock(ResourceProvider.class);
         Mockito.when(first.getResource(Mockito.any(ResourceResolver.class), 
Mockito.startsWith(firstPath))).thenReturn(new TestResource(firstResolver));
@@ -175,8 +173,7 @@ public class ResourceProviderEntryTest {
         String thirdPath = "/apps/sling/sample";
         String secondPath = firstPath + "/child";
 
-        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
-        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        final ResourceResolverContext ctx = getResourceResolverContext();
         final ResourceResolver firstResolver = 
Mockito.mock(ResourceResolver.class);
         final ResourceProvider first = Mockito.mock(ResourceProvider.class);
         Mockito.when(first.getResource(Mockito.any(ResourceResolver.class), 
Mockito.startsWith(firstPath))).thenReturn(new TestResource(firstResolver));
@@ -223,9 +220,8 @@ public class ResourceProviderEntryTest {
         for(String path : new String[] { "/foo", "/", "/foo/bar" }) {
             final ResourceResolver resolver = 
Mockito.mock(ResourceResolver.class);
             final ResourceProvider p = Mockito.mock(ResourceProvider.class);
-            final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
             Mockito.when(p.getResource(Mockito.any(ResourceResolver.class), 
Mockito.startsWith(path))).thenReturn(new TestResource(resolver));
-            
Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+            final ResourceResolverContext ctx = getResourceResolverContext();
 
             final Map<String, Object> props = new HashMap<String, Object>();
             props.put(Constants.SERVICE_ID, ++counter);
@@ -256,6 +252,17 @@ public class ResourceProviderEntryTest {
         assertEquals(resolver, res.getResourceResolver());
     }
 
+    private ResourceResolverContext getResourceResolverContext() {
+        final ResourceResolverContext ctx = 
Mockito.mock(ResourceResolverContext.class);
+        Mockito.when(ctx.getResourceAccessSecurityTracker()).thenReturn(new 
ResourceAccessSecurityTracker());
+        Mockito.when(ctx.applyFeatures(Mockito.any(Resource.class))).then(new 
Answer<Resource>() {
+            public Resource answer(InvocationOnMock invocation) {
+                return (Resource) invocation.getArguments()[0];
+            }
+        });
+        return ctx;
+    }
+
     private static class TestResource extends AbstractResource {
 
         private final ResourceResolver resourceResolver;


Reply via email to