You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/08/13 19:45:56 UTC
svn commit: r803958 - in /cxf/branches/2.2.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ rt/fro...
Author: dkulp
Date: Thu Aug 13 17:45:53 2009
New Revision: 803958
URL: http://svn.apache.org/viewvc?rev=803958&view=rev
Log:
Merged revisions 801962 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r801962 | sergeyb | 2009-08-07 08:11:17 -0400 (Fri, 07 Aug 2009) | 1 line
JAXRS : updating JAXB provider to optionally handle JAXB classes without XMLRootElement
........
Added:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
- copied unchanged from r801962, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
- copied unchanged from r801962, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/SuperBook2.java
Modified:
cxf/branches/2.2.x-fixes/ (props changed)
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug 13 17:45:53 2009
@@ -1 +1 @@
-/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788752,788774,788819-788820,789013,789371,789387,789420,789527-789530,789704-789705,789788,789811,789896-789901,790074,790094,790134,790188,790294,790553,790637-790644,790868,791301,791354,791538,791753,791947,792007,792096,792183,792261-792265,792271,792604,792683-792685,792975,792985,793059,793570,794297,794396,794680,794728,794771,794778-794780,794892,795044,795104,795160,795583,795907,796022-796023,796352,796593,796741,796780,796994-796997,797117,797159,797192,797194,797231-797233,797442,797505,797517,797534,797581-797583,797587,797640,797651,797699,797882-797883,798344-798346,798363,798461,798479,798533,798551,798557,798561-798562,798570,798573,79858
4,798654,798748-798749,798891,798929-798930,799245,799267,799439,799448,799637,799723-799724,799792,800453,800497-800498,801380-801381,801447
+/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788752,788774,788819-788820,789013,789371,789387,789420,789527-789530,789704-789705,789788,789811,789896-789901,790074,790094,790134,790188,790294,790553,790637-790644,790868,791301,791354,791538,791753,791947,792007,792096,792183,792261-792265,792271,792604,792683-792685,792975,792985,793059,793570,794297,794396,794680,794728,794771,794778-794780,794892,795044,795104,795160,795583,795907,796022-796023,796352,796593,796741,796780,796994-796997,797117,797159,797192,797194,797231-797233,797442,797505,797517,797534,797581-797583,797587,797640,797651,797699,797882-797883,798344-798346,798363,798461,798479,798533,798551,798557,798561-798562,798570,798573,79858
4,798654,798748-798749,798891,798929-798930,799245,799267,799439,799448,799637,799723-799724,799792,800453,800497-800498,801380-801381,801447,801962
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Thu Aug 13 17:45:53 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Thu Aug 13 17:45:53 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Thu Aug 13 17:45:53 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java Thu Aug 13 17:45:53 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/Book.java Thu Aug 13 17:45:53 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/ObjectFactory.java Thu Aug 13 17:45:53 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);
+ }
}
Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=803958&r1=803957&r2=803958&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Thu Aug 13 17:45:53 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>>();