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 2011/03/10 14:59:37 UTC

svn commit: r1080228 - in /cxf/branches/2.3.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java

Author: sergeyb
Date: Thu Mar 10 13:59:36 2011
New Revision: 1080228

URL: http://svn.apache.org/viewvc?rev=1080228&view=rev
Log:
Merged revisions 1080225 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1080225 | sergeyb | 2011-03-10 13:56:38 +0000 (Thu, 10 Mar 2011) | 1 line
  
  [CXF-3391] Better support for extra JAXB classes
........

Modified:
    cxf/branches/2.3.x-fixes/   (props changed)
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Mar 10 13:59:36 2011
@@ -1 +1 @@
-/cxf/trunk:1079780
+/cxf/trunk:1079780,1080225

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1080228&r1=1080227&r2=1080228&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Thu Mar 10 13:59:36 2011
@@ -385,7 +385,16 @@ public abstract class AbstractJAXBProvid
         synchronized (classContexts) {
             JAXBContext context = classContexts.get(type);
             if (context == null) {
-                context = JAXBContext.newInstance(new Class[]{type}, cProperties);
+                Class[] classes = null;
+                if (extraClass != null) {
+                    classes = new Class[extraClass.length + 1];
+                    classes[0] = type;
+                    System.arraycopy(extraClass, 0, classes, 1, extraClass.length);
+                } else {
+                    classes = new Class[] {type};    
+                }
+                
+                context = JAXBContext.newInstance(classes, cProperties);
                 classContexts.put(type, context);
             }
             return context;

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=1080228&r1=1080227&r2=1080228&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Thu Mar 10 13:59:36 2011
@@ -50,6 +50,7 @@ import javax.xml.bind.ValidationEventHan
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.bind.attachment.AttachmentMarshaller;
 import javax.xml.namespace.QName;
@@ -110,6 +111,66 @@ public class JAXBElementProviderTest ext
     }
     
     @Test
+    public void testExtraClassWithoutSingleContext() throws Exception {
+        ClassResourceInfo cri = 
+            ResourceUtils.createClassResourceInfo(BookStore.class, BookStore.class, true, true);
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setExtraClass(new Class[]{SuperBook.class});
+        provider.init(Collections.singletonList(cri));
+        JAXBContext bookContext = provider.getJAXBContext(Book.class, Book.class);
+        
+        ByteArrayOutputStream os = new ByteArrayOutputStream(); 
+        bookContext.createMarshaller().marshal(new SuperBook("name", 1L, 2L), os);
+        SuperBook book = (SuperBook)bookContext.createUnmarshaller()
+                             .unmarshal(new ByteArrayInputStream(os.toByteArray()));
+        assertEquals(2L, book.getSuperId());        
+    }
+    
+    @Test
+    public void testExtraClassWithGenerics() throws Exception {
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setExtraClass(new Class[]{XmlObject.class});
+        testXmlList(provider);
+    }
+    
+    @Test
+    public void testExtraClassWithGenericsAndSingleContext() throws Exception {
+        ClassResourceInfo cri = 
+            ResourceUtils.createClassResourceInfo(XmlListResource.class, XmlListResource.class, true, true);
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setExtraClass(new Class[]{XmlObject.class});
+        provider.init(Collections.singletonList(cri));
+        testXmlList(provider);
+        
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void testXmlList(JAXBElementProvider provider) throws Exception {
+        
+        List<XmlObject> list = new ArrayList<XmlObject>();
+        for (int i = 0; i < 10; i++) {
+            MyObject o = new MyObject();
+            o.setName("name #" + i);
+            list.add(new XmlObject(o));
+        }
+        XmlList<XmlObject> xmlList = new XmlList<XmlObject>(list);
+        
+        JAXBContext context = provider.getJAXBContext(XmlList.class, XmlList.class);
+        
+        ByteArrayOutputStream os = new ByteArrayOutputStream(); 
+        context.createMarshaller().marshal(xmlList, os);
+        XmlList<XmlObject> list2 = (XmlList<XmlObject>)context.createUnmarshaller()
+            .unmarshal(new ByteArrayInputStream(os.toByteArray()));
+        
+        List<XmlObject> actualList = list2.getList();
+        assertEquals(10, actualList.size());
+        for (int i = 0; i < 10; i++) {
+            XmlObject object = actualList.get(i);
+            assertEquals("name #" + i, object.getAttribute().getName());
+        }
+    }
+    
+    @Test
     public void testIsWriteableList() throws Exception {
         testIsWriteableCollection("getBooks");
     }
@@ -1144,4 +1205,69 @@ public class JAXBElementProviderTest ext
             return null;
         }
     }
+    
+    @XmlRootElement(name = "list")
+    public static class XmlList<A> {
+        private List<A> list;
+
+        public XmlList() {
+            // no-op
+        }
+
+        public XmlList(List<A> l) {
+            list = l;
+        }
+
+        public List<A> getList() {
+            return list;
+        }
+
+        public void setList(List<A> l) {
+            list = l;
+        }
+    }
+
+    @XmlType
+    public static class XmlObject {
+        private MyObject attribute;
+
+        public XmlObject() {
+            // no-op
+        }
+
+        public XmlObject(MyObject a) {
+            attribute = a;
+        }
+
+        @XmlElement(name = "attribute")
+        public MyObject getAttribute() {
+            return attribute;
+        }
+
+        public void setAttribute(MyObject a) {
+            attribute = a;
+        }
+    }
+
+    public static class MyObject {
+        private String name;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String n) {
+            name = n;
+        }
+    }
+
+    
+    @Path("/test")
+    public class XmlListResource {
+        @GET
+        @Path("/jaxb")
+        public XmlList<XmlObject> testJaxb() {
+            return null;
+        }
+    }
 }