Repository: cxf Updated Branches: refs/heads/3.0.x-fixes d35b2a596 -> a7c8edeaa
[CXF-6851] Support for registering JAX-RS Feature on the server Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/a7c8edea Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/a7c8edea Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/a7c8edea Branch: refs/heads/3.0.x-fixes Commit: a7c8edeaa3b36ea2b82daad1cfbd67eda403d5e7 Parents: d35b2a5 Author: Sergey Beryozkin <[email protected]> Authored: Thu May 5 22:57:51 2016 +0100 Committer: Sergey Beryozkin <[email protected]> Committed: Thu May 5 23:00:20 2016 +0100 ---------------------------------------------------------------------- .../jaxrs/provider/ServerProviderFactory.java | 44 +++++++++++++++----- .../apache/cxf/systest/jaxrs/BookServer20.java | 12 +++++- 2 files changed, 44 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/a7c8edea/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java index 41e784b..c842017 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java @@ -39,7 +39,6 @@ import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.DynamicFeature; import javax.ws.rs.container.PreMatching; -import javax.ws.rs.core.Configurable; import javax.ws.rs.core.Configuration; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; @@ -206,13 +205,36 @@ public final class ServerProviderFactory extends ProviderFactory { @SuppressWarnings("unchecked") @Override protected void setProviders(boolean custom, boolean busGlobal, Object... providers) { + List<Object> allProviders = new LinkedList<Object>(); + for (Object p : providers) { + if (p instanceof Feature) { + FeatureContext featureContext = createServerFeatureContext(); + ((Feature)p).configure(featureContext); + Configuration cfg = featureContext.getConfiguration(); + + for (Object featureProvider : cfg.getInstances()) { + Map<Class<?>, Integer> contracts = cfg.getContracts(featureProvider.getClass()); + if (contracts != null && !contracts.isEmpty()) { + allProviders.add(new FilterProviderInfo<Object>(featureProvider, + getBus(), + contracts)); + } else { + allProviders.add(featureProvider); + } + } + } else { + allProviders.add(p); + } + } + + List<ProviderInfo<ContainerRequestFilter>> postMatchRequestFilters = new LinkedList<ProviderInfo<ContainerRequestFilter>>(); List<ProviderInfo<ContainerResponseFilter>> postMatchResponseFilters = new LinkedList<ProviderInfo<ContainerResponseFilter>>(); List<ProviderInfo<? extends Object>> theProviders = - prepareProviders(custom, busGlobal, (Object[])providers, application); + prepareProviders(custom, busGlobal, allProviders.toArray(), application); super.setCommonProviders(theProviders); for (ProviderInfo<? extends Object> provider : theProviders) { Class<?> providerCls = ClassHelper.getRealClass(getBus(), provider.getProvider()); @@ -350,11 +372,7 @@ public final class ServerProviderFactory extends ProviderFactory { + "." + ori.getMethodToInvoke().toString(); for (DynamicFeature feature : dynamicFeatures) { - FeatureContextImpl featureContext = new FeatureContextImpl(); - MethodFeatureContextConfigurable configImpl = new MethodFeatureContextConfigurable(featureContext); - setApplicationProperties(configImpl); - featureContext.setConfigurable(configImpl); - + FeatureContext featureContext = createServerFeatureContext(); feature.configure(new ResourceInfoImpl(ori), featureContext); Configuration cfg = featureContext.getConfiguration(); for (Object provider : cfg.getInstances()) { @@ -378,14 +396,18 @@ public final class ServerProviderFactory extends ProviderFactory { } } - private void setApplicationProperties(Configurable<?> configImpl) { + private FeatureContext createServerFeatureContext() { + FeatureContextImpl featureContext = new FeatureContextImpl(); + ServerFeatureContextConfigurable configImpl = new ServerFeatureContextConfigurable(featureContext); + featureContext.setConfigurable(configImpl); + if (application != null) { Map<String, Object> appProps = application.getProvider().getProperties(); for (Map.Entry<String, Object> entry : appProps.entrySet()) { configImpl.property(entry.getKey(), entry.getValue()); } } - + return featureContext; } protected static boolean isPrematching(Class<?> filterCls) { @@ -393,8 +415,8 @@ public final class ServerProviderFactory extends ProviderFactory { } - private static class MethodFeatureContextConfigurable extends ConfigurableImpl<FeatureContext> { - protected MethodFeatureContextConfigurable(FeatureContext mc) { + private static class ServerFeatureContextConfigurable extends ConfigurableImpl<FeatureContext> { + protected ServerFeatureContextConfigurable(FeatureContext mc) { super(mc, RuntimeType.SERVER, SERVER_FILTER_INTERCEPTOR_CLASSES.toArray(new Class<?>[]{})); } } http://git-wip-us.apache.org/repos/asf/cxf/blob/a7c8edea/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java ---------------------------------------------------------------------- diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java index 17e8f60..be58f50 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java @@ -49,6 +49,7 @@ import javax.ws.rs.container.DynamicFeature; import javax.ws.rs.container.PreMatching; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Context; +import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -96,7 +97,7 @@ public class BookServer20 extends AbstractBusTestServerBase { providers.add(new PostMatchContainerRequestFilter()); providers.add(new FaultyContainerRequestFilter()); providers.add(new PreMatchReplaceStreamOrAddress()); - providers.add(new GenericHandlerWriter()); + providers.add(new ServerTestFeature()); providers.add(new JacksonJaxbJsonProvider()); sf.setProviders(providers); sf.setResourceProvider(BookStore.class, @@ -508,4 +509,13 @@ public class BookServer20 extends AbstractBusTestServerBase { } } + private static class ServerTestFeature implements Feature { + + @Override + public boolean configure(FeatureContext context) { + context.register(new GenericHandlerWriter()); + return true; + } + + } }
