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/08/01 17:06:16 UTC
svn commit: r1509277 - in /cxf/trunk/rt:
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rs/client/src/main/java/org/apache/cxf...
Author: sergeyb
Date: Thu Aug 1 15:06:15 2013
New Revision: 1509277
URL: http://svn.apache.org/r1509277
Log:
[CXF-5135] Supporting a case where an object imlpementing multiple filter contracts wants each contract to have its own unique priority
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.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/provider/ServerProviderFactory.java
cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientConfigurableImpl.java
cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java Thu Aug 1 15:06:15 2013
@@ -81,9 +81,13 @@ public class ConfigurableImpl<C extends
@Override
public C register(Object provider, Map<Class<?>, Integer> contracts) {
- for (Map.Entry<Class<?>, Integer> entry : contracts.entrySet()) {
- doRegister(provider, entry.getValue(), entry.getKey());
+ if (provider instanceof Feature) {
+ Feature feature = (Feature)provider;
+ config.setFeature(feature);
+ feature.configure(new FeatureContextImpl(this));
+ return configurable;
}
+ config.register(provider, contracts);
return configurable;
}
@@ -108,15 +112,8 @@ public class ConfigurableImpl<C extends
return register(ConfigurationImpl.createProvider(providerClass), contracts);
}
- protected C doRegister(Object provider, int bindingPriority, Class<?>... contracts) {
- if (provider instanceof Feature) {
- Feature feature = (Feature)provider;
- config.setFeature(feature);
- feature.configure(new FeatureContextImpl(this));
- return configurable;
- }
- config.register(provider, bindingPriority, contracts);
- return configurable;
+ private C doRegister(Object provider, int bindingPriority, Class<?>... contracts) {
+ return register(provider, ConfigurationImpl.initContractsMap(bindingPriority, contracts));
}
public static class FeatureContextImpl implements FeatureContext {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java Thu Aug 1 15:06:15 2013
@@ -49,22 +49,22 @@ public class ConfigurationImpl implement
Set<Class<?>> providerClasses = new HashSet<Class<?>>(parent.getClasses());
for (Object o : parent.getInstances()) {
- registerParentProvider(o, parent);
+ registerParentProvider(o, parent, defaultContracts);
providerClasses.remove(o.getClass());
}
for (Class<?> cls : providerClasses) {
- registerParentProvider(createProvider(cls), parent);
+ registerParentProvider(createProvider(cls), parent, defaultContracts);
}
}
}
- private void registerParentProvider(Object o, Configuration parent) {
+ private void registerParentProvider(Object o, Configuration parent, Class<?>[] defaultContracts) {
Map<Class<?>, Integer> contracts = parent.getContracts(o.getClass());
if (contracts != null) {
providers.put(o, contracts);
} else {
- register(o, AnnotationUtils.getBindingPriority(o.getClass()));
+ register(o, AnnotationUtils.getBindingPriority(o.getClass()), defaultContracts);
}
}
@@ -155,19 +155,31 @@ public class ConfigurationImpl implement
}
- public void register(Object provider, int bindingPriority, Class<?>... contracts) {
+ private void register(Object provider, int bindingPriority, Class<?>... contracts) {
+ register(provider, initContractsMap(bindingPriority, contracts));
+ }
+
+ public void register(Object provider, Map<Class<?>, Integer> contracts) {
Map<Class<?>, Integer> metadata = providers.get(provider);
if (metadata == null) {
metadata = new HashMap<Class<?>, Integer>();
providers.put(provider, metadata);
}
- for (Class<?> contract : contracts) {
+ for (Class<?> contract : contracts.keySet()) {
if (contract.isAssignableFrom(provider.getClass())) {
- metadata.put(contract, bindingPriority);
+ metadata.put(contract, contracts.get(contract));
}
}
}
+ public static Map<Class<?>, Integer> initContractsMap(int bindingPriority, Class<?>... contracts) {
+ Map<Class<?>, Integer> metadata = new HashMap<Class<?>, Integer>();
+ for (Class<?> contract : contracts) {
+ metadata.put(contract, bindingPriority);
+ }
+ return metadata;
+ }
+
public static Object createProvider(Class<?> cls) {
try {
return cls.newInstance();
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java Thu Aug 1 15:06:15 2013
@@ -20,7 +20,7 @@
package org.apache.cxf.jaxrs.model;
import java.util.Collections;
-import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.cxf.Bus;
@@ -28,17 +28,14 @@ import org.apache.cxf.Bus;
public class FilterProviderInfo<T> extends ProviderInfo<T> {
private Set<String> nameBinding;
- private int priority;
- private List<Class<?>> supportedContracts;
+ private Map<Class<?>, Integer> supportedContracts;
public FilterProviderInfo(T provider,
Bus bus,
String nameBinding,
- int priority,
- List<Class<?>> supportedContracts) {
+ Map<Class<?>, Integer> supportedContracts) {
super(provider, bus);
this.nameBinding = Collections.singleton(nameBinding);
- this.priority = priority;
this.supportedContracts = supportedContracts;
}
@@ -46,12 +43,12 @@ public class FilterProviderInfo<T> exten
return nameBinding;
}
- public int getPriority() {
- return priority;
+ public int getPriority(Class<?> contract) {
+ return supportedContracts.get(contract);
}
- public List<Class<?>> getSupportedContracts() {
- return supportedContracts;
+ public Set<Class<?>> getSupportedContracts() {
+ return supportedContracts.keySet();
}
}
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=1509277&r1=1509276&r2=1509277&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 Thu Aug 1 15:06:15 2013
@@ -116,7 +116,7 @@ public abstract class ProviderFactory {
this.bus = bus;
}
- protected Bus getBus() {
+ public Bus getBus() {
return bus;
}
@@ -532,8 +532,8 @@ public abstract class ProviderFactory {
sortWriters();
sortContextResolvers();
- mapInterceptorFilters(readerInterceptors, readInts, true);
- mapInterceptorFilters(writerInterceptors, writeInts, true);
+ mapInterceptorFilters(readerInterceptors, readInts, ReaderInterceptor.class, true);
+ mapInterceptorFilters(writerInterceptors, writeInts, WriterInterceptor.class, true);
injectContextProxies(messageReaders, messageWriters, contextResolvers,
readerInterceptors.values(), writerInterceptors.values());
@@ -995,13 +995,16 @@ public abstract class ProviderFactory {
protected static class BindingPriorityComparator extends AbstractPriorityComparator
implements Comparator<ProviderInfo<?>> {
-
- public BindingPriorityComparator(boolean ascending) {
+ private Class<?> providerCls;
+
+ public BindingPriorityComparator(Class<?> providerCls, boolean ascending) {
super(ascending);
+ this.providerCls = providerCls;
}
public int compare(ProviderInfo<?> p1, ProviderInfo<?> p2) {
- return compare(getFilterPriority(p1), getFilterPriority(p2));
+ return compare(getFilterPriority(p1, providerCls),
+ getFilterPriority(p2, providerCls));
}
}
@@ -1072,12 +1075,13 @@ public abstract class ProviderFactory {
protected static <T> void mapInterceptorFilters(Map<NameKey, ProviderInfo<T>> map,
List<ProviderInfo<T>> filters,
+ Class<?> providerCls,
boolean ascending) {
for (ProviderInfo<T> p : filters) {
Set<String> names = getFilterNameBindings(p);
- int priority = getFilterPriority(p);
+ int priority = getFilterPriority(p, providerCls);
for (String name : names) {
map.put(new NameKey(name, priority), p);
@@ -1100,8 +1104,8 @@ public abstract class ProviderFactory {
return names;
}
- protected static int getFilterPriority(ProviderInfo<?> p) {
- return p instanceof FilterProviderInfo ? ((FilterProviderInfo<?>)p).getPriority()
+ protected static int getFilterPriority(ProviderInfo<?> p, Class<?> providerCls) {
+ return p instanceof FilterProviderInfo ? ((FilterProviderInfo<?>)p).getPriority(providerCls)
: AnnotationUtils.getBindingPriority(p.getProvider().getClass());
}
@@ -1136,7 +1140,7 @@ public abstract class ProviderFactory {
Class<?> contract) {
boolean result = false;
if (contract.isAssignableFrom(providerCls)) {
- List<Class<?>> actualContracts = null;
+ Set<Class<?>> actualContracts = null;
if (provider instanceof FilterProviderInfo) {
actualContracts = ((FilterProviderInfo<?>)provider).getSupportedContracts();
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java Thu Aug 1 15:06:15 2013
@@ -37,7 +37,6 @@ import javax.ws.rs.container.PreMatching
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.ReaderInterceptor;
@@ -239,9 +238,12 @@ public final class ServerProviderFactory
}
- Collections.sort(preMatchContainerRequestFilters, new BindingPriorityComparator(true));
- mapInterceptorFilters(postMatchContainerRequestFilters, postMatchRequestFilters, true);
- mapInterceptorFilters(postMatchContainerResponseFilters, postMatchResponseFilters, false);
+ Collections.sort(preMatchContainerRequestFilters,
+ new BindingPriorityComparator(ContainerRequestFilter.class, true));
+ mapInterceptorFilters(postMatchContainerRequestFilters, postMatchRequestFilters,
+ ContainerRequestFilter.class, true);
+ mapInterceptorFilters(postMatchContainerResponseFilters, postMatchResponseFilters,
+ ContainerResponseFilter.class, false);
injectContextProxies(exceptionMappers,
postMatchContainerRequestFilters.values(), preMatchContainerRequestFilters,
@@ -422,26 +424,20 @@ public final class ServerProviderFactory
return configImpl.register(object, map);
}
- FeatureContext doRegister(Object provider, int priority, Class<?>... contracts) {
+ FeatureContext doRegister(Object provider, Map<Class<?>, Integer> contracts) {
- if (provider instanceof Feature) {
- ((Feature)provider).configure(this);
- return this;
- }
-
- List<Class<?>> actualContracts = new LinkedList<Class<?>>();
+ Map<Class<?>, Integer> actualContracts = new HashMap<Class<?>, Integer>();
- for (Class<?> contract : contracts) {
+ for (Class<?> contract : contracts.keySet()) {
if (SERVER_FILTER_INTERCEPTOR_CLASSES.contains(contract)
&& contract.isAssignableFrom(provider.getClass())) {
- actualContracts.add(contract);
+ actualContracts.put(contract, contracts.get(contract));
}
}
if (!actualContracts.isEmpty()) {
registerUserProvider(new FilterProviderInfo<Object>(provider,
getBus(),
nameBinding,
- priority,
actualContracts));
ori.addNameBindings(Collections.singletonList(nameBinding));
}
@@ -455,10 +451,10 @@ public final class ServerProviderFactory
super(mc, RuntimeType.SERVER, SERVER_FILTER_INTERCEPTOR_CLASSES.toArray(new Class<?>[]{}));
}
@Override
- protected FeatureContext doRegister(Object provider, int bindingPriority, Class<?>... contracts) {
- super.doRegister(provider, bindingPriority, contracts);
+ public FeatureContext register(Object provider, Map<Class<?>, Integer> contracts) {
+ super.register(provider, contracts);
return ((MethodFeatureContextImpl)super.getConfigurable())
- .doRegister(provider, bindingPriority, contracts);
+ .doRegister(provider, contracts);
}
}
Modified: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java Thu Aug 1 15:06:15 2013
@@ -92,11 +92,11 @@ public final class ClientProviderFactory
super.setCommonProviders(theProviders);
for (ProviderInfo<? extends Object> provider : theProviders) {
Class<?> providerCls = ClassHelper.getRealClass(provider.getProvider());
- if (ClientRequestFilter.class.isAssignableFrom(providerCls)) {
+ if (filterContractSupported(provider, providerCls, ClientRequestFilter.class)) {
clientRequestFilters.add((ProviderInfo<ClientRequestFilter>)provider);
}
- if (ClientResponseFilter.class.isAssignableFrom(providerCls)) {
+ if (filterContractSupported(provider, providerCls, ClientResponseFilter.class)) {
clientResponseFilters.add((ProviderInfo<ClientResponseFilter>)provider);
}
@@ -104,8 +104,10 @@ public final class ClientProviderFactory
responseExceptionMappers.add((ProviderInfo<ResponseExceptionMapper<?>>)provider);
}
}
- Collections.sort(clientRequestFilters, new BindingPriorityComparator(true));
- Collections.sort(clientResponseFilters, new BindingPriorityComparator(false));
+ Collections.sort(clientRequestFilters,
+ new BindingPriorityComparator(ClientRequestFilter.class, true));
+ Collections.sort(clientResponseFilters,
+ new BindingPriorityComparator(ClientResponseFilter.class, false));
injectContextProxies(responseExceptionMappers, clientRequestFilters, clientResponseFilters);
}
Modified: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientConfigurableImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientConfigurableImpl.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientConfigurableImpl.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientConfigurableImpl.java Thu Aug 1 15:06:15 2013
@@ -23,8 +23,6 @@ import javax.ws.rs.client.ClientRequestF
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.Configuration;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.WriterInterceptor;
@@ -35,8 +33,6 @@ public class ClientConfigurableImpl<C ex
private static final Class<?>[] CLIENT_FILTER_INTERCEPTOR_CLASSES =
new Class<?>[] {ClientRequestFilter.class,
ClientResponseFilter.class,
- MessageBodyReader.class,
- MessageBodyWriter.class,
ReaderInterceptor.class,
WriterInterceptor.class};
Modified: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java?rev=1509277&r1=1509276&r2=1509277&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java Thu Aug 1 15:06:15 2013
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.client.spec
import java.net.URI;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -39,6 +40,7 @@ import javax.ws.rs.core.UriBuilderExcept
import org.apache.cxf.jaxrs.client.ClientProviderFactory;
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.model.FilterProviderInfo;
public class ClientImpl implements Client {
private Configurable<Client> configImpl;
@@ -189,7 +191,19 @@ public class ClientImpl implements Clien
// register directly on the endpoint-specific ClientFactory
ClientProviderFactory pf =
ClientProviderFactory.getInstance(WebClient.getConfig(targetClient).getEndpoint());
- pf.setUserProviders(new LinkedList<Object>(configImpl.getConfiguration().getInstances()));
+ List<Object> providers = new LinkedList<Object>();
+ Configuration cfg = configImpl.getConfiguration();
+ for (Object p : cfg.getInstances()) {
+ Map<Class<?>, Integer> contracts = cfg.getContracts(p.getClass());
+ if (contracts == null || contracts.isEmpty()) {
+ providers.add(p);
+ } else {
+ providers.add(
+ new FilterProviderInfo<Object>(p, pf.getBus(), null, contracts));
+ }
+ }
+
+ pf.setUserProviders(providers);
// Collect the properties which may have been reset the requests
WebClient.getConfig(targetClient).getRequestContext().putAll(configImpl.getConfiguration().getProperties());