Author: sergeyb
Date: Fri Aug  7 12:11:17 2009
New Revision: 801962

URL: http://svn.apache.org/viewvc?rev=801962&view=rev
Log:
JAXRS : updating JAXB provider to optionally handle JAXB classes without 
XMLRootElement

Added:
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
   (with props)
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
   (with props)
Modified:
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
    
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/fortest/jaxb/Book.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=801962&r1=801961&r2=801962&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
 Fri Aug  7 12:11:17 2009
@@ -304,9 +304,13 @@
             //result in a call to the server when we have already decided not 
to.
             //Throw an exception if we have one
             Exception ex = 
exchange.getOutMessage().getContent(Exception.class);
-            throw ex;
+            if (ex != null) {
+                throw ex; 
+            } else {
+                throw new RuntimeException("Unknown client side exception");
+            }
         } 
-        int status = responseCode.intValue(); //conn.getResponseCode();
+        int status = responseCode.intValue();
         responseBuilder = Response.status(status);
         for (Map.Entry<String, List<String>> entry : 
conn.getHeaderFields().entrySet()) {
             if (null == entry.getKey()) {

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=801962&r1=801961&r2=801962&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
 Fri Aug  7 12:11:17 2009
@@ -83,21 +83,38 @@
     private static Set<Class<?>> collectionContextClasses = new 
HashSet<Class<?>>();
     private static JAXBContext collectionContext; 
     
+    protected Map<String, String> jaxbElementClassMap;
+    protected boolean unmarshalAsJaxbElement;
+    
     private MessageContext mc;
     private Schema schema;
     private String collectionWrapperName;
     private Map<String, String> collectionWrapperMap;
     private List<String> jaxbElementClassNames;
     
+    public void setUnmarshallAsJaxbElement(boolean value) {
+        unmarshalAsJaxbElement = value;
+    }
+    
     public void setJaxbElementClassNames(List<String> names) {
         jaxbElementClassNames = names;
     }
+    
+    public void setJaxbElementClassMap(Map<String, String> map) {
+        jaxbElementClassMap = map;
+    }
 
     @SuppressWarnings("unchecked")
     protected Object convertToJaxbElementIfNeeded(Object obj, Class<?> cls, 
Type genericType) 
         throws Exception {
-        if (jaxbElementClassNames != null && 
jaxbElementClassNames.contains(cls.getName())) {
-            QName name = getJaxbQName(cls, genericType, obj, false);
+        if (jaxbElementClassNames != null && 
jaxbElementClassNames.contains(cls.getName()) 
+            || jaxbElementClassMap != null && 
jaxbElementClassMap.containsKey(cls.getName())) {
+            QName name = null;
+            if (jaxbElementClassMap != null) {
+                name = 
convertStringToQName(jaxbElementClassMap.get(cls.getName()));
+            } else {
+                name = getJaxbQName(cls, genericType, obj, false);
+            }
             if (name != null) {
                 return new JAXBElement(name, cls, null, obj);
             }
@@ -147,6 +164,10 @@
             return getJaxbQName(cls, type, object, pluralName);
         }
             
+        return convertStringToQName(name);
+    }
+    
+    private QName convertStringToQName(String name) {
         int ind1 = name.indexOf('{');
         if (ind1 != 0) {
             return new QName(name);

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=801962&r1=801961&r2=801962&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
 Fri Aug  7 12:11:17 2009
@@ -144,11 +144,16 @@
                 unmarshaller.setEventHandler(eventHandler);
             }
             Object response = null;
-            if (JAXBElement.class.isAssignableFrom(type)) {
+            if (JAXBElement.class.isAssignableFrom(type) 
+                || unmarshalAsJaxbElement 
+                || jaxbElementClassMap != null && 
jaxbElementClassMap.containsKey(theType.getName())) {
                 response = unmarshaller.unmarshal(new StreamSource(is), 
theType);
             } else {
                 response = doUnmarshal(unmarshaller, type, is, mt);
             }
+            if (response instanceof JAXBElement && 
!JAXBElement.class.isAssignableFrom(type)) {
+                response = ((JAXBElement)response).getValue();    
+            }
             if (isCollection) {
                 response = 
((CollectionWrapper)response).getCollectionOrArray(theType, type); 
             }

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=801962&r1=801961&r2=801962&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
 Fri Aug  7 12:11:17 2009
@@ -150,11 +150,16 @@
             XMLStreamReader xsw = createReader(type, realStream);
             
             Object response = null;
-            if (JAXBElement.class.isAssignableFrom(type)) {
+            if (JAXBElement.class.isAssignableFrom(type) 
+                || unmarshalAsJaxbElement
+                || jaxbElementClassMap != null && 
jaxbElementClassMap.containsKey(theType.getName())) {
                 response = unmarshaller.unmarshal(xsw, theType);
             } else {
                 response = unmarshaller.unmarshal(xsw);
             }
+            if (response instanceof JAXBElement && 
!JAXBElement.class.isAssignableFrom(type)) {
+                response = ((JAXBElement)response).getValue();    
+            }
             response = checkAdapter(response, anns, false);
             return response;
             

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java?rev=801962&r1=801961&r2=801962&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java
 Fri Aug  7 12:11:17 2009
@@ -19,11 +19,18 @@
 
 package org.apache.cxf.jaxrs.fortest.jaxb;
 
+import javax.xml.bind.annotation.XmlSeeAlso;
 
+...@xmlseealso({SuperBook.class })
 public class Book {
     private String name;
     private long id;
     
+    public Book(String name, long id) {
+        this.name = name;
+        this.id = id;
+    }
+    
     public Book() {
     }
     

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java?rev=801962&r1=801961&r2=801962&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
 Fri Aug  7 12:11:17 2009
@@ -18,9 +18,29 @@
  */
 package org.apache.cxf.jaxrs.fortest.jaxb;
 
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
 
+...@xmlregistry
 public class ObjectFactory {
+    private static final QName SUPERBOOK2_QNAME = new QName("http://books";, 
"SuperBook2");
+    
     public Book createBook() {
         return new Book();
     }
+    
+    public SuperBook createSuperBook() {
+        return new SuperBook();
+    }
+    
+    public SuperBook2 createSuperBook2() {
+        return new SuperBook2();
+    }
+    
+    @XmlElementDecl(namespace = "http://books";, name = "SuperBook2")
+    public JAXBElement<SuperBook2> createExactlyOne(SuperBook2 value) {
+        return new JAXBElement<SuperBook2>(SUPERBOOK2_QNAME, SuperBook2.class, 
null, value);
+    }
 }

Added: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java?rev=801962&view=auto
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
 (added)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
 Fri Aug  7 12:11:17 2009
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.jaxrs.fortest.jaxb;
+
+
+public class SuperBook extends Book {
+    private long superId;
+    public SuperBook() {
+    }
+    
+    public SuperBook(String name, long id, long superId) {
+        super(name, id);
+        this.superId = superId;
+    }
+    
+    public void setSuperId(long i) {
+        superId = i;
+    }
+    
+    public long getSuperId() {
+        return superId;
+    }
+}

Propchange: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java?rev=801962&view=auto
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
 (added)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
 Fri Aug  7 12:11:17 2009
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.jaxrs.fortest.jaxb;
+
+
+public class SuperBook2 extends Book {
+    private long superId;
+    public SuperBook2() {
+    }
+    
+    public SuperBook2(String name, long id, long superId) {
+        super(name, id);
+        this.superId = superId;
+    }
+    
+    public void setSuperId(long i) {
+        superId = i;
+    }
+    
+    public long getSuperId() {
+        return superId;
+    }
+}

Propchange: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

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=801962&r1=801961&r2=801962&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
 Fri Aug  7 12:11:17 2009
@@ -159,7 +159,7 @@
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         provider.writeTo(b, Book.class, Book.class,
                        new Annotation[0], MediaType.TEXT_XML_TYPE, new 
MetadataMap<String, Object>(), bos);
-        readSuperBook(bos.toString());
+        readSuperBook(bos.toString(), true);
     }
     
     @Test
@@ -171,11 +171,87 @@
         provider.writeTo(b, Book.class, Book.class,
                        new Annotation[0], MediaType.TEXT_XML_TYPE, new 
MetadataMap<String, Object>(), bos);
         
-        readSuperBook(bos.toString());
+        readSuperBook(bos.toString(), false);
+    }
+    
+    @Test
+    public void testWriteWithoutXmlRootElement() throws Exception {
+        doTestWriteWithoutXmlRootElement("SuperBook", false);
+    }
+    
+    @Test
+    public void testWriteWithoutXmlRootElement2() throws Exception {
+        doTestWriteWithoutXmlRootElement("SuperBook", true);
+    }
+    
+    @Test
+    public void testWriteWithoutXmlRootElement3() throws Exception {
+        doTestWriteWithoutXmlRootElement("{http://books}SuperBook";, false);
+    }
+    
+    public void doTestWriteWithoutXmlRootElement(String name, boolean 
unmarshalAsJaxbElement) 
+        throws Exception {
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setJaxbElementClassMap(Collections.singletonMap(
+            org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class.getName(), 
+            name));
+        org.apache.cxf.jaxrs.fortest.jaxb.SuperBook b = 
+            new org.apache.cxf.jaxrs.fortest.jaxb.SuperBook("CXF in Action", 
123L, 124L);
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        provider.writeTo(b, org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class, 
+                         org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class,
+                         new Annotation[0], MediaType.TEXT_XML_TYPE, 
+                         new MetadataMap<String, Object>(), bos);
+        readSuperBook2(bos.toString(), unmarshalAsJaxbElement);
+    }
+    
+    @Test
+    public void testWriteWithoutXmlRootElementDerived() throws Exception {
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setJaxbElementClassMap(Collections.singletonMap(
+            org.apache.cxf.jaxrs.fortest.jaxb.Book.class.getName(), "Book"));
+        org.apache.cxf.jaxrs.fortest.jaxb.Book b = 
+            new org.apache.cxf.jaxrs.fortest.jaxb.SuperBook("CXF in Action", 
123L, 124L);
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        provider.writeTo(b, org.apache.cxf.jaxrs.fortest.jaxb.Book.class, 
+                         org.apache.cxf.jaxrs.fortest.jaxb.Book.class,
+                         new Annotation[0], MediaType.TEXT_XML_TYPE, 
+                         new MetadataMap<String, Object>(), bos);
+        readSuperBook2(bos.toString(), false);
+    }
+    
+    @Test
+    @SuppressWarnings("unchecked")
+    public void testWriteWithoutXmlRootElementObjectFactory() throws Exception 
{
+        JAXBElementProvider provider = new JAXBElementProvider();
+        provider.setJaxbElementClassMap(Collections.singletonMap(
+            org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2.class.getName(), 
+            "{http://books}SuperBook2";));
+        org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2 b = 
+            new org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2("CXF in Action", 
123L, 124L);
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        provider.writeTo(b, 
org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2.class, 
+                         org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2.class,
+                         new Annotation[0], MediaType.TEXT_XML_TYPE, 
+                         new MetadataMap<String, Object>(), bos);
+        JAXBElementProvider provider2 = new JAXBElementProvider();
+        ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
+        org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2 book = 
+            (org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2)provider2.readFrom(
+                       
(Class)org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2.class, 
+                       org.apache.cxf.jaxrs.fortest.jaxb.SuperBook2.class,
+                       new Annotation[0], MediaType.TEXT_XML_TYPE, new 
MetadataMap<String, String>(), is);
+        assertEquals(124L, book.getSuperId());
     }
     
     @SuppressWarnings("unchecked")
-    private void readSuperBook(String data) throws Exception {
+    private void readSuperBook(String data, boolean xsiTypeExpected) throws 
Exception {
+        if (xsiTypeExpected) {
+            assertTrue(data.contains("xsi:type"));
+        }
         JAXBElementProvider provider = new JAXBElementProvider();
         ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());
         SuperBook book = (SuperBook)provider.readFrom(
@@ -184,6 +260,24 @@
         assertEquals(124L, book.getSuperId());
     }
     
+    @SuppressWarnings("unchecked")
+    private void readSuperBook2(String data, boolean unmarshalAsJaxbElement) 
throws Exception {
+        JAXBElementProvider provider = new JAXBElementProvider();
+        if (!unmarshalAsJaxbElement) {
+            provider.setJaxbElementClassMap(Collections.singletonMap(
+                org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class.getName(), 
"SuperBook"));
+        } else {
+            provider.setUnmarshallAsJaxbElement(true);
+        }
+        ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());
+        org.apache.cxf.jaxrs.fortest.jaxb.SuperBook book = 
+            (org.apache.cxf.jaxrs.fortest.jaxb.SuperBook)provider.readFrom(
+                       
(Class)org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class, 
+                       org.apache.cxf.jaxrs.fortest.jaxb.SuperBook.class,
+                       new Annotation[0], MediaType.TEXT_XML_TYPE, new 
MetadataMap<String, String>(), is);
+        assertEquals(124L, book.getSuperId());
+    }
+    
     private void doTestWriteJAXBCollection(String mName) throws Exception {
         JAXBElementProvider provider = new JAXBElementProvider();
         List<JAXBElement<Book>> books = new ArrayList<JAXBElement<Book>>();


Reply via email to