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>.