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/27 10:08:59 UTC
svn commit: r1561617 - in
/sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl:
CurrentClientContextFilter.java FeatureManager.java
Author: fmeschbe
Date: Mon Jan 27 09:08:58 2014
New Revision: 1561617
URL: http://svn.apache.org/r1561617
Log:
Fix ClientContext request filter registration:
- Allow stacking and replacement
- Global ClientContext on Http Service Filter level
- Sling ClientContext on Sling Filter level
Modified:
sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java
sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
Modified: sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java?rev=1561617&r1=1561616&r2=1561617&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java (original)
+++ sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java Mon Jan 27 09:08:58 2014
@@ -26,45 +26,38 @@ import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.featureflags.ClientContext;
/**
- * This general servlet filter sets the current client context to the
- * current request.
+ * This general servlet filter sets the current client context to the current
+ * request.
*/
-@Component
-@Service(value=Filter.class)
-@Property(name="pattern", value="/.*")
public class CurrentClientContextFilter implements Filter {
- @Reference
- private FeatureManager manager;
+ private final FeatureManager featureManager;
+
+ public CurrentClientContextFilter(final FeatureManager featureManager) {
+ this.featureManager = featureManager;
+ }
@Override
- public void doFilter(final ServletRequest req, final ServletResponse res,
- final FilterChain chain)
- throws IOException, ServletException {
- if ( req instanceof SlingHttpServletRequest ) {
- manager.setCurrentClientContext((SlingHttpServletRequest)req);
- }
+ public void init(final FilterConfig config) {
+ // nothing to do
+ }
+
+ @Override
+ public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain)
+ throws IOException, ServletException {
+
+ ClientContext current = this.featureManager.setCurrentClientContext(req);
try {
chain.doFilter(req, res);
} finally {
- manager.unsetCurrentClientContext();
+ this.featureManager.unsetCurrentClientContext(current);
}
}
@Override
- public void init(final FilterConfig config) throws ServletException {
- // nothing to do
- }
-
- @Override
public void destroy() {
// nothing to do
}
Modified: sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java?rev=1561617&r1=1561616&r2=1561617&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java (original)
+++ sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java Mon Jan 27 09:08:58 2014
@@ -27,7 +27,9 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import javax.servlet.Filter;
import javax.servlet.Servlet;
+import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.felix.scr.annotations.Activate;
@@ -71,6 +73,8 @@ public class FeatureManager {
private ServiceRegistration resourceDecorator;
private ServiceRegistration featureWebConsolePlugin;
+ private ServiceRegistration featureGlobalFilter;
+ private ServiceRegistration featureSlingFilter;
@SuppressWarnings("serial")
@Activate
@@ -86,6 +90,20 @@ public class FeatureManager {
put("felix.webconsole.category", "Sling");
}
});
+ this.featureGlobalFilter = bundleContext.registerService(Filter.class.getName(),
+ new CurrentClientContextFilter(this), new Hashtable<String, Object>() {
+ {
+ put("pattern", "/.*");
+ put("service.ranking", Integer.MAX_VALUE);
+ }
+ });
+ this.featureGlobalFilter = bundleContext.registerService(Filter.class.getName(),
+ new CurrentClientContextFilter(this), new Hashtable<String, Object>() {
+ {
+ put("sling.filter.scope", "REQUEST");
+ put("service.ranking", Integer.MAX_VALUE);
+ }
+ });
}
@Deactivate
@@ -95,6 +113,16 @@ public class FeatureManager {
this.featureWebConsolePlugin = null;
}
+ if (this.featureSlingFilter != null) {
+ this.featureSlingFilter.unregister();
+ this.featureSlingFilter = null;
+ }
+
+ if (this.featureGlobalFilter != null) {
+ this.featureGlobalFilter.unregister();
+ this.featureGlobalFilter = null;
+ }
+
if (this.featuresService != null) {
this.featuresService.unregister();
this.featuresService = null;
@@ -152,7 +180,7 @@ public class FeatureManager {
this.activeFeatures = activeMap;
}
- private final ThreadLocal<ClientContextImpl> perThreadClientContext = new ThreadLocal<ClientContextImpl>();
+ private final ThreadLocal<ClientContext> perThreadClientContext = new ThreadLocal<ClientContext>();
private final ClientContext defaultClientContext = new ClientContext() {
@@ -175,14 +203,22 @@ public class FeatureManager {
return result;
}
- public void setCurrentClientContext(final HttpServletRequest request) {
- final ExecutionContext providerContext = new ExecutionContextImpl(request);
- final ClientContextImpl ctx = this.createClientContext(providerContext);
- perThreadClientContext.set(ctx);
+ public ClientContext setCurrentClientContext(final ServletRequest request) {
+ final ClientContext current = perThreadClientContext.get();
+ if (request instanceof HttpServletRequest) {
+ final ExecutionContext providerContext = new ExecutionContextImpl((HttpServletRequest) request);
+ final ClientContextImpl ctx = this.createClientContext(providerContext);
+ perThreadClientContext.set(ctx);
+ }
+ return current;
}
- public void unsetCurrentClientContext() {
- perThreadClientContext.remove();
+ public void unsetCurrentClientContext(final ClientContext previous) {
+ if (previous != null) {
+ perThreadClientContext.set(previous);
+ } else {
+ perThreadClientContext.remove();
+ }
}
public ClientContext createClientContext(final ResourceResolver resolver) {
Re: svn commit: r1561617 - in /sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl:
CurrentClientContextFilter.java FeatureManager.java
Posted by Julian Sedding <js...@gmail.com>.
The FeatureManager assigns both Filter registrations to
"this.featureGlobalFilter". IIUC the second assignment should be to
"this.featureSlingFilter".
Regards
Julian
On Mon, Jan 27, 2014 at 10:08 AM, <fm...@apache.org> wrote:
> Author: fmeschbe
> Date: Mon Jan 27 09:08:58 2014
> New Revision: 1561617
>
> URL: http://svn.apache.org/r1561617
> Log:
> Fix ClientContext request filter registration:
>
> - Allow stacking and replacement
> - Global ClientContext on Http Service Filter level
> - Sling ClientContext on Sling Filter level
>
> Modified:
> sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java
> sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
>
> Modified: sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java
> URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java?rev=1561617&r1=1561616&r2=1561617&view=diff
> ==============================================================================
> --- sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java (original)
> +++ sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/CurrentClientContextFilter.java Mon Jan 27 09:08:58 2014
> @@ -26,45 +26,38 @@ import javax.servlet.FilterConfig;
> import javax.servlet.ServletException;
> import javax.servlet.ServletRequest;
> import javax.servlet.ServletResponse;
> -
> -import org.apache.felix.scr.annotations.Component;
> -import org.apache.felix.scr.annotations.Property;
> -import org.apache.felix.scr.annotations.Reference;
> -import org.apache.felix.scr.annotations.Service;
> -import org.apache.sling.api.SlingHttpServletRequest;
> +import org.apache.sling.featureflags.ClientContext;
>
> /**
> - * This general servlet filter sets the current client context to the
> - * current request.
> + * This general servlet filter sets the current client context to the current
> + * request.
> */
> -@Component
> -@Service(value=Filter.class)
> -@Property(name="pattern", value="/.*")
> public class CurrentClientContextFilter implements Filter {
>
> - @Reference
> - private FeatureManager manager;
> + private final FeatureManager featureManager;
> +
> + public CurrentClientContextFilter(final FeatureManager featureManager) {
> + this.featureManager = featureManager;
> + }
>
> @Override
> - public void doFilter(final ServletRequest req, final ServletResponse res,
> - final FilterChain chain)
> - throws IOException, ServletException {
> - if ( req instanceof SlingHttpServletRequest ) {
> - manager.setCurrentClientContext((SlingHttpServletRequest)req);
> - }
> + public void init(final FilterConfig config) {
> + // nothing to do
> + }
> +
> + @Override
> + public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain)
> + throws IOException, ServletException {
> +
> + ClientContext current = this.featureManager.setCurrentClientContext(req);
> try {
> chain.doFilter(req, res);
> } finally {
> - manager.unsetCurrentClientContext();
> + this.featureManager.unsetCurrentClientContext(current);
> }
> }
>
> @Override
> - public void init(final FilterConfig config) throws ServletException {
> - // nothing to do
> - }
> -
> - @Override
> public void destroy() {
> // nothing to do
> }
>
> Modified: sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java
> URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java?rev=1561617&r1=1561616&r2=1561617&view=diff
> ==============================================================================
> --- sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java (original)
> +++ sling/whiteboard/fmeschbe/featureflags/feature-flags/src/main/java/org/apache/sling/featureflags/impl/FeatureManager.java Mon Jan 27 09:08:58 2014
> @@ -27,7 +27,9 @@ import java.util.List;
> import java.util.Map;
> import java.util.TreeMap;
>
> +import javax.servlet.Filter;
> import javax.servlet.Servlet;
> +import javax.servlet.ServletRequest;
> import javax.servlet.http.HttpServletRequest;
>
> import org.apache.felix.scr.annotations.Activate;
> @@ -71,6 +73,8 @@ public class FeatureManager {
> private ServiceRegistration resourceDecorator;
>
> private ServiceRegistration featureWebConsolePlugin;
> + private ServiceRegistration featureGlobalFilter;
> + private ServiceRegistration featureSlingFilter;
>
> @SuppressWarnings("serial")
> @Activate
> @@ -86,6 +90,20 @@ public class FeatureManager {
> put("felix.webconsole.category", "Sling");
> }
> });
> + this.featureGlobalFilter = bundleContext.registerService(Filter.class.getName(),
> + new CurrentClientContextFilter(this), new Hashtable<String, Object>() {
> + {
> + put("pattern", "/.*");
> + put("service.ranking", Integer.MAX_VALUE);
> + }
> + });
> + this.featureGlobalFilter = bundleContext.registerService(Filter.class.getName(),
> + new CurrentClientContextFilter(this), new Hashtable<String, Object>() {
> + {
> + put("sling.filter.scope", "REQUEST");
> + put("service.ranking", Integer.MAX_VALUE);
> + }
> + });
> }
>
> @Deactivate
> @@ -95,6 +113,16 @@ public class FeatureManager {
> this.featureWebConsolePlugin = null;
> }
>
> + if (this.featureSlingFilter != null) {
> + this.featureSlingFilter.unregister();
> + this.featureSlingFilter = null;
> + }
> +
> + if (this.featureGlobalFilter != null) {
> + this.featureGlobalFilter.unregister();
> + this.featureGlobalFilter = null;
> + }
> +
> if (this.featuresService != null) {
> this.featuresService.unregister();
> this.featuresService = null;
> @@ -152,7 +180,7 @@ public class FeatureManager {
> this.activeFeatures = activeMap;
> }
>
> - private final ThreadLocal<ClientContextImpl> perThreadClientContext = new ThreadLocal<ClientContextImpl>();
> + private final ThreadLocal<ClientContext> perThreadClientContext = new ThreadLocal<ClientContext>();
>
> private final ClientContext defaultClientContext = new ClientContext() {
>
> @@ -175,14 +203,22 @@ public class FeatureManager {
> return result;
> }
>
> - public void setCurrentClientContext(final HttpServletRequest request) {
> - final ExecutionContext providerContext = new ExecutionContextImpl(request);
> - final ClientContextImpl ctx = this.createClientContext(providerContext);
> - perThreadClientContext.set(ctx);
> + public ClientContext setCurrentClientContext(final ServletRequest request) {
> + final ClientContext current = perThreadClientContext.get();
> + if (request instanceof HttpServletRequest) {
> + final ExecutionContext providerContext = new ExecutionContextImpl((HttpServletRequest) request);
> + final ClientContextImpl ctx = this.createClientContext(providerContext);
> + perThreadClientContext.set(ctx);
> + }
> + return current;
> }
>
> - public void unsetCurrentClientContext() {
> - perThreadClientContext.remove();
> + public void unsetCurrentClientContext(final ClientContext previous) {
> + if (previous != null) {
> + perThreadClientContext.set(previous);
> + } else {
> + perThreadClientContext.remove();
> + }
> }
>
> public ClientContext createClientContext(final ResourceResolver resolver) {
>
>