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, <[email protected]> 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) { > >
