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