Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 61803 invoked from network); 9 Sep 2009 11:45:39 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 9 Sep 2009 11:45:39 -0000 Received: (qmail 77767 invoked by uid 500); 9 Sep 2009 11:45:39 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 77654 invoked by uid 500); 9 Sep 2009 11:45:39 -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 77645 invoked by uid 99); 9 Sep 2009 11:45:39 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Sep 2009 11:45:39 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Sep 2009 11:45:35 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4ABBE23888DB; Wed, 9 Sep 2009 11:45:14 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r812899 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/provider/ Date: Wed, 09 Sep 2009 11:45:14 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090909114514.4ABBE23888DB@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Wed Sep 9 11:45:13 2009 New Revision: 812899 URL: http://svn.apache.org/viewvc?rev=812899&view=rev Log: JAXRS : support for writing explicit collections with members having no XmlRootElement Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=812899&r1=812898&r2=812899&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Wed Sep 9 11:45:13 2009 @@ -389,15 +389,13 @@ return unmarshaller; } - protected Marshaller createMarshaller(Object obj, Class cls, Type genericType, String enc, - boolean isCollection) + protected Marshaller createMarshaller(Object obj, Class cls, Type genericType, String enc) throws JAXBException { Class objClazz = JAXBElement.class.isAssignableFrom(cls) ? ((JAXBElement)obj).getDeclaredType() : cls; - JAXBContext context = isCollection ? getCollectionContext(objClazz) - : getJAXBContext(objClazz, genericType); + JAXBContext context = getJAXBContext(objClazz, genericType); Marshaller marshaller = context.createMarshaller(); if (enc != null) { marshaller.setProperty(Marshaller.JAXB_ENCODING, enc); @@ -405,12 +403,6 @@ return marshaller; } - protected Marshaller createMarshaller(Object obj, Class cls, Type genericType, String enc) - throws JAXBException { - - return createMarshaller(obj, cls, genericType, enc, false); - } - protected String getEncoding(MediaType mt, MultivaluedMap headers) { String enc = mt.getParameters().get(CHARSET_PARAMETER); if (enc == null) { @@ -535,6 +527,16 @@ @SuppressWarnings("unchecked") public Object getCollectionOrArray(Class type, Class origType) { List theList = getList(); + if (theList.size() > 0) { + Object first = theList.get(0); + if (first instanceof JAXBElement && !JAXBElement.class.isAssignableFrom(type)) { + List newList = new ArrayList(theList.size()); + for (Object o : theList) { + newList.add(((JAXBElement)o).getValue()); + } + theList = newList; + } + } if (origType.isArray()) { T[] values = (T[])Array.newInstance(type, theList.size()); for (int i = 0; i < theList.size(); i++) { Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=812899&r1=812898&r2=812899&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Wed Sep 9 11:45:13 2009 @@ -266,6 +266,10 @@ protected void marshalCollectionMember(Object obj, Class cls, Type genericType, String enc, OutputStream os, MediaType mt, String ns) throws Exception { + obj = convertToJaxbElementIfNeeded(obj, cls, genericType); + if (obj instanceof JAXBElement && cls != JAXBElement.class) { + cls = JAXBElement.class; + } Marshaller ms = createMarshaller(obj, cls, genericType, enc); ms.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); if (ns.length() > 0) { Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java?rev=812899&r1=812898&r2=812899&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java Wed Sep 9 11:45:13 2009 @@ -289,8 +289,13 @@ os.write(startTag.getBytes()); Object[] arr = originalCls.isArray() ? (Object[])actualObject : ((Collection)actualObject).toArray(); for (int i = 0; i < arr.length; i++) { - Marshaller ms = createMarshaller(actualObject, actualClass, genericType, encoding); - marshal(ms, arr[i], actualClass, genericType, encoding, os, true); + Object obj = convertToJaxbElementIfNeeded(arr[i], actualClass, genericType); + Class cls = actualClass; + if (obj instanceof JAXBElement && actualClass != JAXBElement.class) { + cls = JAXBElement.class; + } + Marshaller ms = createMarshaller(obj, cls, genericType, encoding); + marshal(ms, obj, cls, genericType, encoding, os, true); if (i + 1 < arr.length) { os.write(",".getBytes()); } Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=812899&r1=812898&r2=812899&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Wed Sep 9 11:45:13 2009 @@ -217,6 +217,31 @@ } @Test + public void testWriteCollectionWithoutXmlRootElement() + throws Exception { + JAXBElementProvider provider = new JAXBElementProvider(); + provider.setCollectionWrapperName("{http://superbooks}SuperBooks"); + provider.setJaxbElementClassMap(Collections.singletonMap( + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class.getName(), + "{http://superbooks}SuperBook")); + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook b = + new org.apache.cxf.jaxrs.fortest.jaxb.SuperBook("CXF in Action", 123L, 124L); + List books = + Collections.singletonList(b); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + provider.writeTo(books, List.class, + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class, + new Annotation[0], MediaType.TEXT_XML_TYPE, + new MetadataMap(), bos); + String expected = "" + + "123" + + "CXF in Action124"; + assertEquals(expected, bos.toString()); + } + + + @Test public void testWriteWithoutXmlRootElementDerived() throws Exception { JAXBElementProvider provider = new JAXBElementProvider(); provider.setJaxbElementClassMap(Collections.singletonMap( Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java?rev=812899&r1=812898&r2=812899&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java Wed Sep 9 11:45:13 2009 @@ -56,6 +56,27 @@ public class JSONProviderTest extends Assert { + @Test + public void testWriteCollectionWithoutXmlRootElement() + throws Exception { + JSONProvider provider = new JSONProvider(); + provider.setCollectionWrapperName("{http://superbooks}SuperBooks"); + provider.setJaxbElementClassMap(Collections.singletonMap( + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class.getName(), + "{http://superbooks}SuperBook")); + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook b = + new org.apache.cxf.jaxrs.fortest.jaxb.SuperBook("CXF in Action", 123L, 124L); + List books = + Collections.singletonList(b); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + provider.writeTo(books, List.class, + org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class, + new Annotation[0], MediaType.APPLICATION_JSON_TYPE, + new MetadataMap(), bos); + String expected = "{\"ns1.SuperBooks\":[{\"id\":123,\"name\":\"CXF in Action\",\"superId\":124}]}"; + assertEquals(expected, bos.toString()); + } @SuppressWarnings("unchecked") @Test