You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2016/08/19 16:26:25 UTC

svn commit: r1756930 - in /sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags: ExecutionContext.java impl/ConfiguredFeature.java impl/ExecutionContextImpl.java impl/FeatureManager.java package-info.java

Author: cziegeler
Date: Fri Aug 19 16:26:24 2016
New Revision: 1756930

URL: http://svn.apache.org/viewvc?rev=1756930&view=rev
Log:
SLING-5981 : Provide access to Features service in execution context

Modified:
    sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/ExecutionContext.java
    sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java
    sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java
    sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
    sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/package-info.java

Modified: sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/ExecutionContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/ExecutionContext.java?rev=1756930&r1=1756929&r2=1756930&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/ExecutionContext.java (original)
+++ sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/ExecutionContext.java Fri Aug 19 16:26:24 2016
@@ -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();
 }

Modified: sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java?rev=1756930&r1=1756929&r2=1756930&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java (original)
+++ sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ConfiguredFeature.java Fri Aug 19 16:26:24 2016
@@ -34,7 +34,10 @@ import org.osgi.service.metatype.annotat
 
 @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",

Modified: sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java?rev=1756930&r1=1756929&r2=1756930&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java (original)
+++ sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/ExecutionContextImpl.java Fri Aug 19 16:26:24 2016
@@ -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 implem
 
     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 implem
         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;

Modified: sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java?rev=1756930&r1=1756929&r2=1756930&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java (original)
+++ sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java Fri Aug 19 16:26:24 2016
@@ -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 F
     }
 
     @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 F
     //--- 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 F
     //--- Servlet
 
     @Override
-    public void init(ServletConfig config) {
+    public void init(final ServletConfig config) {
         this.servletConfig = config;
     }
 
@@ -221,7 +224,7 @@ public class FeatureManager implements F
     //--- 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 F
 
     ExecutionContextImpl getCurrentExecutionContext() {
         ExecutionContextImpl ctx = this.perThreadClientContext.get();
-        return (ctx != null) ? ctx : new ExecutionContextImpl(null);
+        return (ctx != null) ? ctx : new ExecutionContextImpl(this, null);
     }
 
     /**

Modified: sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/package-info.java?rev=1756930&r1=1756929&r2=1756930&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/package-info.java (original)
+++ sling/trunk/bundles/extensions/feature-flags/src/main/java/org/apache/sling/featureflags/package-info.java Fri Aug 19 16:26:24 2016
@@ -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;