Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 007CB17CC9 for ; Tue, 28 Oct 2014 16:55:57 +0000 (UTC) Received: (qmail 28232 invoked by uid 500); 28 Oct 2014 16:55:56 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 28173 invoked by uid 500); 28 Oct 2014 16:55:56 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 28164 invoked by uid 99); 28 Oct 2014 16:55:56 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 28 Oct 2014 16:55:56 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 8D2ED996366; Tue, 28 Oct 2014 16:55:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sergeyb@apache.org To: commits@cxf.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: git commit: [CXF-6067] Fixing ProviderFactory code checking the generic types Date: Tue, 28 Oct 2014 16:55:56 +0000 (UTC) Repository: cxf Updated Branches: refs/heads/3.0.x-fixes c9e85e762 -> 02a7533c9 [CXF-6067] Fixing ProviderFactory code checking the generic types Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/02a7533c Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/02a7533c Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/02a7533c Branch: refs/heads/3.0.x-fixes Commit: 02a7533c91c1e3a0ecc1366b136c2ee6e40ebf52 Parents: c9e85e7 Author: Sergey Beryozkin Authored: Tue Oct 28 16:52:00 2014 +0000 Committer: Sergey Beryozkin Committed: Tue Oct 28 16:53:23 2014 +0000 ---------------------------------------------------------------------- .../cxf/jaxrs/provider/ProviderFactory.java | 10 +-- .../cxf/jaxrs/provider/ProviderFactoryTest.java | 76 ++++++++++++++++++++ 2 files changed, 81 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/02a7533c/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java index e86f93b..e38bdb4 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java @@ -959,11 +959,11 @@ public abstract class ProviderFactory { protected static int compareClasses(Class expectedCls, Object o1, Object o2) { Class cl1 = ClassHelper.getRealClass(o1); Class cl2 = ClassHelper.getRealClass(o2); - Type[] types1 = getGenericInterfaces(cl1, expectedCls); Type[] types2 = getGenericInterfaces(cl2, expectedCls); - - if (types1.length == 0 && types2.length > 0) { + if (types1.length == 0 && types2.length == 0) { + return 0; + } else if (types1.length == 0 && types2.length > 0) { return 1; } else if (types1.length > 0 && types2.length == 0) { return -1; @@ -989,9 +989,9 @@ public abstract class ProviderFactory { Type genericSuperType = cls.getGenericSuperclass(); if (genericSuperType instanceof ParameterizedType) { Class actualType = InjectionUtils.getActualType(genericSuperType); - if (expectedClass == actualType) { + if (actualType != null && actualType.isAssignableFrom(expectedClass)) { return new Type[]{genericSuperType}; - } else if (actualType != null && expectedClass.isAssignableFrom(actualType)) { + } else if (expectedClass.isAssignableFrom(actualType)) { return new Type[]{}; } } http://git-wip-us.apache.org/repos/asf/cxf/blob/02a7533c/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java index b142814..1268538 100644 --- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java +++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java @@ -817,4 +817,80 @@ public class ProviderFactoryTest extends Assert { return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); } } + + @Test + public void testBadCustomExceptionMappersHierarchyWithGenerics() throws Exception { + ServerProviderFactory pf = ServerProviderFactory.getInstance(); + BadExceptionMapperA badExceptionMapperA = new BadExceptionMapperA(); + pf.registerUserProvider(badExceptionMapperA); + BadExceptionMapperB badExceptionMapperB = new BadExceptionMapperB(); + pf.registerUserProvider(badExceptionMapperB); + Object mapperResponse1 = pf.createExceptionMapper(RuntimeExceptionA.class, new MessageImpl()); + assertSame(badExceptionMapperA, mapperResponse1); + Object mapperResponse2 = pf.createExceptionMapper(RuntimeExceptionB.class, new MessageImpl()); + assertSame(badExceptionMapperB, mapperResponse2); + Object mapperResponse3 = pf.createExceptionMapper(RuntimeExceptionAA.class, new MessageImpl()); + assertSame(badExceptionMapperA, mapperResponse3); + Object mapperResponse4 = pf.createExceptionMapper(RuntimeExceptionBB.class, new MessageImpl()); + assertSame(badExceptionMapperB, mapperResponse4); + } + + @Test + public void testGoodExceptionMappersHierarchyWithGenerics() throws Exception { + ServerProviderFactory pf = ServerProviderFactory.getInstance(); + GoodRuntimeExceptionAMapper runtimeExceptionAMapper = new GoodRuntimeExceptionAMapper(); + pf.registerUserProvider(runtimeExceptionAMapper); + GoodRuntimeExceptionBMapper runtimeExceptionBMapper = new GoodRuntimeExceptionBMapper(); + pf.registerUserProvider(runtimeExceptionBMapper); + Object mapperResponse1 = pf.createExceptionMapper(RuntimeExceptionA.class, new MessageImpl()); + assertSame(runtimeExceptionAMapper, mapperResponse1); + Object mapperResponse2 = pf.createExceptionMapper(RuntimeExceptionB.class, new MessageImpl()); + assertSame(runtimeExceptionBMapper, mapperResponse2); + Object mapperResponse3 = pf.createExceptionMapper(RuntimeExceptionAA.class, new MessageImpl()); + assertSame(runtimeExceptionAMapper, mapperResponse3); + Object mapperResponse4 = pf.createExceptionMapper(RuntimeExceptionBB.class, new MessageImpl()); + assertSame(runtimeExceptionBMapper, mapperResponse4); + } + private static class RuntimeExceptionA extends RuntimeException { + private static final long serialVersionUID = 1L; + } + private static class RuntimeExceptionAA extends RuntimeExceptionA { + private static final long serialVersionUID = 1L; + } + private static class RuntimeExceptionB extends RuntimeException { + private static final long serialVersionUID = 1L; + } + private static class RuntimeExceptionBB extends RuntimeExceptionB { + private static final long serialVersionUID = 1L; + } + private static class GoodRuntimeExceptionAMapper implements ExceptionMapper { + + @Override + public Response toResponse(RuntimeExceptionA exception) { + return null; + } + } + private static class GoodRuntimeExceptionBMapper implements ExceptionMapper { + + @Override + public Response toResponse(RuntimeExceptionB exception) { + return null; + } + } + public abstract static class BadParentExceptionMapper implements ExceptionMapper { + } + public static class BadExceptionMapperA extends BadParentExceptionMapper { + + @Override + public Response toResponse(RuntimeExceptionA exception) { + return null; + } + } + public static class BadExceptionMapperB extends BadParentExceptionMapper { + + @Override + public Response toResponse(RuntimeExceptionB exception) { + return null; + } + } }