Repository: cxf Updated Branches: refs/heads/3.0.x-fixes 748a28aa7 -> d507e977f
[CXF-6450] Applying a patch on behalf of Vladimir Kulev, re-enabling the test Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/d507e977 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/d507e977 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/d507e977 Branch: refs/heads/3.0.x-fixes Commit: d507e977f84038b2286e95b0aa1bfe8fac7d68ba Parents: 748a28a Author: Sergey Beryozkin <[email protected]> Authored: Thu Jul 23 14:09:29 2015 +0300 Committer: Sergey Beryozkin <[email protected]> Committed: Thu Jul 23 14:10:39 2015 +0300 ---------------------------------------------------------------------- .../apache/cxf/jaxrs/utils/InjectionUtils.java | 54 ++++++++++++++------ .../cxf/jaxrs/utils/InjectionUtilsTest.java | 33 +++++++++++- ...ServerResourceJacksonSpringProviderTest.java | 2 - 3 files changed, 71 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/d507e977/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java index 9491129..36ee7f2 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java @@ -24,6 +24,7 @@ import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.GenericArrayType; +import java.lang.reflect.GenericDeclaration; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -116,34 +117,57 @@ public final class InjectionUtils { return !cls.isInterface() && !Modifier.isAbstract(cls.getModifiers()); } + private static ParameterizedType findGenericDeclaration(GenericDeclaration declaration, Type scope) { + if (scope instanceof ParameterizedType) { + ParameterizedType type = (ParameterizedType) scope; + if (type.getRawType() == declaration) { + return type; + } else { + scope = type.getRawType(); + } + } + if (scope instanceof Class) { + Class<?> classScope = (Class<?>)scope; + ParameterizedType result = findGenericDeclaration(declaration, classScope.getGenericSuperclass()); + if (result == null) { + for (Type type : classScope.getGenericInterfaces()) { + result = findGenericDeclaration(declaration, type); + if (result != null) { + break; + } + } + } + return result; + } + return null; + } + public static Type getSuperType(Class<?> serviceClass, TypeVariable<?> var) { int pos = 0; - TypeVariable<?>[] vars = var.getGenericDeclaration().getTypeParameters(); + GenericDeclaration genericDeclaration = var.getGenericDeclaration(); + TypeVariable<?>[] vars = genericDeclaration.getTypeParameters(); for (; pos < vars.length; pos++) { if (vars[pos].getName().equals(var.getName())) { break; } } - Type genericSubtype = serviceClass.getGenericSuperclass(); - if (!(genericSubtype instanceof ParameterizedType)) { - Type[] genInterfaces = serviceClass.getGenericInterfaces(); - for (Type t : genInterfaces) { - genericSubtype = t; - break; - } + ParameterizedType genericSubtype = findGenericDeclaration(genericDeclaration, serviceClass); + Type result = null; + if (genericSubtype != null) { + result = genericSubtype.getActualTypeArguments()[pos]; } - if (!(genericSubtype instanceof ParameterizedType)) { - genericSubtype = null; + if (result instanceof TypeVariable) { + result = getSuperType(serviceClass, (TypeVariable<?>) result); } - Type result = InjectionUtils.getActualType(genericSubtype, pos); if (result == null || result == Object.class) { - Type[] bounds = var.getBounds(); - int boundPos = bounds.length > pos ? pos : 0; - if (bounds.length > boundPos && bounds[boundPos] != Object.class) { - result = bounds[boundPos]; + for (Type bound : var.getBounds()) { + if (bound != Object.class) { + result = bound; + break; + } } } return result; http://git-wip-us.apache.org/repos/asf/cxf/blob/d507e977/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java index 630e73f..c2751d0 100644 --- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java +++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/InjectionUtilsTest.java @@ -18,7 +18,10 @@ */ package org.apache.cxf.jaxrs.utils; +import java.io.Serializable; import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -42,6 +45,7 @@ import org.apache.cxf.message.ExchangeImpl; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageImpl; import org.easymock.EasyMock; + import org.junit.Assert; import org.junit.Test; @@ -145,6 +149,17 @@ public class InjectionUtilsTest extends Assert { assertEquals("Type is wrong", CarType.AUDI, carType); } + @Test + public void testGenericInterfaceType() throws NoSuchMethodException { + Type str = InjectionUtils.getGenericResponseType(GenericInterface.class.getMethod("get"), + TestService.class, "", String.class, new ExchangeImpl()); + assertEquals(String.class, str); + ParameterizedType list = (ParameterizedType) InjectionUtils.getGenericResponseType( + GenericInterface.class.getMethod("list"), TestService.class, + new ArrayList<String>(), ArrayList.class, new ExchangeImpl()); + assertEquals(String.class, list.getActualTypeArguments()[0]); + } + static class CustomerBean1 { private String a; private Long b; @@ -304,5 +319,21 @@ public class InjectionUtilsTest extends Assert { } } - + interface GenericInterface<A> { + A get(); + List<A> list(); + } + interface ServiceInterface extends Serializable, GenericInterface<String> { + } + public static class TestService implements Serializable, ServiceInterface { + private static final long serialVersionUID = 1L; + @Override + public String get() { + return ""; + } + @Override + public List<String> list() { + return new ArrayList<>(); + } + } } http://git-wip-us.apache.org/repos/asf/cxf/blob/d507e977/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java ---------------------------------------------------------------------- diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java index 768e6ec..d7a674b 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java @@ -44,7 +44,6 @@ import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; public class JAXRSClientServerResourceJacksonSpringProviderTest extends AbstractBusClientServerTestBase { @@ -190,7 +189,6 @@ public class JAXRSClientServerResourceJacksonSpringProviderTest extends Abstract } @Test - @Ignore public void testGetGenericSuperBookInt2() throws Exception { String endpointAddress =
