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;