You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/02/06 13:35:22 UTC
svn commit: r1442931 [1/2] - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/
rt/frontend/jaxrs/src/main/...
Author: sergeyb
Date: Wed Feb 6 12:35:21 2013
New Revision: 1442931
URL: http://svn.apache.org/viewvc?rev=1442931&view=rev
Log:
[CXF-4696] Split ProviderFactory before starting the client runtime move
Added:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java (with props)
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestFilterInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientResponseFilterInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ProvidersImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBeanTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/MessageContextImplTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java
cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/JAXRSSpringSecurityClassTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java Wed Feb 6 12:35:21 2013
@@ -26,7 +26,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
-import java.util.Set;
import java.util.logging.Logger;
import javax.ws.rs.NotFoundException;
@@ -46,11 +45,7 @@ import org.apache.cxf.endpoint.AbstractE
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.EndpointException;
import org.apache.cxf.endpoint.EndpointImpl;
-import org.apache.cxf.jaxrs.model.BeanParamInfo;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
-import org.apache.cxf.jaxrs.model.OperationResourceInfo;
-import org.apache.cxf.jaxrs.model.Parameter;
-import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.UserResource;
import org.apache.cxf.jaxrs.provider.DataBindingProvider;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
@@ -320,8 +315,7 @@ public class AbstractJAXRSFactoryBean ex
}
}
- protected ProviderFactory setupFactory(Endpoint ep) {
- ProviderFactory factory = ProviderFactory.createInstance(getBus());
+ protected void setupFactory(ProviderFactory factory, Endpoint ep) {
if (entityProviders != null) {
factory.setUserProviders(entityProviders);
}
@@ -333,29 +327,7 @@ public class AbstractJAXRSFactoryBean ex
factory.setSchemaLocations(schemaLocations);
}
- setBeanInfo(factory);
-
- ep.put(ProviderFactory.class.getName(), factory);
- getBus().setProperty(ProviderFactory.class.getName(), factory);
- return factory;
- }
-
- protected void setBeanInfo(ProviderFactory factory) {
- List<ClassResourceInfo> cris = serviceFactory.getClassResourceInfo();
- for (ClassResourceInfo cri : cris) {
- Set<OperationResourceInfo> oris = cri.getMethodDispatcher().getOperationResourceInfos();
- for (OperationResourceInfo ori : oris) {
- List<Parameter> params = ori.getParameters();
- for (Parameter param : params) {
- if (param.getType() == ParameterType.BEAN) {
- Class<?> cls = ori.getMethodToInvoke().getParameterTypes()[param.getIndex()];
- BeanParamInfo bpi = new BeanParamInfo(cls, getBus());
- factory.addBeanParamInfo(bpi);
- }
- }
- }
- }
-
+ ep.put(factory.getClass().getName(), factory);
}
protected void setDataBindingProvider(ProviderFactory factory, Service s) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Wed Feb 6 12:35:21 2013
@@ -55,7 +55,7 @@ import org.apache.cxf.jaxrs.model.Parame
import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.model.URITemplate;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Exchange;
@@ -104,7 +104,7 @@ public class JAXRSInvoker extends Abstra
boolean suspended = exchange.getInMessage().getInterceptorChain().getState() == State.SUSPENDED;
if (!suspended) {
if (exchange.isOneWay()) {
- ProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
+ ServerProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
}
if (!isServiceObjectRequestScope(exchange.getInMessage())) {
provider.releaseInstance(exchange.getInMessage(), rootInstance);
@@ -138,7 +138,7 @@ public class JAXRSInvoker extends Abstra
final OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
final ClassResourceInfo cri = ori.getClassResourceInfo();
final Message inMessage = exchange.getInMessage();
- final ProviderFactory providerFactory = ProviderFactory.getInstance(inMessage);
+ final ServerProviderFactory providerFactory = ServerProviderFactory.getInstance(inMessage);
boolean wasSuspended = exchange.remove(REQUEST_WAS_SUSPENDED) != null;
@@ -285,7 +285,7 @@ public class JAXRSInvoker extends Abstra
}
Response excResponse = JAXRSUtils.convertFaultToResponse(ex.getCause(), inMessage);
if (excResponse == null) {
- ProviderFactory.getInstance(inMessage).clearThreadLocalProxies();
+ ServerProviderFactory.getInstance(inMessage).clearThreadLocalProxies();
ClassResourceInfo criRoot =
(ClassResourceInfo)inMessage.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
if (criRoot != null) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java Wed Feb 6 12:35:21 2013
@@ -24,6 +24,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.ws.rs.core.Application;
@@ -41,9 +42,13 @@ import org.apache.cxf.jaxrs.ext.Resource
import org.apache.cxf.jaxrs.impl.RequestPreprocessor;
import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.model.BeanParamInfo;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.Parameter;
+import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.ProviderInfo;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.utils.AnnotationUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
@@ -164,7 +169,7 @@ public class JAXRSServerFactoryBean exte
ep.getService().setInvoker(invoker);
}
- ProviderFactory factory = setupFactory(ep);
+ ServerProviderFactory factory = setupFactory(ep);
ep.put(Application.class.getName(), appProvider);
factory.setApplicationProvider(appProvider);
factory.setRequestPreprocessor(
@@ -208,6 +213,31 @@ public class JAXRSServerFactoryBean exte
return server;
}
+ protected ServerProviderFactory setupFactory(Endpoint ep) {
+ ServerProviderFactory factory = ServerProviderFactory.createInstance(getBus());
+ setBeanInfo(factory);
+ super.setupFactory(factory, ep);
+ return factory;
+ }
+
+ protected void setBeanInfo(ServerProviderFactory factory) {
+ List<ClassResourceInfo> cris = serviceFactory.getClassResourceInfo();
+ for (ClassResourceInfo cri : cris) {
+ Set<OperationResourceInfo> oris = cri.getMethodDispatcher().getOperationResourceInfos();
+ for (OperationResourceInfo ori : oris) {
+ List<Parameter> params = ori.getParameters();
+ for (Parameter param : params) {
+ if (param.getType() == ParameterType.BEAN) {
+ Class<?> cls = ori.getMethodToInvoke().getParameterTypes()[param.getIndex()];
+ BeanParamInfo bpi = new BeanParamInfo(cls, getBus());
+ factory.addBeanParamInfo(bpi);
+ }
+ }
+ }
+ }
+
+ }
+
protected void applyFeatures() {
if (getFeatures() != null) {
for (Feature feature : getFeatures()) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Wed Feb 6 12:35:21 2013
@@ -371,6 +371,10 @@ public abstract class AbstractClient imp
}
}
}
+ String ct = (String)responseMessage.get(Message.CONTENT_TYPE);
+ if (ct != null) {
+ currentResponseBuilder.type(ct);
+ }
InputStream mStream = responseMessage.getContent(InputStream.class);
currentResponseBuilder.entity(mStream);
@@ -392,7 +396,7 @@ public abstract class AbstractClient imp
MediaType contentType = MediaType.valueOf(headers.getFirst("Content-Type").toString());
- List<WriterInterceptor> writers = ProviderFactory.getInstance(outMessage)
+ List<WriterInterceptor> writers = ClientProviderFactory.getInstance(outMessage)
.createMessageBodyWriterInterceptor(theClass, type, anns, contentType, outMessage);
if (writers != null) {
try {
@@ -463,7 +467,7 @@ public abstract class AbstractClient imp
MediaType contentType = getResponseContentType(r);
List<ReaderInterceptor> readers
- = ProviderFactory.getInstance(outMessage).createMessageBodyReaderInterceptor(
+ = ClientProviderFactory.getInstance(outMessage).createMessageBodyReaderInterceptor(
cls, type, anns, contentType, outMessage);
if (readers != null) {
try {
@@ -687,7 +691,7 @@ public abstract class AbstractClient imp
// so we can keep a map of ParamConverter on the bus, that said
// it seems an over-optimization at this stage, it's a 5% case;
// typical requests have a limited number of simple URI parameters
- ProviderFactory pf = ProviderFactory.getInstance(cfg.getBus());
+ ProviderFactory pf = ClientProviderFactory.getInstance(cfg.getBus());
if (pf != null) {
@SuppressWarnings("unchecked")
ParamConverter<Object> prov = (ParamConverter<Object>)pf.createParameterHandler(pClass);
Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java?rev=1442931&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java Wed Feb 6 12:35:21 2013
@@ -0,0 +1,148 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.jaxrs.client;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseFilter;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.common.util.ClassHelper;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.message.Message;
+
+public final class ClientProviderFactory extends ProviderFactory {
+ private static final String SHARED_CLIENT_FACTORY = "jaxrs.shared.client.factory";
+
+ private List<ProviderInfo<ClientRequestFilter>> clientRequestFilters =
+ new ArrayList<ProviderInfo<ClientRequestFilter>>(1);
+ private List<ProviderInfo<ClientResponseFilter>> clientResponseFilters =
+ new ArrayList<ProviderInfo<ClientResponseFilter>>(1);
+ private List<ProviderInfo<ResponseExceptionMapper<?>>> responseExceptionMappers =
+ new ArrayList<ProviderInfo<ResponseExceptionMapper<?>>>(1);
+
+
+ private ClientProviderFactory(ProviderFactory baseFactory, Bus bus) {
+ super(baseFactory, bus);
+ }
+
+ public static ClientProviderFactory createInstance(Bus bus) {
+ if (bus == null) {
+ bus = BusFactory.getThreadDefaultBus();
+ }
+ ClientProviderFactory baseFactory = initBaseFactory(bus);
+ ClientProviderFactory factory = new ClientProviderFactory(baseFactory, bus);
+ factory.setBusProviders();
+ return factory;
+ }
+
+ public static ClientProviderFactory getInstance(Bus bus) {
+ return (ClientProviderFactory)bus.getProperty(CLIENT_FACTORY_NAME);
+ }
+
+ public static ClientProviderFactory getInstance(Message m) {
+ Endpoint e = m.getExchange().get(Endpoint.class);
+ return (ClientProviderFactory)e.get(CLIENT_FACTORY_NAME);
+ }
+
+ private static synchronized ClientProviderFactory initBaseFactory(Bus bus) {
+ ClientProviderFactory factory = (ClientProviderFactory)bus.getProperty(SHARED_CLIENT_FACTORY);
+ if (factory != null) {
+ return factory;
+ }
+ factory = new ClientProviderFactory(null, bus);
+ ProviderFactory.initBaseFactory(factory);
+ bus.setProperty(SHARED_CLIENT_FACTORY, factory);
+ return factory;
+ }
+
+
+ //CHECKSTYLE:OFF
+ @Override
+ protected void setProviders(Object... providers) {
+ super.setProviders(providers);
+ for (Object o : providers) {
+ if (o == null) {
+ continue;
+ }
+ Class<?> oClass = ClassHelper.getRealClass(o);
+ if (ClientRequestFilter.class.isAssignableFrom(oClass)) {
+ clientRequestFilters.add(
+ new ProviderInfo<ClientRequestFilter>((ClientRequestFilter)o, getBus()));
+ }
+
+ if (ClientResponseFilter.class.isAssignableFrom(oClass)) {
+ clientResponseFilters.add(
+ new ProviderInfo<ClientResponseFilter>((ClientResponseFilter)o, getBus()));
+ }
+
+ if (ResponseExceptionMapper.class.isAssignableFrom(oClass)) {
+ responseExceptionMappers.add(
+ new ProviderInfo<ResponseExceptionMapper<?>>((ResponseExceptionMapper<?>)o, getBus()));
+ }
+
+
+ }
+ Collections.sort(clientRequestFilters, new BindingPriorityComparator(true));
+ Collections.sort(clientResponseFilters, new BindingPriorityComparator(false));
+
+ injectContextProxies(responseExceptionMappers, clientRequestFilters, clientResponseFilters);
+ }
+//CHECKSTYLE:ON
+
+ @SuppressWarnings("unchecked")
+ public <T extends Throwable> ResponseExceptionMapper<T> createResponseExceptionMapper(
+ Class<?> paramType) {
+
+ List<ResponseExceptionMapper<?>> candidates = new LinkedList<ResponseExceptionMapper<?>>();
+
+ for (ProviderInfo<ResponseExceptionMapper<?>> em : responseExceptionMappers) {
+ handleMapper(candidates, em, paramType, null, ResponseExceptionMapper.class, true);
+ }
+ if (candidates.size() == 0) {
+ return null;
+ }
+ Collections.sort(candidates, new ProviderFactory.ClassComparator());
+ return (ResponseExceptionMapper<T>) candidates.get(0);
+ }
+
+ @Override
+ public void clearProviders() {
+ super.clearProviders();
+ responseExceptionMappers.clear();
+ clientRequestFilters.clear();
+ clientResponseFilters.clear();
+ }
+
+ public List<ProviderInfo<ClientRequestFilter>> getClientRequestFilters() {
+ return Collections.unmodifiableList(clientRequestFilters);
+ }
+
+ public List<ProviderInfo<ClientResponseFilter>> getClientResponseFilters() {
+ return Collections.unmodifiableList(clientResponseFilters);
+ }
+
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Wed Feb 6 12:35:21 2013
@@ -60,7 +60,6 @@ import org.apache.cxf.jaxrs.model.ClassR
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.Parameter;
import org.apache.cxf.jaxrs.model.ParameterType;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.AnnotationUtils;
import org.apache.cxf.jaxrs.utils.FormUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
@@ -307,7 +306,7 @@ public class ClientProxyImpl extends Abs
}
private static ResponseExceptionMapper<?> findExceptionMapper(Method m, Message message) {
- ProviderFactory pf = ProviderFactory.getInstance(message);
+ ClientProviderFactory pf = ClientProviderFactory.getInstance(message);
Class<?>[] exTypes = m.getExceptionTypes();
if (exTypes.length == 0) {
exTypes = new Class[]{WebApplicationException.class};
@@ -595,7 +594,7 @@ public class ClientProxyImpl extends Abs
return readBody(r, outMessage, method.getReturnType(),
method.getGenericReturnType(), method.getDeclaredAnnotations());
} finally {
- ProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
+ ClientProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java Wed Feb 6 12:35:21 2013
@@ -361,8 +361,11 @@ public class JAXRSClientFactoryBean exte
if (headers != null && addHeaders) {
client.headers(headers);
}
+ ClientProviderFactory factory = ClientProviderFactory.createInstance(getBus());
+ setupFactory(factory, ep);
+ getBus().setProperty(ClientProviderFactory.class.getName(), factory);
- setupFactory(ep);
+
}
protected void applyFeatures(AbstractClient client) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Wed Feb 6 12:35:21 2013
@@ -56,7 +56,6 @@ import org.apache.cxf.jaxrs.ext.form.For
import org.apache.cxf.jaxrs.impl.ResponseImpl;
import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.URITemplate;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.jaxrs.utils.ParameterizedCollectionType;
@@ -992,7 +991,7 @@ public class WebClient extends AbstractC
throw (ex instanceof ClientException) ? (ClientException)ex
: new ClientException(ex);
} finally {
- ProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
+ ClientProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestFilterInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestFilterInterceptor.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestFilterInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientRequestFilterInterceptor.java Wed Feb 6 12:35:21 2013
@@ -28,8 +28,8 @@ import javax.ws.rs.core.Response;
import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.jaxrs.client.ClientProviderFactory;
import org.apache.cxf.jaxrs.model.ProviderInfo;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
@@ -44,7 +44,7 @@ public class ClientRequestFilterIntercep
}
public void handleMessage(Message outMessage) throws Fault {
- ProviderFactory pf = ProviderFactory.getInstance(outMessage);
+ ClientProviderFactory pf = ClientProviderFactory.getInstance(outMessage);
if (pf == null) {
return;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientResponseFilterInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientResponseFilterInterceptor.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientResponseFilterInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientResponseFilterInterceptor.java Wed Feb 6 12:35:21 2013
@@ -32,8 +32,8 @@ import javax.ws.rs.core.Response.Respons
import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.jaxrs.client.ClientProviderFactory;
import org.apache.cxf.jaxrs.model.ProviderInfo;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
@@ -45,7 +45,7 @@ public class ClientResponseFilterInterce
}
public void handleMessage(Message inMessage) throws Fault {
- ProviderFactory pf = ProviderFactory.getInstance(inMessage);
+ ClientProviderFactory pf = ClientProviderFactory.getInstance(inMessage);
if (pf == null) {
return;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ProvidersImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ProvidersImpl.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ProvidersImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ProvidersImpl.java Wed Feb 6 12:35:21 2013
@@ -30,6 +30,7 @@ import javax.ws.rs.ext.MessageBodyWriter
import javax.ws.rs.ext.Providers;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.message.Message;
public class ProvidersImpl implements Providers {
@@ -56,7 +57,7 @@ public class ProvidersImpl implements Pr
}
public <T extends Throwable> ExceptionMapper<T> getExceptionMapper(Class<T> type) {
- return ProviderFactory.getInstance(m).createExceptionMapper(type, m);
+ return ServerProviderFactory.getInstance(m).createExceptionMapper(type, m);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java Wed Feb 6 12:35:21 2013
@@ -33,7 +33,7 @@ import org.apache.cxf.common.util.String
import org.apache.cxf.jaxrs.ext.RequestHandler;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.message.Message;
@@ -207,7 +207,7 @@ public class RequestPreprocessor {
}
private Response handleMetadataRequest(Message m) {
- List<ProviderInfo<RequestHandler>> shs = ProviderFactory.getInstance(m).getRequestHandlers();
+ List<ProviderInfo<RequestHandler>> shs = ServerProviderFactory.getInstance(m).getRequestHandlers();
// this is actually being tested by ProviderFactory unit tests but just in case
// WadlGenerator, the custom or default one, must be the first one
if (shs.size() > 0 && shs.get(0).getProvider() instanceof WadlGenerator) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Wed Feb 6 12:35:21 2013
@@ -45,7 +45,7 @@ import org.apache.cxf.jaxrs.model.ClassR
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.model.URITemplate;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
@@ -80,7 +80,7 @@ public class JAXRSInInterceptor extends
LOG.warning("Exception occurred during releasing the service instance, " + tex.getMessage());
}
}
- ProviderFactory.getInstance(message).clearThreadLocalProxies();
+ ServerProviderFactory.getInstance(message).clearThreadLocalProxies();
ClassResourceInfo cri = (ClassResourceInfo)message.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
if (cri != null) {
cri.clearThreadLocalProxies();
@@ -99,7 +99,7 @@ public class JAXRSInInterceptor extends
} catch (RuntimeException ex) {
Response excResponse = JAXRSUtils.convertFaultToResponse(ex, message);
if (excResponse == null) {
- ProviderFactory.getInstance(message).clearThreadLocalProxies();
+ ServerProviderFactory.getInstance(message).clearThreadLocalProxies();
message.getExchange().put(Message.PROPOGATE_EXCEPTION,
JAXRSUtils.propogateException(message));
throw ex;
@@ -112,7 +112,7 @@ public class JAXRSInInterceptor extends
private void processRequest(Message message) {
- ProviderFactory providerFactory = ProviderFactory.getInstance(message);
+ ServerProviderFactory providerFactory = ServerProviderFactory.getInstance(message);
RequestPreprocessor rp = providerFactory.getRequestPreprocessor();
if (rp != null) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Wed Feb 6 12:35:21 2013
@@ -60,7 +60,7 @@ import org.apache.cxf.jaxrs.model.ClassR
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
@@ -82,7 +82,7 @@ public class JAXRSOutInterceptor extends
}
public void handleMessage(Message message) {
- ProviderFactory providerFactory = ProviderFactory.getInstance(message);
+ ServerProviderFactory providerFactory = ServerProviderFactory.getInstance(message);
try {
processResponse(providerFactory, message);
} finally {
@@ -107,7 +107,7 @@ public class JAXRSOutInterceptor extends
}
- private void processResponse(ProviderFactory providerFactory, Message message) {
+ private void processResponse(ServerProviderFactory providerFactory, Message message) {
if (isResponseAlreadyHandled(message)) {
return;
@@ -144,7 +144,7 @@ public class JAXRSOutInterceptor extends
serializeMessage(message, response, ori, !retryHappened);
}
- private Response runResponseFilters(ProviderFactory providerFactory,
+ private Response runResponseFilters(ServerProviderFactory providerFactory,
Message message,
Response response,
OperationResourceInfo ori) {
@@ -156,7 +156,7 @@ public class JAXRSOutInterceptor extends
}
List<ProviderInfo<ResponseHandler>> handlers =
- ProviderFactory.getInstance(message).getResponseHandlers();
+ ServerProviderFactory.getInstance(message).getResponseHandlers();
for (ProviderInfo<ResponseHandler> rh : handlers) {
InjectionUtils.injectContexts(rh.getProvider(), rh,
message.getExchange().getInMessage());
@@ -244,7 +244,7 @@ public class JAXRSOutInterceptor extends
List<WriterInterceptor> writers = null;
MediaType responseType = null;
for (MediaType type : availableContentTypes) {
- writers = ProviderFactory.getInstance(message)
+ writers = ServerProviderFactory.getInstance(message)
.createMessageBodyWriterInterceptor(targetType, genericType, annotations, type, message);
if (writers != null) {
@@ -370,7 +370,7 @@ public class JAXRSOutInterceptor extends
}
}
- private Response handleFilterException(ProviderFactory pf,
+ private Response handleFilterException(ServerProviderFactory pf,
Message message,
Response response,
OperationResourceInfo ori,
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=1442931&r1=1442930&r2=1442931&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Wed Feb 6 12:35:21 2013
@@ -28,32 +28,15 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
-import javax.ws.rs.BindingPriority;
import javax.ws.rs.Produces;
-import javax.ws.rs.RuntimeType;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.client.ClientResponseFilter;
-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.Application;
-import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Feature;
-import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.MessageBodyReader;
@@ -64,60 +47,39 @@ import javax.ws.rs.ext.ReaderInterceptor
import javax.ws.rs.ext.WriterInterceptor;
import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.ClassHelper;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.helpers.CastUtils;
-import org.apache.cxf.jaxrs.client.ResponseExceptionMapper;
import org.apache.cxf.jaxrs.ext.ContextProvider;
-import org.apache.cxf.jaxrs.ext.RequestHandler;
-import org.apache.cxf.jaxrs.ext.ResponseHandler;
import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
-import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.impl.ReaderInterceptorMBR;
-import org.apache.cxf.jaxrs.impl.RequestPreprocessor;
-import org.apache.cxf.jaxrs.impl.ResourceInfoImpl;
-import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
import org.apache.cxf.jaxrs.impl.WriterInterceptorMBW;
-import org.apache.cxf.jaxrs.model.BeanParamInfo;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
-import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.ProviderInfo;
-import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
import org.apache.cxf.jaxrs.utils.AnnotationUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
-public final class ProviderFactory {
- private static final Class<?>[] FILTER_INTERCEPTOR_CLASSES =
- new Class<?>[] {ContainerRequestFilter.class,
- ContainerResponseFilter.class,
- ReaderInterceptor.class,
- WriterInterceptor.class};
+public abstract class ProviderFactory {
+ protected static final String DEFAULT_FILTER_NAME_BINDING = "org.apache.cxf.filter.binding";
+ protected static final String SERVER_FACTORY_NAME = "org.apache.cxf.jaxrs.provider.ServerProviderFactory";
+ protected static final String CLIENT_FACTORY_NAME = "org.apache.cxf.jaxrs.client.ClientProviderFactory";
+
private static final String ACTIVE_JAXRS_PROVIDER_KEY = "active.jaxrs.provider";
private static final Logger LOG = LogUtils.getL7dLogger(ProviderFactory.class);
- private static final ProviderFactory SHARED_FACTORY = getInstance();
- private static final String DEFAULT_FILTER_NAME_BINDING = "org.apache.cxf.filter.binding";
private static final String JAXB_PROVIDER_NAME = "org.apache.cxf.jaxrs.provider.JAXBElementProvider";
private static final String JSON_PROVIDER_NAME = "org.apache.cxf.jaxrs.provider.json.JSONProvider";
private static final String BUS_PROVIDERS_ALL = "org.apache.cxf.jaxrs.bus.providers";
- static {
- SHARED_FACTORY.setProviders(new BinaryDataProvider<Object>(),
- new SourceProvider<Object>(),
- new DataSourceProvider<Object>(),
- new FormEncodingProvider<Object>(),
- new PrimitiveTextProvider<Object>(),
- new MultipartProvider(),
- new WebApplicationExceptionMapper(),
- new WadlGenerator());
-
- }
+ protected List<ProviderInfo<ReaderInterceptor>> readerInterceptors =
+ new ArrayList<ProviderInfo<ReaderInterceptor>>(1);
+ protected List<ProviderInfo<WriterInterceptor>> writerInterceptors =
+ new ArrayList<ProviderInfo<WriterInterceptor>>(1);
private List<ProviderInfo<MessageBodyReader<?>>> messageReaders =
new ArrayList<ProviderInfo<MessageBodyReader<?>>>();
@@ -130,84 +92,41 @@ public final class ProviderFactory {
private ParamConverterProvider newParamConverter;
- private List<ProviderInfo<MessageBodyReader<?>>> jaxbReaders =
- new ArrayList<ProviderInfo<MessageBodyReader<?>>>();
- private List<ProviderInfo<MessageBodyWriter<?>>> jaxbWriters =
- new ArrayList<ProviderInfo<MessageBodyWriter<?>>>();
-
- private List<ProviderInfo<ReaderInterceptor>> readerInterceptors =
- new ArrayList<ProviderInfo<ReaderInterceptor>>(1);
- private List<ProviderInfo<WriterInterceptor>> writerInterceptors =
- new ArrayList<ProviderInfo<WriterInterceptor>>(1);
-
- // Server specific providers
- private List<ProviderInfo<ExceptionMapper<?>>> exceptionMappers =
- new ArrayList<ProviderInfo<ExceptionMapper<?>>>(1);
-
- // RequestHandler & ResponseHandler will have to be deprecated for 2.7.0
- private List<ProviderInfo<RequestHandler>> requestHandlers =
- new ArrayList<ProviderInfo<RequestHandler>>(1);
- private List<ProviderInfo<ResponseHandler>> responseHandlers =
- new ArrayList<ProviderInfo<ResponseHandler>>(1);
-
- // ContainerRequestFilter & ContainerResponseFilter are introduced in JAX-RS 2.0
- private List<ProviderInfo<ContainerRequestFilter>> preMatchContainerRequestFilters =
- new ArrayList<ProviderInfo<ContainerRequestFilter>>(1);
- //TODO: consider using List as a value type for postmatching filters
- private Map<NameKey, ProviderInfo<ContainerRequestFilter>> postMatchContainerRequestFilters =
- new LinkedHashMap<NameKey, ProviderInfo<ContainerRequestFilter>>();
- private Map<NameKey, ProviderInfo<ContainerResponseFilter>> postMatchContainerResponseFilters =
- new LinkedHashMap<NameKey, ProviderInfo<ContainerResponseFilter>>();
- private RequestPreprocessor requestPreprocessor;
- private ProviderInfo<Application> application;
- private List<DynamicFeature> dynamicFeatures = new LinkedList<DynamicFeature>();
-
- // This may be better be kept at OperationResourceInfo ? Though we may have many methods
- // across different resources that use the same BeanParam.
- private Map<Class<?>, BeanParamInfo> beanParams = new HashMap<Class<?>, BeanParamInfo>();
-
// List of injected providers
private Collection<ProviderInfo<?>> injectedProviders =
new LinkedList<ProviderInfo<?>>();
-
- //TODO: Client-only providers, consider introducing ClientProviderFactory,
- // will make it easier to split the client API into a separate module
- private List<ProviderInfo<ClientRequestFilter>> clientRequestFilters =
- new ArrayList<ProviderInfo<ClientRequestFilter>>(1);
- private List<ProviderInfo<ClientResponseFilter>> clientResponseFilters =
- new ArrayList<ProviderInfo<ClientResponseFilter>>(1);
- private List<ProviderInfo<ResponseExceptionMapper<?>>> responseExceptionMappers =
- new ArrayList<ProviderInfo<ResponseExceptionMapper<?>>>(1);
-
private Bus bus;
+ private ProviderFactory baseFactory;
- private ProviderFactory(Bus bus) {
+ protected ProviderFactory(ProviderFactory baseFactory, Bus bus) {
+ this.baseFactory = baseFactory;
this.bus = bus;
- initJaxbProviders();
- setBusProviders();
}
- // Not ideal but in the end seems like the simplest option compared
- // to adding default readers/writers to existing messageReaders/Writers
- // (due to all sort of conflicts with custom providers) and cloning
- // at the request time
- private void initJaxbProviders() {
- Object jaxbProvider = createProvider(JAXB_PROVIDER_NAME);
- if (jaxbProvider != null) {
- jaxbReaders.add(new ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jaxbProvider, bus));
- jaxbWriters.add(new ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jaxbProvider, bus));
- }
- Object jsonProvider = createProvider(JSON_PROVIDER_NAME);
- if (jsonProvider != null) {
- jaxbReaders.add(new ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jsonProvider, bus));
- jaxbWriters.add(new ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jsonProvider, bus));
- }
- injectContextProxies(jaxbReaders, jaxbWriters);
+ protected Bus getBus() {
+ return bus;
}
+ protected ProviderFactory getBaseFactory() {
+ return baseFactory;
+ }
+ protected boolean isBaseFactory() {
+ return baseFactory == null;
+ }
+
+ protected static void initBaseFactory(ProviderFactory factory) {
+ factory.setProviders(new BinaryDataProvider<Object>(),
+ new SourceProvider<Object>(),
+ new DataSourceProvider<Object>(),
+ new FormEncodingProvider<Object>(),
+ new PrimitiveTextProvider<Object>(),
+ createProvider(JAXB_PROVIDER_NAME),
+ createProvider(JSON_PROVIDER_NAME),
+ new MultipartProvider());
+ }
private static Object createProvider(String className) {
@@ -225,35 +144,6 @@ public final class ProviderFactory {
return null;
}
- public static ProviderFactory getInstance() {
- return new ProviderFactory(BusFactory.getThreadDefaultBus());
- }
-
- public static ProviderFactory createInstance(Bus bus) {
- return new ProviderFactory(bus);
- }
-
- public static ProviderFactory getInstance(Bus bus) {
- return (ProviderFactory)bus.getProperty(ProviderFactory.class.getName());
- }
-
- public static ProviderFactory getInstance(Message m) {
- Endpoint e = m.getExchange().get(Endpoint.class);
- return (ProviderFactory)e.get(ProviderFactory.class.getName());
- }
-
- public static ProviderFactory getSharedInstance() {
- return SHARED_FACTORY;
- }
-
- public void addBeanParamInfo(BeanParamInfo bpi) {
- beanParams.put(bpi.getResourceClass(), bpi);
- }
-
- public BeanParamInfo getBeanParamInfo(Class<?> beanClass) {
- return beanParams.get(beanClass);
- }
-
public <T> ContextResolver<T> createContextResolver(Type contextType,
Message m) {
boolean isRequestor = MessageUtils.isRequestor(m);
@@ -350,31 +240,6 @@ public final class ProviderFactory {
return null;
}
- public <T extends Throwable> ExceptionMapper<T> createExceptionMapper(Class<?> exceptionType,
- Message m) {
- ExceptionMapper<T> mapper = doCreateExceptionMapper(exceptionType, m);
- if (mapper != null || this == SHARED_FACTORY) {
- return mapper;
- }
-
- return SHARED_FACTORY.createExceptionMapper(exceptionType, m);
- }
-
- @SuppressWarnings("unchecked")
- private <T extends Throwable> ExceptionMapper<T> doCreateExceptionMapper(
- Class<?> exceptionType, Message m) {
-
- List<ExceptionMapper<?>> candidates = new LinkedList<ExceptionMapper<?>>();
- for (ProviderInfo<ExceptionMapper<?>> em : exceptionMappers) {
- handleMapper(candidates, em, exceptionType, m, ExceptionMapper.class, true);
- }
- if (candidates.size() == 0) {
- return null;
- }
- Collections.sort(candidates, new ExceptionMapperComparator());
- return (ExceptionMapper<T>) candidates.get(0);
- }
-
public <T> ParamConverter<T> createParameterHandler(Class<T> paramType) {
if (newParamConverter != null) {
@@ -385,23 +250,7 @@ public final class ProviderFactory {
}
- @SuppressWarnings("unchecked")
- public <T extends Throwable> ResponseExceptionMapper<T> createResponseExceptionMapper(
- Class<?> paramType) {
-
- List<ResponseExceptionMapper<?>> candidates = new LinkedList<ResponseExceptionMapper<?>>();
-
- for (ProviderInfo<ResponseExceptionMapper<?>> em : responseExceptionMappers) {
- handleMapper(candidates, em, paramType, null, ResponseExceptionMapper.class, true);
- }
- if (candidates.size() == 0) {
- return null;
- }
- Collections.sort(candidates, new ClassComparator());
- return (ResponseExceptionMapper<T>) candidates.get(0);
- }
-
- private static <T> void handleMapper(List<T> candidates,
+ protected static <T> void handleMapper(List<T> candidates,
ProviderInfo<T> em,
Class<?> expectedType,
Message m,
@@ -541,108 +390,16 @@ public final class ProviderFactory {
mediaType,
m);
- if (mr == null) {
- mr = chooseMessageReader(jaxbReaders,
- bodyType,
- parameterType,
- parameterAnnotations,
- mediaType,
- m);
- }
-
- if (mr != null || SHARED_FACTORY == this) {
+ if (mr != null || isBaseFactory()) {
return mr;
}
- return SHARED_FACTORY.createMessageBodyReader(bodyType,
+ return baseFactory.createMessageBodyReader(bodyType,
parameterType,
parameterAnnotations,
mediaType,
m);
}
- private boolean isJaxbBasedProvider(Object sharedProvider) {
- String clsName = sharedProvider.getClass().getName();
- return JAXB_PROVIDER_NAME.equals(clsName) || JSON_PROVIDER_NAME.equals(clsName);
- }
-
- public List<ProviderInfo<ContainerRequestFilter>> getPreMatchContainerRequestFilters() {
- return Collections.unmodifiableList(preMatchContainerRequestFilters);
- }
-
- public List<ProviderInfo<ContainerRequestFilter>> getPostMatchContainerRequestFilters(List<String> names) {
- return getPostMatchContainerFilters(postMatchContainerRequestFilters,
- names);
- }
-
- public List<ProviderInfo<ContainerResponseFilter>> getContainerResponseFilters(List<String> names) {
- return getPostMatchContainerFilters(postMatchContainerResponseFilters,
- names);
- }
-
- public List<ProviderInfo<ClientRequestFilter>> getClientRequestFilters() {
- return Collections.unmodifiableList(clientRequestFilters);
- }
-
- public List<ProviderInfo<ClientResponseFilter>> getClientResponseFilters() {
- return Collections.unmodifiableList(clientResponseFilters);
- }
-
- //TODO: Also sort based on BindingPriority
- private static <T> List<ProviderInfo<T>> getPostMatchContainerFilters(Map<NameKey, ProviderInfo<T>> boundFilters,
- List<String> names) {
-
- if (boundFilters.isEmpty()) {
- return Collections.emptyList();
- }
- names = names == null ? Collections.<String>emptyList() : names;
-
- MultivaluedMap<ProviderInfo<T>, String> map =
- new MetadataMap<ProviderInfo<T>, String>();
- for (Map.Entry<NameKey, ProviderInfo<T>> entry : boundFilters.entrySet()) {
- String entryName = entry.getKey().getName();
- if (entryName.equals(DEFAULT_FILTER_NAME_BINDING)) {
- map.put(entry.getValue(), Collections.<String>emptyList());
- } else {
- map.add(entry.getValue(), entryName);
- }
- }
- List<ProviderInfo<T>> list = new LinkedList<ProviderInfo<T>>();
- for (Map.Entry<ProviderInfo<T>, List<String>> entry : map.entrySet()) {
- if (names.containsAll(entry.getValue())) {
- list.add(entry.getKey());
- }
- }
- return list;
- }
-
- public List<ProviderInfo<RequestHandler>> getRequestHandlers() {
- List<ProviderInfo<RequestHandler>> handlers = null;
- if (requestHandlers.size() == 0) {
- handlers = SHARED_FACTORY.requestHandlers;
- } else {
- handlers = new ArrayList<ProviderInfo<RequestHandler>>();
- boolean customWADLHandler = false;
- for (int i = 0; i < requestHandlers.size(); i++) {
- if (requestHandlers.get(i).getProvider() instanceof WadlGenerator) {
- customWADLHandler = true;
- break;
- }
- }
- if (!customWADLHandler) {
- // TODO : this works only because we know we only have a single
- // system handler which is a default WADLGenerator, think of a better approach
- handlers.addAll(SHARED_FACTORY.requestHandlers);
- }
- handlers.addAll(requestHandlers);
-
- }
- return Collections.unmodifiableList(handlers);
- }
-
- public List<ProviderInfo<ResponseHandler>> getResponseHandlers() {
- return Collections.unmodifiableList(responseHandlers);
- }
-
public <T> MessageBodyWriter<T> createMessageBodyWriter(Class<T> bodyType,
Type parameterType,
Annotation[] parameterAnnotations,
@@ -656,27 +413,19 @@ public final class ProviderFactory {
mediaType,
m);
- if (mw == null) {
- mw = chooseMessageWriter(jaxbWriters,
- bodyType,
- parameterType,
- parameterAnnotations,
- mediaType,
- m);
- }
- if (mw != null || SHARED_FACTORY == this) {
+ if (mw != null || isBaseFactory()) {
return mw;
}
- return SHARED_FACTORY.createMessageBodyWriter(bodyType,
+ return baseFactory.createMessageBodyWriter(bodyType,
parameterType,
parameterAnnotations,
mediaType,
m);
}
- private void setBusProviders() {
+ protected void setBusProviders() {
List<Object> extensions = new LinkedList<Object>();
final String alreadySetProp = "bus.providers.set";
if (bus.getProperty(alreadySetProp) == null) {
@@ -707,13 +456,8 @@ public final class ProviderFactory {
}
}
-//CHECKSTYLE:OFF
- private void setProviders(Object... providers) {
-
- List<ProviderInfo<ContainerRequestFilter>> postMatchRequestFilters =
- new LinkedList<ProviderInfo<ContainerRequestFilter>>();
- List<ProviderInfo<ContainerResponseFilter>> postMatchResponseFilters =
- new LinkedList<ProviderInfo<ContainerResponseFilter>>();
+ //CHECKSTYLE:OFF
+ protected void setProviders(Object... providers) {
for (Object o : providers) {
if (o == null) {
@@ -737,26 +481,6 @@ public final class ProviderFactory {
contextProviders.add(new ProviderInfo<ContextProvider<?>>((ContextProvider<?>)o, bus));
}
- if (RequestHandler.class.isAssignableFrom(oClass)) {
- requestHandlers.add(new ProviderInfo<RequestHandler>((RequestHandler)o, bus));
- }
-
- if (ResponseHandler.class.isAssignableFrom(oClass)) {
- responseHandlers.add(new ProviderInfo<ResponseHandler>((ResponseHandler)o, bus));
- }
-
- if (ContainerRequestFilter.class.isAssignableFrom(oClass)) {
- addContainerFilter(postMatchRequestFilters,
- new ProviderInfo<ContainerRequestFilter>((ContainerRequestFilter)o, bus),
- preMatchContainerRequestFilters);
- }
-
- if (ContainerResponseFilter.class.isAssignableFrom(oClass)) {
- addContainerFilter(postMatchResponseFilters,
- new ProviderInfo<ContainerResponseFilter>((ContainerResponseFilter)o, bus),
- null);
- }
-
if (ReaderInterceptor.class.isAssignableFrom(oClass)) {
readerInterceptors.add(
new ProviderInfo<ReaderInterceptor>((ReaderInterceptor)o, bus));
@@ -767,28 +491,6 @@ public final class ProviderFactory {
new ProviderInfo<WriterInterceptor>((WriterInterceptor)o, bus));
}
- if (DynamicFeature.class.isAssignableFrom(oClass)) {
- dynamicFeatures.add((DynamicFeature)o);
- }
-
- if (ClientRequestFilter.class.isAssignableFrom(oClass)) {
- clientRequestFilters.add(
- new ProviderInfo<ClientRequestFilter>((ClientRequestFilter)o, bus));
- }
-
- if (ClientResponseFilter.class.isAssignableFrom(oClass)) {
- clientResponseFilters.add(
- new ProviderInfo<ClientResponseFilter>((ClientResponseFilter)o, bus));
- }
-
- if (ExceptionMapper.class.isAssignableFrom(oClass)) {
- exceptionMappers.add(new ProviderInfo<ExceptionMapper<?>>((ExceptionMapper<?>)o, bus));
- }
-
- if (ResponseExceptionMapper.class.isAssignableFrom(oClass)) {
- responseExceptionMappers.add(new ProviderInfo<ResponseExceptionMapper<?>>((ResponseExceptionMapper<?>)o, bus));
- }
-
if (ParamConverterProvider.class.isAssignableFrom(oClass)) {
newParamConverter = (ParamConverterProvider)o;
}
@@ -797,57 +499,13 @@ public final class ProviderFactory {
sortWriters();
sortContextResolvers();
- Collections.sort(preMatchContainerRequestFilters, new BindingPriorityComparator(true));
- mapContainerFilters(postMatchContainerRequestFilters, postMatchRequestFilters, true);
- mapContainerFilters(postMatchContainerResponseFilters, postMatchResponseFilters, false);
Collections.sort(readerInterceptors, new BindingPriorityComparator(true));
Collections.sort(writerInterceptors, new BindingPriorityComparator(false));
- Collections.sort(clientRequestFilters, new BindingPriorityComparator(true));
- Collections.sort(clientResponseFilters, new BindingPriorityComparator(false));
-
injectContextProxies(messageReaders, messageWriters, contextResolvers,
- requestHandlers, responseHandlers, exceptionMappers,
- postMatchContainerRequestFilters.values(), preMatchContainerRequestFilters,
- postMatchContainerResponseFilters.values(),
- responseExceptionMappers, clientRequestFilters, clientResponseFilters,
readerInterceptors, writerInterceptors);
}
-//CHECKSTYLE:ON
-
- private static <T> void mapContainerFilters(Map<NameKey, ProviderInfo<T>> map,
- List<ProviderInfo<T>> postMatchFilters,
- boolean ascending) {
-
- Collections.sort(postMatchFilters, new PostMatchFilterComparator(ascending));
- for (ProviderInfo<T> p : postMatchFilters) {
- List<String> names = AnnotationUtils.getNameBindings(
- p.getProvider().getClass().getAnnotations());
- names = names.isEmpty() ? Collections.singletonList(DEFAULT_FILTER_NAME_BINDING) : names;
- for (String name : names) {
- map.put(new NameKey(name, AnnotationUtils.getBindingPriority(p.getProvider().getClass())),
- p);
- }
- }
-
- }
-
- private static <T> void addContainerFilter(List<ProviderInfo<T>> postMatchFilters,
- ProviderInfo<T> p,
- List<ProviderInfo<T>> preMatchFilters) {
- T filter = p.getProvider();
- if (preMatchFilters != null && isPrematching(filter.getClass())) {
- preMatchFilters.add(p);
- } else {
- postMatchFilters.add(p);
- }
-
- }
-
- private static boolean isPrematching(Class<?> filterCls) {
- return AnnotationUtils.getAnnotation(filterCls.getAnnotations(),
- PreMatching.class) != null;
- }
+ //CHECKSTYLE:ON
static void injectContextValues(ProviderInfo<?> pi, Message m) {
if (m != null) {
@@ -855,13 +513,10 @@ public final class ProviderFactory {
}
}
- void injectContextProxies(Collection<?> ... providerLists) {
+ protected void injectContextProxies(Collection<?> ... providerLists) {
for (Collection<?> list : providerLists) {
Collection<ProviderInfo<?>> l2 = CastUtils.cast(list);
for (ProviderInfo<?> pi : l2) {
- if (ProviderFactory.SHARED_FACTORY == this && isJaxbBasedProvider(pi.getProvider())) {
- continue;
- }
injectContextProxiesIntoProvider(pi);
}
}
@@ -915,7 +570,7 @@ public final class ProviderFactory {
List<MessageBodyReader<?>> candidates = new LinkedList<MessageBodyReader<?>>();
for (ProviderInfo<MessageBodyReader<?>> ep : readers) {
if (matchesReaderCriterias(ep, type, genericType, annotations, mediaType, m)) {
- if (this == SHARED_FACTORY) {
+ if (isBaseFactory()) {
return (MessageBodyReader<T>) ep.getProvider();
}
handleMapper(candidates, ep, type, m, MessageBodyReader.class, false);
@@ -946,7 +601,7 @@ public final class ProviderFactory {
return false;
}
boolean injected = false;
- if (this != SHARED_FACTORY || !isJaxbBasedProvider(ep)) {
+ if (m.get(ACTIVE_JAXRS_PROVIDER_KEY) != ep) {
injectContextValues(pi, m);
injected = true;
}
@@ -977,7 +632,7 @@ public final class ProviderFactory {
List<MessageBodyWriter<?>> candidates = new LinkedList<MessageBodyWriter<?>>();
for (ProviderInfo<MessageBodyWriter<?>> ep : writers) {
if (matchesWriterCriterias(ep, type, genericType, annotations, mediaType, m)) {
- if (this == SHARED_FACTORY) {
+ if (isBaseFactory()) {
return (MessageBodyWriter<T>) ep.getProvider();
}
handleMapper(candidates, ep, type, m, MessageBodyWriter.class, false);
@@ -1007,8 +662,7 @@ public final class ProviderFactory {
return false;
}
boolean injected = false;
- if ((this != SHARED_FACTORY || !isJaxbBasedProvider(ep))
- && m.get(ACTIVE_JAXRS_PROVIDER_KEY) != ep) {
+ if (m.get(ACTIVE_JAXRS_PROVIDER_KEY) != ep) {
injectContextValues(pi, m);
injected = true;
}
@@ -1095,30 +749,10 @@ public final class ProviderFactory {
}
}
- public void setApplicationProvider(ProviderInfo<Application> app) {
- application = app;
- }
-
- public void setRequestPreprocessor(RequestPreprocessor rp) {
- this.requestPreprocessor = rp;
- }
-
- public RequestPreprocessor getRequestPreprocessor() {
- return requestPreprocessor;
- }
-
- public void clearExceptionMapperProxies() {
- clearProxies(exceptionMappers);
- }
-
public void clearThreadLocalProxies() {
clearProxies(injectedProviders);
-
- if (application != null) {
- application.clearThreadLocalProxies();
- }
- if (this != SHARED_FACTORY) {
- SHARED_FACTORY.clearThreadLocalProxies();
+ if (baseFactory != null) {
+ baseFactory.clearThreadLocalProxies();
}
}
@@ -1136,15 +770,6 @@ public final class ProviderFactory {
messageWriters.clear();
contextResolvers.clear();
contextProviders.clear();
- exceptionMappers.clear();
- requestHandlers.clear();
- responseHandlers.clear();
- postMatchContainerRequestFilters.clear();
- postMatchContainerResponseFilters.clear();
- preMatchContainerRequestFilters.clear();
- responseExceptionMappers.clear();
- clientRequestFilters.clear();
- clientResponseFilters.clear();
}
public void setBus(Bus bus) {
@@ -1156,30 +781,6 @@ public final class ProviderFactory {
}
}
- public void applyDynamicFeatures(List<ClassResourceInfo> list) {
- if (dynamicFeatures.size() > 0) {
- for (ClassResourceInfo cri : list) {
- doApplyDynamicFeatures(cri);
- }
- }
- }
-
- private void doApplyDynamicFeatures(ClassResourceInfo cri) {
- Set<OperationResourceInfo> oris = cri.getMethodDispatcher().getOperationResourceInfos();
- for (OperationResourceInfo ori : oris) {
- for (DynamicFeature feature : dynamicFeatures) {
- FeatureContext methodConfigurable = new MethodConfigurable(ori);
- feature.configure(new ResourceInfoImpl(ori), methodConfigurable);
- }
- }
- Collection<ClassResourceInfo> subs = cri.getSubResources();
- for (ClassResourceInfo sub : subs) {
- if (sub != cri) {
- doApplyDynamicFeatures(sub);
- }
- }
- }
-
private boolean injectProviderProperty(Object provider, String mName, Class<?> pClass,
Object pValue) {
try {
@@ -1199,7 +800,9 @@ public final class ProviderFactory {
injectProviderProperty(r.getProvider(), "setSchemaLocations", List.class, schemas);
}
if (!schemasMethodAvailable) {
- for (ProviderInfo<MessageBodyReader<?>> r : jaxbReaders) {
+ setProviders(createProvider(JAXB_PROVIDER_NAME),
+ createProvider(JSON_PROVIDER_NAME));
+ for (ProviderInfo<MessageBodyReader<?>> r : messageReaders) {
injectProviderProperty(r.getProvider(), "setSchemaLocations", List.class, schemas);
}
}
@@ -1213,40 +816,37 @@ public final class ProviderFactory {
((AbstractConfigurableProvider)provider).init(cris);
}
}
- if (this != SHARED_FACTORY) {
- SHARED_FACTORY.initProviders(cris);
+ if (!isBaseFactory()) {
+ baseFactory.initProviders(cris);
}
}
Set<Object> getReadersWriters() {
Set<Object> set = new HashSet<Object>();
set.addAll(messageReaders);
- set.addAll(jaxbReaders);
set.addAll(messageWriters);
- set.addAll(jaxbWriters);
return set;
}
- private static class ExceptionMapperComparator implements
- Comparator<ExceptionMapper<? extends Throwable>> {
-
- public int compare(ExceptionMapper<? extends Throwable> em1,
- ExceptionMapper<? extends Throwable> em2) {
- return compareClasses(em1, em2);
- }
-
- }
-
- private static class ClassComparator implements
+ public static class ClassComparator implements
Comparator<Object> {
public int compare(Object em1, Object em2) {
return compareClasses(em1, em2);
}
+ }
+
+ public static ProviderFactory getInstance(Message m) {
+ Endpoint e = m.getExchange().get(Endpoint.class);
+
+ Message outM = m.getExchange().getOutMessage();
+ boolean isClient = outM != null && MessageUtils.isRequestor(outM);
+ String name = isClient ? CLIENT_FACTORY_NAME : SERVER_FACTORY_NAME;
+ return (ProviderFactory)e.get(name);
}
- private static int compareClasses(Object o1, Object o2) {
+ protected static int compareClasses(Object o1, Object o2) {
Class<?> cl1 = ClassHelper.getRealClass(o1);
Class<?> cl2 = ClassHelper.getRealClass(o2);
@@ -1286,30 +886,7 @@ public final class ProviderFactory {
return getGenericInterfaces(cls.getSuperclass());
}
- private static class PostMatchFilterComparator extends BindingPriorityComparator {
- public PostMatchFilterComparator(boolean ascending) {
- super(ascending);
- }
-
- @Override
- public int compare(ProviderInfo<?> p1, ProviderInfo<?> p2) {
- int result = super.compare(p1, p2);
- if (result == 0) {
- Integer namesSize1 =
- AnnotationUtils.getNameBindings(p1.getProvider().getClass().getAnnotations()).size();
- Integer namesSize2 =
- AnnotationUtils.getNameBindings(p2.getProvider().getClass().getAnnotations()).size();
-
- // if we have two filters with the same binding priority,
- // then put a filter with more name bindings upfront
- // (this effectively puts name bound filters before global ones)
- result = namesSize1.compareTo(namesSize2) * -1;
- }
- return result;
- }
- }
-
- private static class BindingPriorityComparator extends AbstactBindingPriorityComparator {
+ protected static class BindingPriorityComparator extends AbstactBindingPriorityComparator {
public BindingPriorityComparator(boolean ascending) {
super(ascending);
}
@@ -1357,295 +934,5 @@ public final class ProviderFactory {
}
}
- private static class NameKey {
- private String name;
- private int bindingPriority;
- public NameKey(String name, int priority) {
- this.name = name;
- this.bindingPriority = priority;
- }
-
- public String getName() {
- return name;
- }
-
- public int getPriority() {
- return bindingPriority;
- }
- }
- private class MethodConfigurable implements FeatureContext, Configuration {
-
- private OperationResourceInfo ori;
- private String nameBinding;
- private boolean bindingSet;
-
- public MethodConfigurable(OperationResourceInfo ori) {
- this.ori = ori;
- nameBinding = DEFAULT_FILTER_NAME_BINDING
- + ori.getClassResourceInfo().getServiceClass().getName()
- + "."
- + ori.getMethodToInvoke().getName();
- }
-
-
- @Override
- public Configuration getConfiguration() {
- return this;
- }
-
- @Override
- public FeatureContext register(Object provider) {
- return register(provider, AnnotationUtils.getBindingPriority(provider.getClass()));
- }
-
- @Override
- public FeatureContext register(Object provider, int bindingPriority) {
- return doRegister(provider, bindingPriority, FILTER_INTERCEPTOR_CLASSES);
- }
-
- @Override
- public FeatureContext register(Object provider, Class<?>... contracts) {
- return register(provider, BindingPriority.USER, contracts);
- }
-
- //@Override
- public FeatureContext register(Object provider, int priority, Class<?>... contracts) {
- return register(provider, priority, contracts);
- }
-
- @Override
- public FeatureContext register(Object provider, Map<Class<?>, Integer> contracts) {
- for (Map.Entry<Class<?>, Integer> entry : contracts.entrySet()) {
- doRegister(provider, entry.getValue(), entry.getKey());
- }
- return this;
- }
-
- @Override
- public FeatureContext register(Class<?> providerClass) {
- return register(providerClass, AnnotationUtils.getBindingPriority(providerClass));
- }
-
- @Override
- public FeatureContext register(Class<?> providerClass, int bindingPriority) {
- return doRegister(createProvider(providerClass), bindingPriority,
- FILTER_INTERCEPTOR_CLASSES);
- }
-
- @Override
- public FeatureContext register(Class<?> providerClass, Class<?>... contracts) {
- return register(providerClass, BindingPriority.USER, contracts);
- }
-
- @Override
- public FeatureContext register(Class<?> providerClass, Map<Class<?>, Integer> contracts) {
- Object provider = createProvider(providerClass);
- for (Map.Entry<Class<?>, Integer> entry : contracts.entrySet()) {
- doRegister(provider, entry.getValue(), entry.getKey());
- }
- return this;
- }
-
- public FeatureContext replaceWith(Configuration config) {
- // nothing to do in this case
- return this;
- }
-
- //@Override
- public FeatureContext register(Class<?> providerClass, int bindingPriority,
- Class<?>... contracts) {
- return doRegister(createProvider(providerClass), bindingPriority, contracts);
- }
-
- private FeatureContext doRegister(Object provider, int bindingPriority, Class<?>... contracts) {
-
- if (provider instanceof Feature) {
- ((Feature)provider).configure(this);
- return this;
- }
-
- boolean setIsNeeded = false;
- for (Class<?> contract : contracts) {
- if (contract == ContainerRequestFilter.class && provider instanceof ContainerRequestFilter) {
- if (isPrematching(provider.getClass())) {
- addToInterceptors(preMatchContainerRequestFilters, provider, bindingPriority, true);
- } else {
- postMatchContainerRequestFilters =
- addToPostMatching(postMatchContainerRequestFilters, provider, bindingPriority, true);
- setIsNeeded = true;
- }
- }
- if (contract == ContainerResponseFilter.class && provider instanceof ContainerResponseFilter) {
- postMatchContainerResponseFilters =
- addToPostMatching(postMatchContainerResponseFilters, provider, bindingPriority, false);
- setIsNeeded = true;
- }
- if (contract == ReaderInterceptor.class && provider instanceof ReaderInterceptor) {
- addToInterceptors(readerInterceptors, provider, bindingPriority, true);
- }
- if (contract == WriterInterceptor.class && provider instanceof WriterInterceptor) {
- addToInterceptors(writerInterceptors, provider, bindingPriority, false);
- }
- }
-
- if (setIsNeeded && !bindingSet) {
- ori.addNameBindings(Collections.singletonList(nameBinding));
- bindingSet = true;
- }
-
- return this;
- }
-
- @SuppressWarnings("unchecked")
- private <T> void addToInterceptors(List<ProviderInfo<T>> providers, Object provider,
- int priority, boolean asc) {
- int size = providers.size();
- if (size > 0) {
- for (int i = 0; i < size; i++) {
- int providerPriority = AnnotationUtils.getBindingPriority(
- providers.get(i).getProvider().getClass());
- if (asc) {
- if (priority < providerPriority || i + 1 == size) {
- int index = priority < providerPriority ? i : i + 1;
- providers.add(index, (ProviderInfo<T>)newProvider(provider));
- break;
- }
- } else if (priority > providerPriority || i + 1 == size) {
- int index = priority > providerPriority ? i : i + 1;
- providers.add(index, (ProviderInfo<T>)newProvider(provider));
- break;
- }
- }
- } else {
- providers.add((ProviderInfo<T>)newProvider(provider));
- }
- }
-
- private <T> ProviderInfo<T> newProvider(T provider) {
- ProviderInfo<T> newProvider = new ProviderInfo<T>(provider, bus);
- injectContextProxiesIntoProvider(newProvider);
- return newProvider;
- }
-
- @SuppressWarnings("unchecked")
- private <T> Map<NameKey, ProviderInfo<T>> addToPostMatching(
- Map<NameKey, ProviderInfo<T>> map, Object provider, int priority, boolean asc) {
- Map<NameKey, ProviderInfo<T>> newMap = new LinkedHashMap<NameKey, ProviderInfo<T>>();
-
- Iterator<Map.Entry<NameKey, ProviderInfo<T>>> it = map.entrySet().iterator();
- if (it.hasNext()) {
- boolean added = false;
- while (it.hasNext()) {
- Map.Entry<NameKey, ProviderInfo<T>> entry = it.next();
- int providerPriority = entry.getKey().getPriority();
- // this surely can be collapsed further
- if (!added && asc && (priority < providerPriority || !it.hasNext())) {
- addNewProvider(newMap, entry, provider, priority, providerPriority >= priority);
- added = true;
- } else if (!added && !asc && (priority > providerPriority || !it.hasNext())) {
- addNewProvider(newMap, entry, provider, priority, priority > providerPriority);
- added = true;
- } else {
- newMap.put(entry.getKey(), entry.getValue());
- }
- }
- } else {
- newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider));
- }
- return newMap;
-
-
- }
-
- @SuppressWarnings("unchecked")
- private <T> void addNewProvider(Map<NameKey, ProviderInfo<T>> newMap,
- Map.Entry<NameKey, ProviderInfo<T>> entry,
- Object provider,
- int priority,
- boolean first) {
- if (first) {
- newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider));
- newMap.put(entry.getKey(), entry.getValue());
- } else {
- newMap.put(entry.getKey(), entry.getValue());
- newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider));
- }
- }
-
- @Override
- public Set<Class<?>> getClasses() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Map<Class<?>, Integer> getContracts(Class<?> componentClass) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Set<Object> getInstances() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Map<String, Object> getProperties() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean isEnabled(Feature feature) {
- return false;
- }
-
- @Override
- public boolean isEnabled(Class<? extends Feature> featureClass) {
- return false;
- }
-
- @Override
- public RuntimeType getRuntimeType() {
- return null;
- }
-
- @Override
- public Object getProperty(String name) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<String> getPropertyNames() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean isRegistered(Class<?> componentClass) {
- return false;
- }
-
- @Override
- public boolean isRegistered(Object component) {
- return false;
- }
-
- @Override
- public FeatureContext setProperty(String name, Object value) {
- // TODO Auto-generated method stub
- return null;
- }
-
- private Object createProvider(Class<?> cls) {
- try {
- return cls.newInstance();
- } catch (Throwable ex) {
- throw new RuntimeException(ex);
- }
- }
- }
}