This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-featureflags.git
commit 1686a4eb843edccbdf439fcb3d6514c7d53d5bea Author: Carsten Ziegeler <[email protected]> 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@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> */ [email protected]("1.0.1") [email protected]("1.1.0") package org.apache.sling.featureflags; -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
