diff options
author | jonmv <venstad@gmail.com> | 2024-06-24 18:17:54 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2024-06-27 13:08:18 +0200 |
commit | 52e376bb4f201fa42d8c3e1bcdc78cace46a9004 (patch) | |
tree | 834116a890b9cdffa41f9abcecc63bdc55aa8038 | |
parent | 198193651d7e529445c14b330d66b8bccec0351e (diff) |
Propagate wrapped dependencies
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java | 7 | ||||
-rw-r--r-- | container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java | 79 |
2 files changed, 86 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java index 10f8400fa37..80693d2ef72 100644 --- a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java +++ b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java @@ -7,6 +7,7 @@ import com.yahoo.component.ComponentSpecification; import com.yahoo.component.chain.Chain; import com.yahoo.component.chain.ChainedComponent; import com.yahoo.component.chain.ChainsConfigurer; +import com.yahoo.component.chain.dependencies.Dependencies; import com.yahoo.component.chain.model.ChainsModel; import com.yahoo.component.chain.model.ChainsModelBuilder; import com.yahoo.component.provider.ComponentRegistry; @@ -185,6 +186,12 @@ public class FilterChainRepository extends AbstractComponent { this.filterType = getFilterType(filter); } + @Override + protected Dependencies getDefaultAnnotatedDependencies() { + return filter instanceof ChainedComponent chainedComponent ? chainedComponent.getDependencies() + : super.getDefaultAnnotatedDependencies(); + } + private static Class<?> getFilterType(Object filter) { if (filter instanceof RequestFilter) return RequestFilter.class; diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java index 7acbaa73fe4..44a7578fd9f 100644 --- a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java @@ -2,15 +2,29 @@ package com.yahoo.container.jdisc; import com.yahoo.component.ComponentId; +import com.yahoo.component.ComponentSpecification; +import com.yahoo.component.chain.ChainedComponent; +import com.yahoo.component.chain.dependencies.After; +import com.yahoo.component.chain.dependencies.Before; +import com.yahoo.component.chain.dependencies.Provides; import com.yahoo.component.provider.ComponentRegistry; import com.yahoo.container.core.ChainsConfig; +import com.yahoo.container.core.ChainsConfig.Chains; +import com.yahoo.container.core.ChainsConfig.Components; +import com.yahoo.container.core.ChainsConfig.Components.Builder; import com.yahoo.container.http.filter.FilterChainRepository; +import com.yahoo.jdisc.handler.ResponseHandler; import com.yahoo.jdisc.http.ServerConfig; +import com.yahoo.jdisc.http.filter.DiscFilterRequest; import com.yahoo.jdisc.http.filter.RequestFilter; import com.yahoo.jdisc.http.filter.ResponseFilter; +import com.yahoo.jdisc.http.filter.SecurityRequestFilter; +import com.yahoo.jdisc.http.filter.SecurityRequestFilterChain; import com.yahoo.jdisc.http.server.jetty.FilterBindings; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -50,6 +64,71 @@ public class FilterBindingsProviderTest { } @Test + void requireThatChainOrderIsCorrect() { + + List<ChainedComponent> filteredBy = new ArrayList<>(); + + class DummyFilter extends ChainedComponent implements SecurityRequestFilter { + @Override public void filter(DiscFilterRequest request, ResponseHandler handler) { filteredBy.add(this); } + @Override public String toString() { return getClass().getAnnotation(Provides.class).value()[0]; } + } + + @Provides("foo") class Filter1 extends DummyFilter { } + @Provides("bar") @After("foo") class Filter2 extends DummyFilter { } + @Provides("baz") @Before("foo") class Filter3 extends DummyFilter { } + + ComponentRegistry<SecurityRequestFilter> filters = new ComponentRegistry<>(); + + SecurityRequestFilter foo = new Filter1(); + SecurityRequestFilter bar = new Filter2(); + SecurityRequestFilter baz = new Filter3(); + + filters.register(ComponentId.fromString("foo"), foo); + filters.register(ComponentId.fromString("bar"), bar); + filters.register(ComponentId.fromString("baz"), baz); + + ChainsConfig.Builder oneChain = new ChainsConfig.Builder(); + oneChain.components(new Components.Builder().id("foo")) + .components(new Components.Builder().id("bar")) + .components(new Components.Builder().id("baz")) + .chains(new Chains.Builder().id("chain") + .components("bar") + .components("foo") + .components("baz")); + + ((SecurityRequestFilterChain) new FilterChainRepository(oneChain.build(), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + filters, + new ComponentRegistry<>()) + .getFilter(ComponentSpecification.fromString("chain"))).filter((DiscFilterRequest) null, null); + + assertEquals(List.of(baz, foo, bar), filteredBy); + + filteredBy.clear(); + ChainsConfig.Builder childChain = new ChainsConfig.Builder(); + childChain.components(new Builder().id("foo")) + .components(new Builder().id("bar")) + .components(new Builder().id("baz")) + .chains(new Chains.Builder().id("parent") + .components("bar") + .components("baz")) + .chains(new Chains.Builder().id("child") + .components("foo") + .inherits("parent")); + + ((SecurityRequestFilterChain) new FilterChainRepository(childChain.build(), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + filters, + new ComponentRegistry<>()) + .getFilter(ComponentSpecification.fromString("child"))).filter((DiscFilterRequest) null, null); + + assertEquals(List.of(baz, foo, bar), filteredBy); + + } + + @Test void requireThatCorrectlyConfiguredFiltersAreIncluded() { final String requestFilter1Id = "requestFilter1"; final String requestFilter2Id = "requestFilter2"; |