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 2009/09/09 13:45:14 UTC

svn commit: r812899 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/provider/

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<String, Object> headers) {
         String enc = mt.getParameters().get(CHARSET_PARAMETER);
         if (enc == null) {
@@ -535,6 +527,16 @@
         @SuppressWarnings("unchecked")
         public <T> Object getCollectionOrArray(Class<T> type, Class<?> origType) {
             List<?> theList = getList();
+            if (theList.size() > 0) {
+                Object first = theList.get(0);
+                if (first instanceof JAXBElement && !JAXBElement.class.isAssignableFrom(type)) {
+                    List<Object> newList = new ArrayList<Object>(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<org.apache.cxf.jaxrs.fortest.jaxb.SuperBook> 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<String, Object>(), bos);
+        String expected = "<ns1:SuperBooks xmlns:ns1=\"http://superbooks\">"
+            + "<ns1:SuperBook xmlns:ns2=\"http://books\" xmlns:ns1=\"http://superbooks\"><id>123</id>"
+            + "<name>CXF in Action</name><superId>124</superId></ns1:SuperBook></ns1:SuperBooks>";
+        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<org.apache.cxf.jaxrs.fortest.jaxb.SuperBook> 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<String, Object>(), bos);
+        String expected = "{\"ns1.SuperBooks\":[{\"id\":123,\"name\":\"CXF in Action\",\"superId\":124}]}";
+        assertEquals(expected, bos.toString());
+    }
     
     @SuppressWarnings("unchecked")
     @Test