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/05/21 23:08:24 UTC
svn commit: r1484958 - in /cxf/branches/2.7.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/
systests/jaxrs/ systests/jaxrs/src/test/java/org/apache/cxf/systest/ja...
Author: sergeyb
Date: Tue May 21 21:08:24 2013
New Revision: 1484958
URL: http://svn.apache.org/r1484958
Log:
Merged revisions 1484943 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1484943 | sergeyb | 2013-05-21 21:35:55 +0100 (Tue, 21 May 2013) | 1 line
[Cxf-4996] Support for providers with complex hierarchy like Jackson 2.2.1, and also making it optional to check these hierarchies
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
cxf/branches/2.7.x-fixes/systests/jaxrs/pom.xml
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_cors/WEB-INF/beans.xml
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1484943
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Tue May 21 21:08:24 2013
@@ -92,11 +92,14 @@ import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
public final class ProviderFactory {
+ static final String IGNORE_TYPE_VARIABLES = "org.apache.cxf.jaxrs.providers.ignore.typevars";
+
private static final Class<?>[] FILTER_INTERCEPTOR_CLASSES =
new Class<?>[] {ContainerRequestFilter.class,
ContainerResponseFilter.class,
ReaderInterceptor.class,
WriterInterceptor.class};
+
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();
@@ -371,7 +374,7 @@ public final class ProviderFactory {
if (candidates.size() == 0) {
return null;
}
- Collections.sort(candidates, new ExceptionMapperComparator());
+ Collections.sort(candidates, new ClassComparator(exceptionType));
return (ExceptionMapper<T>) candidates.get(0);
}
@@ -399,7 +402,7 @@ public final class ProviderFactory {
if (candidates.size() == 0) {
return null;
}
- Collections.sort(candidates, new ClassComparator());
+ Collections.sort(candidates, new ClassComparator(paramType));
return (ResponseExceptionMapper<T>) candidates.get(0);
}
@@ -411,7 +414,12 @@ public final class ProviderFactory {
boolean injectContext) {
Class<?> mapperClass = ClassHelper.getRealClass(em.getProvider());
- Type[] types = getGenericInterfaces(mapperClass);
+ Type[] types = null;
+ if (m != null && MessageUtils.isTrue(m.getContextualProperty(IGNORE_TYPE_VARIABLES))) {
+ types = new Type[]{mapperClass};
+ } else {
+ types = getGenericInterfaces(mapperClass, expectedType);
+ }
for (Type t : types) {
if (t instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType)t;
@@ -450,7 +458,7 @@ public final class ProviderFactory {
return;
}
}
- } else if (t instanceof Class && ((Class<?>)t).isAssignableFrom(providerClass)) {
+ } else if (t instanceof Class && providerClass.isAssignableFrom((Class<?>)t)) {
if (injectContext) {
injectContextValues(em, m);
}
@@ -1241,31 +1249,26 @@ public final class ProviderFactory {
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
Comparator<Object> {
+ private Class<?> expectedCls;
+ public ClassComparator() {
+ }
+ public ClassComparator(Class<?> expectedCls) {
+ this.expectedCls = expectedCls;
+ }
public int compare(Object em1, Object em2) {
- return compareClasses(em1, em2);
+ return compareClasses(expectedCls, em1, em2);
}
}
-
- private static int compareClasses(Object o1, Object o2) {
+ protected static int compareClasses(Class<?> expectedCls, Object o1, Object o2) {
Class<?> cl1 = ClassHelper.getRealClass(o1);
Class<?> cl2 = ClassHelper.getRealClass(o2);
- Type[] types1 = getGenericInterfaces(cl1);
- Type[] types2 = getGenericInterfaces(cl2);
+ Type[] types1 = getGenericInterfaces(cl1, expectedCls);
+ Type[] types2 = getGenericInterfaces(cl2, expectedCls);
if (types1.length == 0 && types2.length > 0) {
return 1;
@@ -1285,19 +1288,22 @@ public final class ProviderFactory {
return -1;
}
- private static Type[] getGenericInterfaces(Class<?> cls) {
+ private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass) {
if (Object.class == cls) {
return new Type[]{};
}
- Type genericSuperCls = cls.getGenericSuperclass();
- if (genericSuperCls instanceof ParameterizedType) {
- return new Type[]{genericSuperCls};
+ if (expectedClass != null) {
+ Type genericSuperType = cls.getGenericSuperclass();
+ if (genericSuperType instanceof ParameterizedType
+ && expectedClass == InjectionUtils.getActualType(genericSuperType)) {
+ return new Type[]{genericSuperType};
+ }
}
Type[] types = cls.getGenericInterfaces();
if (types.length > 0) {
return types;
}
- return getGenericInterfaces(cls.getSuperclass());
+ return getGenericInterfaces(cls.getSuperclass(), expectedClass);
}
private static class PostMatchFilterComparator extends BindingPriorityComparator {
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java Tue May 21 21:08:24 2013
@@ -354,7 +354,8 @@ public class ProviderFactoryTest extends
RuntimeExceptionMapper2 exMapper2 = new RuntimeExceptionMapper2();
pf.registerUserProvider(exMapper2);
assertSame(exMapper1, pf.createExceptionMapper(RuntimeException.class, new MessageImpl()));
- assertSame(exMapper2, pf.createExceptionMapper(WebApplicationException.class, new MessageImpl()));
+ Object webExMapper = pf.createExceptionMapper(WebApplicationException.class, new MessageImpl());
+ assertSame(exMapper2, webExMapper);
}
@Test
@@ -438,6 +439,30 @@ public class ProviderFactoryTest extends
assertTrue(BinaryDataProvider.class == writer.getClass());
}
+ @Test
+ public void testGetComplexProvider() throws Exception {
+ ProviderFactory pf = ProviderFactory.getInstance();
+ pf.registerUserProvider(new ComplexMessageBodyReader());
+ Message m = new MessageImpl();
+ Exchange ex = new ExchangeImpl();
+ m.setExchange(ex);
+ m.put(ProviderFactory.IGNORE_TYPE_VARIABLES, true);
+ MessageBodyReader<Book> reader =
+ pf.createMessageBodyReader(Book.class, Book.class, null, MediaType.APPLICATION_JSON_TYPE,
+ m);
+ assertTrue(ComplexMessageBodyReader.class == reader.getClass());
+ }
+
+ @Test
+ public void testGetComplexProvider2() throws Exception {
+ ProviderFactory pf = ProviderFactory.getInstance();
+ pf.registerUserProvider(new ComplexMessageBodyReader());
+ MessageBodyReader<Book> reader =
+ pf.createMessageBodyReader(Book.class, Book.class, null, MediaType.APPLICATION_JSON_TYPE,
+ new MessageImpl());
+ assertTrue(ComplexMessageBodyReader.class == reader.getClass());
+ }
+
private void verifyProvider(ProviderFactory pf, Class<?> type, Class<?> provider, String mediaType)
throws Exception {
@@ -882,4 +907,44 @@ public class ProviderFactoryTest extends
}
+ private static class ComplexMessageBodyReader extends ProviderBase<AClass> {
+ }
+ private abstract static class ProviderBase<A> implements
+ MessageBodyReader<Object>, MessageBodyWriter<Object> {
+ @Override
+ public boolean isReadable(Class<?> cls, Type arg1, Annotation[] arg2, MediaType arg3) {
+ return true;
+ }
+
+ @Override
+ public Object readFrom(Class<Object> arg0, Type arg1, Annotation[] arg2, MediaType arg3,
+ MultivaluedMap<String, String> arg4, InputStream arg5) throws IOException,
+ WebApplicationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getSize(Object arg0, Class<?> arg1, Type arg2, Annotation[] arg3, MediaType arg4) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public boolean isWriteable(Class<?> arg0, Type arg1, Annotation[] arg2, MediaType arg3) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void writeTo(Object arg0, Class<?> arg1, Type arg2, Annotation[] arg3, MediaType arg4,
+ MultivaluedMap<String, Object> arg5, OutputStream arg6) throws IOException,
+ WebApplicationException {
+ // TODO Auto-generated method stub
+
+ }
+ }
+ public static class AClass {
+ }
+
}
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/pom.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/pom.xml?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/pom.xml (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/pom.xml Tue May 21 21:08:24 2013
@@ -326,14 +326,9 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-jaxrs</artifactId>
- <version>1.9.0</version>
- </dependency>
- <dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-core-asl</artifactId>
- <version>1.9.0</version>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-json-provider</artifactId>
+ <version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java Tue May 21 21:08:24 2013
@@ -25,6 +25,8 @@ import java.net.URLConnection;
import java.util.Collection;
import java.util.Collections;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
@@ -66,7 +68,7 @@ public class JAXRSClientServerResourceJa
String endpointAddress =
"http://localhost:" + PORT + "/webapp/bookstore/collections";
WebClient wc = WebClient.create(endpointAddress,
- Collections.singletonList(new org.codehaus.jackson.jaxrs.JacksonJsonProvider()));
+ Collections.singletonList(new JacksonJsonProvider()));
wc.accept("application/json");
Collection<? extends Book> collection = wc.getCollection(Book.class);
assertEquals(1, collection.size());
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java Tue May 21 21:08:24 2013
@@ -25,6 +25,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.rs.security.cors.CorsHeaderConstants;
@@ -68,7 +70,7 @@ public class CrossOriginSimpleTest exten
@Before
public void before() {
List<Object> providers = new ArrayList<Object>();
- providers.add(new org.codehaus.jackson.jaxrs.JacksonJsonProvider());
+ providers.add(new JacksonJsonProvider());
configClient = WebClient.create("http://localhost:" + PORT + "/config", providers);
}
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_cors/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_cors/WEB-INF/beans.xml?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_cors/WEB-INF/beans.xml (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_cors/WEB-INF/beans.xml Tue May 21 21:08:24 2013
@@ -51,7 +51,7 @@ http://cxf.apache.org/core
<ref bean="config-server" />
</jaxrs:serviceBeans>
<jaxrs:providers>
- <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
+ <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml?rev=1484958&r1=1484957&r2=1484958&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml Tue May 21 21:08:24 2013
@@ -34,7 +34,7 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
<ref bean="bookstore"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
- <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
+ <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
<bean id="bookstore" scope="prototype" class="org.apache.cxf.systest.jaxrs.BookStore"/>