Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 3A4372009F2 for ; Thu, 5 May 2016 23:58:14 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 392A8160A06; Thu, 5 May 2016 21:58:14 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 60E9D1609F9 for ; Thu, 5 May 2016 23:58:13 +0200 (CEST) Received: (qmail 72370 invoked by uid 500); 5 May 2016 21:58:12 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 72361 invoked by uid 99); 5 May 2016 21:58:12 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 05 May 2016 21:58:12 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 47C90DFC77; Thu, 5 May 2016 21:58:12 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sergeyb@apache.org To: commits@cxf.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: cxf git commit: [CXF-6851] Support for registering JAX-RS Feature on the server Date: Thu, 5 May 2016 21:58:12 +0000 (UTC) archived-at: Thu, 05 May 2016 21:58:14 -0000 Repository: cxf Updated Branches: refs/heads/master 5e193bf8a -> b97598447 [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/b9759844 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/b9759844 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/b9759844 Branch: refs/heads/master Commit: b97598447f52f1ae627ae2b06c98d2dd99abf539 Parents: 5e193bf Author: Sergey Beryozkin Authored: Thu May 5 22:57:51 2016 +0100 Committer: Sergey Beryozkin Committed: Thu May 5 22:57:51 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/b9759844/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 cdcd531..3d7d966 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 allProviders = new LinkedList(); + 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, Integer> contracts = cfg.getContracts(featureProvider.getClass()); + if (contracts != null && !contracts.isEmpty()) { + allProviders.add(new FilterProviderInfo(featureProvider, + getBus(), + contracts)); + } else { + allProviders.add(featureProvider); + } + } + } else { + allProviders.add(p); + } + } + + List> postMatchRequestFilters = new LinkedList>(); List> postMatchResponseFilters = new LinkedList>(); List> theProviders = - prepareProviders(custom, busGlobal, (Object[])providers, application); + prepareProviders(custom, busGlobal, allProviders.toArray(), application); super.setCommonProviders(theProviders); for (ProviderInfo 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,22 +396,26 @@ 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 appProps = application.getProvider().getProperties(); for (Map.Entry entry : appProps.entrySet()) { configImpl.property(entry.getKey(), entry.getValue()); } } - + return featureContext; } protected static boolean isPrematching(Class filterCls) { return AnnotationUtils.getClassAnnotation(filterCls, PreMatching.class) != null; } - private static class MethodFeatureContextConfigurable extends ConfigurableImpl { - protected MethodFeatureContextConfigurable(FeatureContext mc) { + private static class ServerFeatureContextConfigurable extends ConfigurableImpl { + 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/b9759844/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; + } + + } }