You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:35:07 UTC

[sling-org-apache-sling-featureflags] 02/04: SLING-5981 : Provide access to Features service in execution context

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.featureflags-1.2.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-featureflags.git

commit d5ca8fedfa681210afa8e8da357e130df1ee15da
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Aug 19 16:26:24 2016 +0000

    SLING-5981 : Provide access to Features service in execution context
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/feature-flags@1756930 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/featureflags/ExecutionContext.java       |  7 ++++++
 .../sling/featureflags/impl/ConfiguredFeature.java |  5 +++-
 .../featureflags/impl/ExecutionContextImpl.java    | 28 +++++++++++++++++-----
 .../sling/featureflags/impl/FeatureManager.java    | 23 ++++++++++--------
 .../apache/sling/featureflags/package-info.java    |  4 ++--
 5 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/apache/sling/featureflags/ExecutionContext.java b/src/main/java/org/apache/sling/featureflags/ExecutionContext.java
index 5eda911..4d64685 100644
--- a/src/main/java/org/apache/sling/featureflags/ExecutionContext.java
+++ b/src/main/java/org/apache/sling/featureflags/ExecutionContext.java
@@ -60,4 +60,11 @@ public interface ExecutionContext {
      * @return the resource resolver or {@code null}
      */
     ResourceResolver getResourceResolver();
+
+    /**
+     * Return the {@link Features} manager. This allows a feature to find out
+     * about other features.
+     * @since 1.1.0
+     */
+    Features getFeatures();
 }
diff --git a/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java b/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java
index 266069e..7280f64 100644
--- a/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java
+++ b/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java
@@ -34,7 +34,10 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 @Designate(ocd = ConfiguredFeature.Config.class, factory = true)
 @Component(service = Feature.class,
-           configurationPolicy = ConfigurationPolicy.REQUIRE)
+           configurationPolicy = ConfigurationPolicy.REQUIRE,
+           property = {
+                   Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
+           })
 public class ConfiguredFeature implements Feature {
 
     @ObjectClassDefinition(name = "Apache Sling Configured Feature",
diff --git a/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java b/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java
index 76d40c7..8a95302 100644
--- a/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java
+++ b/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java
@@ -23,9 +23,11 @@ import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.featureflags.ExecutionContext;
 import org.apache.sling.featureflags.Feature;
+import org.apache.sling.featureflags.Features;
 
 /**
  * Implementation of the provider context.
@@ -40,18 +42,25 @@ public class ExecutionContextImpl implements ExecutionContext {
 
     private final Map<String, Boolean> featureCache;
 
-    public ExecutionContextImpl(final HttpServletRequest request) {
+    private final Features features;
+
+    public ExecutionContextImpl(final Features features, final HttpServletRequest request) {
         ResourceResolver resourceResolver = null;
         if (request != null) {
-            Object resolverObject = request.getAttribute(REQUEST_ATTRIBUTE_RESOLVER);
-            if (resolverObject instanceof ResourceResolver) {
-                resourceResolver = (ResourceResolver) resolverObject;
+            if ( request instanceof SlingHttpServletRequest ) {
+                resourceResolver = ((SlingHttpServletRequest)request).getResourceResolver();
+            } else {
+                Object resolverObject = request.getAttribute(REQUEST_ATTRIBUTE_RESOLVER);
+                if (resolverObject instanceof ResourceResolver) {
+                    resourceResolver = (ResourceResolver) resolverObject;
+                }
             }
         }
 
         this.request = request;
         this.resourceResolver = resourceResolver;
         this.featureCache = new HashMap<String, Boolean>();
+        this.features = features;
     }
 
     @Override
@@ -64,11 +73,18 @@ public class ExecutionContextImpl implements ExecutionContext {
         return this.resourceResolver;
     }
 
-    boolean isEnabled(Feature feature) {
+    @Override
+    public Features getFeatures() {
+        return this.features;
+    }
+
+    boolean isEnabled(final Feature feature) {
         final String name = feature.getName();
         Boolean entry = this.featureCache.get(name);
         if (entry == null) {
-            entry = Boolean.valueOf(feature.isEnabled(this));
+            // put false in the cache to stop on circular calls
+            this.featureCache.put(name, Boolean.FALSE);
+            entry = feature.isEnabled(this);
             this.featureCache.put(name, entry);
         }
         return entry;
diff --git a/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java b/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
index c8fd473..17464fd 100644
--- a/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
+++ b/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
@@ -62,7 +62,8 @@ import org.slf4j.LoggerFactory;
                    "felix.webconsole.label=features",
                    "felix.webconsole.title=Features",
                    "felix.webconsole.category=Sling",
-                   Constants.SERVICE_RANKING + ":Integer=16384"
+                   Constants.SERVICE_RANKING + ":Integer=16384",
+                   Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
            })
 public class FeatureManager implements Features, Filter, Servlet {
 
@@ -90,7 +91,7 @@ public class FeatureManager implements Features, Filter, Servlet {
     }
 
     @Override
-    public boolean isEnabled(String featureName) {
+    public boolean isEnabled(final String featureName) {
         final Feature feature = this.getFeature(featureName);
         if (feature != null) {
             return getCurrentExecutionContext().isEnabled(feature);
@@ -101,15 +102,17 @@ public class FeatureManager implements Features, Filter, Servlet {
     //--- Filter
 
     @Override
-    public void init(FilterConfig filterConfig) {
-        // nothing todo do
+    public void init(final FilterConfig filterConfig) {
+        // nothing to do
     }
 
     @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
-            ServletException {
+    public void doFilter(final ServletRequest request,
+            final ServletResponse response,
+            final FilterChain chain)
+    throws IOException, ServletException {
+        this.pushContext((HttpServletRequest) request);
         try {
-            this.pushContext((HttpServletRequest) request);
             chain.doFilter(request, response);
         } finally {
             this.popContext();
@@ -125,7 +128,7 @@ public class FeatureManager implements Features, Filter, Servlet {
     //--- Servlet
 
     @Override
-    public void init(ServletConfig config) {
+    public void init(final ServletConfig config) {
         this.servletConfig = config;
     }
 
@@ -221,7 +224,7 @@ public class FeatureManager implements Features, Filter, Servlet {
     //--- Client Context management and access
 
     void pushContext(final HttpServletRequest request) {
-        this.perThreadClientContext.set(new ExecutionContextImpl(request));
+        this.perThreadClientContext.set(new ExecutionContextImpl(this, request));
     }
 
     void popContext() {
@@ -230,7 +233,7 @@ public class FeatureManager implements Features, Filter, Servlet {
 
     ExecutionContextImpl getCurrentExecutionContext() {
         ExecutionContextImpl ctx = this.perThreadClientContext.get();
-        return (ctx != null) ? ctx : new ExecutionContextImpl(null);
+        return (ctx != null) ? ctx : new ExecutionContextImpl(this, null);
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/featureflags/package-info.java b/src/main/java/org/apache/sling/featureflags/package-info.java
index ff01425..4df4dc6 100644
--- a/src/main/java/org/apache/sling/featureflags/package-info.java
+++ b/src/main/java/org/apache/sling/featureflags/package-info.java
@@ -60,8 +60,8 @@
  *  </tr>
  * </table>
  *
- * @version 1.0
+ * @version 1.1
  * @see <a href="http://sling.apache.org/documentation/the-sling-engine/featureflags.html">Feature Flags</a>
  */
-@org.osgi.annotation.versioning.Version("1.0.1")
+@org.osgi.annotation.versioning.Version("1.1.0")
 package org.apache.sling.featureflags;

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.