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