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>>();