Author: sergeyb Date: Tue Jun 19 09:56:42 2012 New Revision: 1351629 URL: http://svn.apache.org/viewvc?rev=1351629&view=rev Log: Merged revisions 1351628 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.6.x-fixes
................ r1351628 | sergeyb | 2012-06-19 10:53:23 +0100 (Tue, 19 Jun 2012) | 9 lines Merged revisions 1351626 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1351626 | sergeyb | 2012-06-19 10:49:55 +0100 (Tue, 19 Jun 2012) | 1 line [CXF-4359] Adding Types to a single JAXBContext ........ ................ Modified: cxf/branches/2.5.x-fixes/ (props changed) cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1351626 Merged /cxf/branches/2.6.x-fixes:r1351628 Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=1351629&r1=1351628&r2=1351629&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java Tue Jun 19 09:56:42 2012 @@ -473,25 +473,28 @@ public final class ResourceUtils { private static void getAllTypesForResource(ClassResourceInfo resource, Map<Class<?>, Type> types, boolean jaxbOnly) { for (OperationResourceInfo ori : resource.getMethodDispatcher().getOperationResourceInfos()) { - Class<?> cls = ori.getMethodToInvoke().getReturnType(); + Class<?> realReturnType = ori.getMethodToInvoke().getReturnType(); + Class<?> cls = realReturnType; if (cls == Response.class) { cls = getActualJaxbType(cls, ori.getMethodToInvoke(), false); } + Type type = ori.getMethodToInvoke().getGenericReturnType(); if (jaxbOnly) { - checkJaxbType(cls, types); + checkJaxbType(cls, realReturnType == Response.class ? cls : type, types); } else { - Type type = ori.getMethodToInvoke().getGenericReturnType(); types.put(cls, type); } + for (Parameter pm : ori.getParameters()) { if (pm.getType() == ParameterType.REQUEST_BODY) { Class<?> inType = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()]; + Type paramType = ori.getMethodToInvoke().getGenericParameterTypes()[pm.getIndex()]; if (jaxbOnly) { - checkJaxbType(inType, types); + checkJaxbType(inType, paramType, types); } else { - Type type = ori.getMethodToInvoke().getGenericParameterTypes()[pm.getIndex()]; - types.put(inType, type); + types.put(inType, paramType); } + } } @@ -504,13 +507,20 @@ public final class ResourceUtils { } } - private static void checkJaxbType(Class<?> type, Map<Class<?>, Type> types) { + private static void checkJaxbType(Class<?> type, Type genericType, Map<Class<?>, Type> types) { JAXBElementProvider provider = new JAXBElementProvider(); - if (!InjectionUtils.isPrimitive(type) + if (type != null + && !InjectionUtils.isPrimitive(type) && !JAXBElement.class.isAssignableFrom(type) && provider.isReadable(type, type, new Annotation[0], MediaType.APPLICATION_XML_TYPE)) { types.put(type, type); - } + + Class<?> genCls = InjectionUtils.getActualType(genericType); + if (genCls != type && genCls instanceof Class && genCls != Object.class + && !InjectionUtils.isSupportedCollectionOrArray(genCls)) { + types.put(genCls, genCls); + } + } } private static UserResource getResourceFromElement(Element e) { Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=1351629&r1=1351628&r2=1351629&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Tue Jun 19 09:56:42 2012 @@ -187,12 +187,23 @@ public class JAXBElementProviderTest ext ClassResourceInfo cri = ResourceUtils.createClassResourceInfo(XmlListResource.class, XmlListResource.class, true, true); JAXBElementProvider provider = new JAXBElementProvider(); + provider.setSingleJaxbContext(true); provider.setExtraClass(new Class[]{XmlObject.class}); provider.init(Collections.singletonList(cri)); testXmlList(provider); } + @Test + public void testGenericsAndSingleContext() throws Exception { + ClassResourceInfo cri = + ResourceUtils.createClassResourceInfo(XmlListResource.class, XmlListResource.class, true, true); + JAXBElementProvider<?> provider = new JAXBElementProvider<Object>(); + provider.setSingleJaxbContext(true); + provider.init(Collections.singletonList(cri)); + testXmlList(provider); + } + @SuppressWarnings("unchecked") private void testXmlList(JAXBElementProvider provider) throws Exception { @@ -593,6 +604,34 @@ public class JAXBElementProviderTest ext doReadUnqualifiedCollection(bos.toString(), "setBooks", List.class); } + @SuppressWarnings({"rawtypes", "unchecked" }) + @Test + public void testReadJAXBElement() throws Exception { + String xml = "<Book><id>123</id><name>CXF in Action</name></Book>"; + JAXBElementProvider<JAXBElement> provider = new JAXBElementProvider<JAXBElement>(); + JAXBElement<Book> jaxbElement = provider.readFrom(JAXBElement.class, Book.class, + new Annotation[0], MediaType.TEXT_XML_TYPE, new MetadataMap<String, String>(), + new ByteArrayInputStream(xml.getBytes("UTF-8"))); + Book book = jaxbElement.getValue(); + assertEquals(123L, book.getId()); + assertEquals("CXF in Action", book.getName()); + + } + + @Test + @Ignore + public void testReadBookJAXBElement() throws Exception { + String xml = "<Book><id>123</id><name>CXF in Action</name></Book>"; + JAXBElementProvider<BookJAXBElement> provider = new JAXBElementProvider<BookJAXBElement>(); + BookJAXBElement jaxbElement = provider.readFrom(BookJAXBElement.class, BookJAXBElement.class, + new Annotation[0], MediaType.TEXT_XML_TYPE, new MetadataMap<String, String>(), + new ByteArrayInputStream(xml.getBytes("UTF-8"))); + Book book = jaxbElement.getValue(); + assertEquals(123L, book.getId()); + assertEquals("CXF in Action", book.getName()); + + } + @Test public void testWriteQualifiedCollection() throws Exception { JAXBElementProvider provider = new JAXBElementProvider(); @@ -1499,6 +1538,20 @@ public class JAXBElementProviderTest ext } } + public static class BookJAXBElement extends JAXBElement<Book> { + protected static final QName NAME = new QName("Book"); + + private static final long serialVersionUID = -7388721095437704766L; + + public BookJAXBElement(Book value) { + super(NAME, Book.class, null, value); + } + + public BookJAXBElement() { + super(NAME, Book.class, null, null); + } + } + private Message createMessage() { ProviderFactory factory = ProviderFactory.getInstance(); Message m = new MessageImpl();
