You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2014/01/28 11:30:15 UTC
svn commit: r1562025 - in
/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl:
ResourceResolverFactoryActivator.java helper/FeaturesHolder.java
helper/ResourceResolverContext.java
Author: fmeschbe
Date: Tue Jan 28 10:30:15 2014
New Revision: 1562025
URL: http://svn.apache.org/r1562025
Log:
SLING-3148 Change Features service reference to be lookup strategy and return
as an Object to prevent link failures if the Features service API is not available
at run time.
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/FeaturesHolder.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.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=1562025&r1=1562024&r2=1562025&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 Tue Jan 28 10:30:15 2014
@@ -35,6 +35,7 @@ import org.apache.felix.scr.annotations.
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.ReferenceStrategy;
import org.apache.felix.scr.annotations.References;
import org.apache.sling.api.resource.ResourceDecorator;
import org.apache.sling.api.resource.ResourceProvider;
@@ -77,7 +78,9 @@ import org.osgi.service.event.EventAdmin
@References({
@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) })
+ @Reference(name = "ResourceDecorator", referenceInterface = ResourceDecorator.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
+ @Reference(name = ResourceResolverFactoryActivator.FEATURES_NAME, referenceInterface = Features.class, cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC, strategy = ReferenceStrategy.LOOKUP)
+})
public class ResourceResolverFactoryActivator implements FeaturesHolder {
private static final class FactoryRegistration {
@@ -186,6 +189,9 @@ public class ResourceResolverFactoryActi
"are processed and added to the mappoing table.")
private static final String PROP_ENABLE_VANITY_PATH = "resource.resolver.enable.vanitypath";
+ // name of the Features service reference
+ static final String FEATURES_NAME = "features";
+
/** Tracker for the resource decorators. */
private final ResourceDecoratorTracker resourceDecoratorTracker = new ResourceDecoratorTracker();
@@ -221,11 +227,6 @@ public class ResourceResolverFactoryActi
@Reference
ResourceAccessSecurityTracker resourceAccessSecurityTracker;
- @Reference(
- policy = ReferencePolicy.DYNAMIC,
- cardinality = ReferenceCardinality.OPTIONAL_UNARY)
- private Features featuresService;
-
/** ComponentContext */
private volatile ComponentContext componentContext;
@@ -250,8 +251,13 @@ public class ResourceResolverFactoryActi
return this.resourceAccessSecurityTracker;
}
- public Features getFeatures() {
- return this.featuresService;
+ public Object getFeatures() {
+ // This calls into the ComponentContext on each access to this method
+ // which will happen at least once for each resource being resolved.
+ // we might want to consider performance of this mechanism and maybe
+ // fall back to event based lookup with a marker value to indicate
+ // whether the service has to be retrieved or not
+ return this.componentContext.locateService(FEATURES_NAME);
}
public EventAdmin getEventAdmin() {
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java?rev=1562025&r1=1562024&r2=1562025&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/FeaturesHolder.java Tue Jan 28 10:30:15 2014
@@ -18,8 +18,6 @@
*/
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
@@ -30,6 +28,6 @@ public interface FeaturesHolder {
/**
* @return The {@code Features} service if available, {@code null} otherwise
*/
- public Features getFeatures();
+ public Object getFeatures();
}
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java?rev=1562025&r1=1562024&r2=1562025&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java Tue Jan 28 10:30:15 2014
@@ -80,16 +80,16 @@ public class ResourceResolverContext {
private ResourceResolver resourceTypeResourceResolver;
/** Features ServiceTracker */
- private final FeaturesHolder featuresService;
+ private final FeaturesHolder featuresHolder;
/**
* Create a new resource resolver context.
*/
- public ResourceResolverContext(final boolean isAdmin, final Map<String, Object> originalAuthInfo, final ResourceAccessSecurityTracker resourceAccessSecurityTracker, final FeaturesHolder featuresService) {
+ public ResourceResolverContext(final boolean isAdmin, final Map<String, Object> originalAuthInfo, final ResourceAccessSecurityTracker resourceAccessSecurityTracker, final FeaturesHolder featuresHolder) {
this.isAdmin = isAdmin;
this.originalAuthInfo = originalAuthInfo;
this.resourceAccessSecurityTracker = resourceAccessSecurityTracker;
- this.featuresService = featuresService;
+ this.featuresHolder = featuresHolder;
}
/**
@@ -103,7 +103,7 @@ public class ResourceResolverContext {
* @return the Features service tracker used by this context
*/
public FeaturesHolder getFeaturesHolder() {
- return this.featuresService;
+ return this.featuresHolder;
}
/**
@@ -281,11 +281,11 @@ public class ResourceResolverContext {
*/
public Resource applyFeatures(final Resource resource) {
if (resource != null) {
- Features featuresService = this.featuresService.getFeatures();
- if (featuresService != null) {
+ Object featuresService = this.featuresHolder.getFeatures();
+ if (featuresService instanceof Features) {
String[] features = getProperty(resource, RESOURCE_PROPERTY, String[].class);
if (features != null && features.length > 0) {
- ClientContext featureContext = featuresService.getCurrentClientContext();
+ ClientContext featureContext = ((Features) featuresService).getCurrentClientContext();
for (String feature : features) {
// check whether the feature must be disabled