This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch feature/expose-wrapped-filter-in-webconsole in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-engine.git
commit fd6663977930df3c5345b23549a8d0bd26b09f55 Author: Konrad Windszus <[email protected]> AuthorDate: Tue Feb 3 12:47:44 2026 +0100 SLING-13090 Expose information about wrapped filter in web console --- pom.xml | 6 ++++ .../impl/console/WebConsoleConfigPrinter.java | 4 ++- .../sling/engine/impl/filter/FilterHandle.java | 9 ++++++ .../engine/impl/filter/ServletFilterManager.java | 33 +++++++++++++--------- .../engine/impl/filter/SlingFilterChainHelper.java | 6 ++-- .../impl/filter/AbstractSlingFilterChainTest.java | 2 +- .../sling/engine/impl/filter/FilterHandleTest.java | 6 ++-- .../impl/filter/SlingFilterChainHelperTest.java | 10 +++---- 8 files changed, 51 insertions(+), 25 deletions(-) diff --git a/pom.xml b/pom.xml index 6e42c31..3c74a93 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,12 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>2.0.17</version> + <scope>test</scope> + </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> diff --git a/src/main/java/org/apache/sling/engine/impl/console/WebConsoleConfigPrinter.java b/src/main/java/org/apache/sling/engine/impl/console/WebConsoleConfigPrinter.java index 930e203..c2f5a61 100644 --- a/src/main/java/org/apache/sling/engine/impl/console/WebConsoleConfigPrinter.java +++ b/src/main/java/org/apache/sling/engine/impl/console/WebConsoleConfigPrinter.java @@ -56,7 +56,9 @@ public class WebConsoleConfigPrinter { pw.printf( "%d : %s (id: %d, property: %s); called: %d; time: %dms; time/call: %dµs%n", entry.getOrder(), - entry.getFilter().getClass(), + entry.getWrappedJavaxFilter() + .map(f -> "Wrapped " + f.getClass()) + .orElse(entry.getFilter().getClass().toString()), entry.getFilterId(), entry.getOrderSource(), entry.getCalls(), diff --git a/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java b/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java index 3df0f0e..0c8ea25 100644 --- a/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java +++ b/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java @@ -18,6 +18,7 @@ */ package org.apache.sling.engine.impl.filter; +import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import jakarta.servlet.Filter; @@ -27,6 +28,8 @@ public class FilterHandle implements Comparable<FilterHandle> { private final Filter filter; + private javax.servlet.Filter wrappedJavaxFilter; + private final long filterId; private final int order; @@ -43,12 +46,14 @@ public class FilterHandle implements Comparable<FilterHandle> { FilterHandle( Filter filter, + javax.servlet.Filter wrappedJavaxFilter, FilterPredicate predicate, long filterId, int order, final String orderSource, FilterProcessorMBeanImpl mbean) { this.filter = filter; + this.wrappedJavaxFilter = wrappedJavaxFilter; this.predicate = predicate; this.filterId = filterId; this.order = order; @@ -62,6 +67,10 @@ public class FilterHandle implements Comparable<FilterHandle> { return filter; } + public Optional<javax.servlet.Filter> getWrappedJavaxFilter() { + return Optional.ofNullable(wrappedJavaxFilter); + } + public long getFilterId() { return filterId; } diff --git a/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java b/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java index 22e59f0..d3c97be 100644 --- a/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java +++ b/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java @@ -132,7 +132,7 @@ public class ServletFilterManager { cardinality = ReferenceCardinality.MULTIPLE, target = "(" + EngineConstants.SLING_FILTER_SCOPE + "=*)") public void bindFilter(final ServiceReference<Filter> reference, final Filter filter) { - initFilter(reference, filter); + initFilter(reference, filter, null); } public void updatedFilter(final ServiceReference<Filter> reference, final Filter service) { @@ -140,10 +140,10 @@ public class ServletFilterManager { final String newFilterName = SlingFilterConfig.getName(reference); if (newFilterName.equals(getUsedFilterName(reference))) { removeFilterFromChains((Long) reference.getProperty(Constants.SERVICE_ID)); - addFilterToChains(service, reference); + addFilterToChains(service, null, reference); } else { destroyFilter(reference, service); - initFilter(reference, service); + initFilter(reference, service, null); } } @@ -163,7 +163,7 @@ public class ServletFilterManager { @SuppressWarnings({"rawtypes", "unchecked"}) final ServiceReference<Filter> ref = (ServiceReference<Filter>) (ServiceReference) reference; final Filter s = JavaxToJakartaFilterWrapper.toJakartaFilter(filter); - initFilter(ref, s); + initFilter(ref, s, filter); } public void updatedJavaxFilter( @@ -175,10 +175,10 @@ public class ServletFilterManager { final String newFilterName = SlingFilterConfig.getName(ref); if (newFilterName.equals(getUsedFilterName(ref))) { removeFilterFromChains((Long) reference.getProperty(Constants.SERVICE_ID)); - addFilterToChains(s, ref); + addFilterToChains(s, service, ref); } else { destroyFilter(ref, s); - initFilter(ref, s); + initFilter(ref, s, service); } } @@ -190,7 +190,10 @@ public class ServletFilterManager { destroyFilter(ref, s); } - private void initFilter(final ServiceReference<Filter> reference, final Filter filter) { + private void initFilter( + final ServiceReference<Filter> reference, + final Filter filter, + final javax.servlet.Filter wrappedJavaxFilter) { final String filterName = SlingFilterConfig.getName(reference); final Long serviceId = (Long) reference.getProperty(Constants.SERVICE_ID); @@ -198,7 +201,7 @@ public class ServletFilterManager { MBeanReg reg; try { - final Dictionary<String, String> mbeanProps = new Hashtable<String, String>(); + final Dictionary<String, String> mbeanProps = new Hashtable<>(); mbeanProps.put(JMX_OBJECTNAME, "org.apache.sling:type=engine-filter,service=" + filterName); reg = new MBeanReg(); reg.mbean = new FilterProcessorMBeanImpl(); @@ -219,7 +222,7 @@ public class ServletFilterManager { filter.init(config); // add to chains - addFilterToChains(filter, reference); + addFilterToChains(filter, wrappedJavaxFilter, reference); } catch (ServletException ce) { log.error("Filter " + filterName + " failed to initialize", ce); } catch (Throwable t) { @@ -261,7 +264,10 @@ public class ServletFilterManager { } @SuppressWarnings("deprecation") - private void addFilterToChains(final Filter filter, final ServiceReference<Filter> reference) { + private void addFilterToChains( + final Filter filter, + final javax.servlet.Filter wrappedJavaxFilter, + final ServiceReference<Filter> reference) { final Long serviceId = (Long) reference.getProperty(Constants.SERVICE_ID); final MBeanReg mbeanReg = mbeanMap.get(serviceId); final FilterProcessorMBeanImpl mbean = mbeanReg == null ? null : mbeanReg.mbean; @@ -316,13 +322,14 @@ public class ServletFilterManager { scope = scope.toUpperCase(); try { FilterChainType type = FilterChainType.valueOf(scope.toString()); - getFilterChain(type).addFilter(filter, predicate, serviceId, order, orderSource, mbean); + getFilterChain(type) + .addFilter(filter, wrappedJavaxFilter, predicate, serviceId, order, orderSource, mbean); if (type == FilterChainType.COMPONENT) { getFilterChain(FilterChainType.INCLUDE) - .addFilter(filter, predicate, serviceId, order, orderSource, mbean); + .addFilter(filter, wrappedJavaxFilter, predicate, serviceId, order, orderSource, mbean); getFilterChain(FilterChainType.FORWARD) - .addFilter(filter, predicate, serviceId, order, orderSource, mbean); + .addFilter(filter, wrappedJavaxFilter, predicate, serviceId, order, orderSource, mbean); } used = true; } catch (final IllegalArgumentException iae) { diff --git a/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java b/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java index 33c74ba..ce2e045 100644 --- a/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java +++ b/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java @@ -35,13 +35,14 @@ public class SlingFilterChainHelper { private static final FilterHandle[] EMPTY_FILTER_ARRAY = new FilterHandle[0]; - private final SortedSet<FilterHandle> filterList = new TreeSet<FilterHandle>(); + private final SortedSet<FilterHandle> filterList = new TreeSet<>(); private volatile FilterHandle[] filters = EMPTY_FILTER_ARRAY; /** * Add a filter * @param filter The filter + * @param wrappedJavaxFilter The wrapped javax.servlet.Filter (may be null) * @param pattern Optional pattern * @param filterId Id of the filter * @param order The order index @@ -50,12 +51,13 @@ public class SlingFilterChainHelper { */ public synchronized void addFilter( final Filter filter, + javax.servlet.Filter wrappedJavaxFilter, FilterPredicate pattern, final long filterId, final int order, final String orderSource, FilterProcessorMBeanImpl mbean) { - this.filterList.add(new FilterHandle(filter, pattern, filterId, order, orderSource, mbean)); + this.filterList.add(new FilterHandle(filter, wrappedJavaxFilter, pattern, filterId, order, orderSource, mbean)); this.filters = getFiltersInternal(); } diff --git a/src/test/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChainTest.java b/src/test/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChainTest.java index fe64096..7c39565 100644 --- a/src/test/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChainTest.java +++ b/src/test/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChainTest.java @@ -56,7 +56,7 @@ public class AbstractSlingFilterChainTest extends AbstractFilterTest { public void destroy() {} }; - FilterHandle handle = new FilterHandle(badFilter, null, 1, 1, null, null); + FilterHandle handle = new FilterHandle(badFilter, null, null, 1, 1, null, null); AbstractSlingFilterChain chain = new AbstractSlingFilterChain(new FilterHandle[] {handle}) { @Override diff --git a/src/test/java/org/apache/sling/engine/impl/filter/FilterHandleTest.java b/src/test/java/org/apache/sling/engine/impl/filter/FilterHandleTest.java index 94818f2..e9f3fca 100644 --- a/src/test/java/org/apache/sling/engine/impl/filter/FilterHandleTest.java +++ b/src/test/java/org/apache/sling/engine/impl/filter/FilterHandleTest.java @@ -31,15 +31,15 @@ public class FilterHandleTest extends AbstractFilterTest { */ @Test public void testSelect() { - FilterHandle handle = new FilterHandle(null, predicate(), 0L, 0, "", null); + FilterHandle handle = new FilterHandle(null, null, predicate(), 0L, 0, "", null); assertTrue( "filter should be selected when no predicate", handle.select(mockRequest("/content/test/no/predicate", null, null, null, null))); - handle = new FilterHandle(null, predicate(SLING_FILTER_PATTERN, "/content/test/.*"), 0L, 0, "", null); + handle = new FilterHandle(null, null, predicate(SLING_FILTER_PATTERN, "/content/test/.*"), 0L, 0, "", null); assertTrue( "filter should be selected when matching predicate", handle.select(mockRequest("/content/test/matching/predicate", null, null, null, null))); - handle = new FilterHandle(null, predicate(SLING_FILTER_PATTERN, "/content/foo/.*"), 0L, 0, "", null); + handle = new FilterHandle(null, null, predicate(SLING_FILTER_PATTERN, "/content/foo/.*"), 0L, 0, "", null); assertFalse( "filter should not be selected when no matching predicate", handle.select(mockRequest("/content/test/no/matching/predicate", null, null, null, null))); diff --git a/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java b/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java index aca3e08..738e6cb 100644 --- a/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java +++ b/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java @@ -36,11 +36,11 @@ public class SlingFilterChainHelperTest { public void testOrdering() { final SlingFilterChainHelper chain = new SlingFilterChainHelper(); - chain.addFilter(context.mock(Filter.class, "A"), null, 1L, 100, "1:100", null); - chain.addFilter(context.mock(Filter.class, "B"), null, 2L, 100, "2:100", null); - chain.addFilter(context.mock(Filter.class, "C"), null, 3L, -100, "3:-100", null); - chain.addFilter(context.mock(Filter.class, "D"), null, 4L, -1000, "4:-1000", null); - chain.addFilter(context.mock(Filter.class, "E"), null, 5L, 1000, "5:1000", null); + chain.addFilter(context.mock(Filter.class, "A"), null, null, 1L, 100, "1:100", null); + chain.addFilter(context.mock(Filter.class, "B"), null, null, 2L, 100, "2:100", null); + chain.addFilter(context.mock(Filter.class, "C"), null, null, 3L, -100, "3:-100", null); + chain.addFilter(context.mock(Filter.class, "D"), null, null, 4L, -1000, "4:-1000", null); + chain.addFilter(context.mock(Filter.class, "E"), null, null, 5L, 1000, "5:1000", null); final FilterHandle[] entries = chain.getFilters(); assertEquals(5, entries.length);
