Author: sergeyb
Date: Thu Jul 23 16:04:25 2009
New Revision: 797124
URL: http://svn.apache.org/viewvc?rev=797124&view=rev
Log:
Merged revisions 797117 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r797117 | sergeyb | 2009-07-23 16:53:59 +0100 (Thu, 23 Jul 2009) | 1 line
JAXRS: adding AegisJSONProvider plus few more jaxb/json tests
........
Added:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java
- copied unchanged from r797117,
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java
- copied unchanged from r797117,
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book2.xml
- copied unchanged from r797117,
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book2.xml
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/provider/AbstractAegisProvider.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/AegisElementProvider.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/provider/AegisProviderTest.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java
cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_add_book_aegis.txt
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jul 23 16:04:25 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,796994-796997
+/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,796994-796997,797117
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/provider/AbstractAegisProvider.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java?rev=797124&r1=797123&r2=797124&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java
Thu Jul 23 16:04:25 2009
@@ -41,8 +41,18 @@
implements MessageBodyReader<Object>, MessageBodyWriter<Object> {
private static Map<Class<?>, AegisContext> classContexts = new
WeakHashMap<Class<?>, AegisContext>();
+ protected boolean writeXsiType = true;
+ protected boolean readXsiType = true;
+ @Context
+ protected ContextResolver<AegisContext> resolver;
- @Context protected ContextResolver<AegisContext> resolver;
+ public void setWriteXsiType(boolean write) {
+ writeXsiType = write;
+ }
+
+ public void setReadXsiType(boolean read) {
+ readXsiType = read;
+ }
public boolean isWriteable(Class<?> type, Type genericType, Annotation[]
anns, MediaType mt) {
return isSupported(type, genericType, anns);
@@ -94,8 +104,8 @@
AegisContext context = classContexts.get(type);
if (context == null) {
context = new AegisContext();
- context.setWriteXsiTypes(true); // needed, since we know no
element/type maps.
- context.setReadXsiTypes(true);
+ context.setWriteXsiTypes(writeXsiType);
+ context.setReadXsiTypes(readXsiType);
Set<Class<?>> rootClasses = new HashSet<Class<?>>();
rootClasses.add(type);
if (!(genericType instanceof Class)) {
@@ -119,4 +129,8 @@
protected boolean isSupported(Class<?> type, Type genericType,
Annotation[] annotations) {
return true;
}
+
+ void clearContexts() {
+ classContexts.clear();
+ }
}
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=797124&r1=797123&r2=797124&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 Jul 23 16:04:25 2009
@@ -87,6 +87,23 @@
private Schema schema;
private String collectionWrapperName;
private Map<String, String> collectionWrapperMap;
+ private List<String> jaxbElementClassNames;
+
+ public void setJaxbElementClassNames(List<String> names) {
+ jaxbElementClassNames = names;
+ }
+
+ @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 (name != null) {
+ return new JAXBElement(name, cls, null, obj);
+ }
+ }
+ return obj;
+ }
public void setCollectionWrapperName(String wName) {
collectionWrapperName = wName;
Modified:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java?rev=797124&r1=797123&r2=797124&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java
Thu Jul 23 16:04:25 2009
@@ -44,21 +44,24 @@
@Provider
@Produces({"application/xml", "application/*+xml", "text/xml" })
@Consumes({"application/xml", "application/*+xml", "text/xml" })
-public final class AegisElementProvider extends AbstractAegisProvider {
+public class AegisElementProvider extends AbstractAegisProvider {
public Object readFrom(Class<Object> type, Type genericType, Annotation[]
annotations, MediaType m,
MultivaluedMap<String, String> headers, InputStream is)
throws IOException {
AegisContext context = getAegisContext(type, genericType);
AegisReader<XMLStreamReader> aegisReader =
context.createXMLStreamReader();
- XMLStreamReader xmlStreamReader = StaxUtils.createXMLStreamReader(is);
try {
+ XMLStreamReader xmlStreamReader = createStreamReader(type, is);
return aegisReader.read(xmlStreamReader);
} catch (Exception e) {
throw new WebApplicationException(e);
}
}
+ protected XMLStreamReader createStreamReader(Class<?> type, InputStream
is) throws Exception {
+ return StaxUtils.createXMLStreamReader(is);
+ }
public void writeTo(Object obj, Class<?> type, Type genericType,
Annotation[] anns,
MediaType m, MultivaluedMap<String, Object> headers, OutputStream os)
@@ -69,13 +72,19 @@
AegisContext context = getAegisContext(type, genericType);
org.apache.cxf.aegis.type.Type aegisType =
TypeUtil.getWriteTypeStandalone(context, obj, null);
AegisWriter<XMLStreamWriter> aegisWriter =
context.createXMLStreamWriter();
- XMLStreamWriter xmlStreamWriter = StaxUtils.createXMLStreamWriter(os);
try {
+ XMLStreamWriter xmlStreamWriter = createStreamWriter(type, os);
// use type qname as element qname?
+ xmlStreamWriter.writeStartDocument();
aegisWriter.write(obj, aegisType.getSchemaType(), false,
xmlStreamWriter, aegisType);
+ xmlStreamWriter.writeEndDocument();
xmlStreamWriter.close();
} catch (Exception e) {
throw new WebApplicationException(e);
}
}
+
+ protected XMLStreamWriter createStreamWriter(Class<?> type, OutputStream
os) throws Exception {
+ return StaxUtils.createXMLStreamWriter(os);
+ }
}
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=797124&r1=797123&r2=797124&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 Jul 23 16:04:25 2009
@@ -72,7 +72,6 @@
private Map<String, Object> mProperties = new HashMap<String, Object>();
private boolean enableStreaming;
private ValidationEventHandler eventHandler;
- private List<String> jaxbElementClassNames;
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[]
anns, MediaType mt) {
@@ -92,10 +91,6 @@
super.setContext(mc);
}
- public void setJaxbElementClassNames(List<String> names) {
- jaxbElementClassNames = names;
- }
-
public void setValidationHandler(ValidationEventHandler handler) {
eventHandler = handler;
}
@@ -282,15 +277,9 @@
protected void marshal(Object obj, Class<?> cls, Type genericType,
String enc, OutputStream os, MediaType mt) throws
Exception {
-
- if (jaxbElementClassNames != null &&
jaxbElementClassNames.contains(cls.getName())) {
- QName name = getJaxbQName(cls, genericType, obj, false);
- if (name != null) {
- @SuppressWarnings("unchecked")
- JAXBElement el = new JAXBElement(name, cls, null, obj);
- obj = el;
- cls = JAXBElement.class;
- }
+ obj = convertToJaxbElementIfNeeded(obj, cls, genericType);
+ if (obj instanceof JAXBElement && cls != JAXBElement.class) {
+ cls = JAXBElement.class;
}
Marshaller ms = createMarshaller(obj, cls, genericType, enc);
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=797124&r1=797123&r2=797124&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 Jul 23 16:04:25 2009
@@ -328,6 +328,12 @@
protected void marshal(Object actualObject, Class<?> actualClass,
Type genericType, String enc, OutputStream os)
throws Exception {
+
+ actualObject = convertToJaxbElementIfNeeded(actualObject, actualClass,
genericType);
+ if (actualObject instanceof JAXBElement && actualClass !=
JAXBElement.class) {
+ actualClass = JAXBElement.class;
+ }
+
Marshaller ms = createMarshaller(actualObject, actualClass,
genericType, enc);
marshal(ms, actualObject, actualClass, genericType, enc, os, false);
}
@@ -388,7 +394,10 @@
}
public void writeCharacters(String text) throws XMLStreamException {
- if (!lastWriteChars) {
+ if (!lastWriteChars || text.trim().length() > 0) {
+ if (lastWriteChars) {
+ text = text.trim();
+ }
super.writeCharacters(text);
lastWriteChars = true;
}
Modified:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java?rev=797124&r1=797123&r2=797124&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java
Thu Jul 23 16:04:25 2009
@@ -37,7 +37,8 @@
public class AegisProviderTest extends Assert {
private static final String SIMPLE_BEAN_XML
- = "<ns1:AegisTestBean
xmlns:ns1=\"http://fortest.jaxrs.cxf.apache.org\" "
+ = "<?xml version='1.0' encoding='UTF-8'?><ns1:AegisTestBean "
+ + "xmlns:ns1=\"http://fortest.jaxrs.cxf.apache.org\" "
+ "xmlns:ns2=\"http://www.w3.org/2001/XMLSchema-instance\"
ns2:type=\"ns1:AegisTestBean\">"
+
"<ns1:boolValue>true</ns1:boolValue><ns1:strValue>hovercraft</ns1:strValue>"
+ "</ns1:AegisTestBean>";
Modified:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java?rev=797124&r1=797123&r2=797124&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JSONProviderTest.java
Thu Jul 23 16:04:25 2009
@@ -44,6 +44,7 @@
import org.apache.cxf.jaxrs.resources.Book;
import org.apache.cxf.jaxrs.resources.CollectionsResource;
import org.apache.cxf.jaxrs.resources.ManyTags;
+import org.apache.cxf.jaxrs.resources.SuperBook;
import org.apache.cxf.jaxrs.resources.TagVO;
import org.apache.cxf.jaxrs.resources.TagVO2;
import org.apache.cxf.jaxrs.resources.Tags;
@@ -298,16 +299,24 @@
@Test
public void testWriteIgnoreMixedContent() throws Exception {
- doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125}}", true);
+ doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125}}",
+ true, "book.xml");
+ }
+
+ @Test
+ public void testWriteIgnoreMixedContent2() throws Exception {
+
doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125,\"$\":\"books\"}}",
+ true, "book2.xml");
}
@Test
public void testWriteMixedContent() throws Exception {
- doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125,\"$\":\"\\n
\\n\"}}", false);
+ doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125,\"$\":\"\\n
\\n\"}}",
+ false, "book.xml");
}
- private void doTestMixedContent(String data, boolean ignore) throws
Exception {
- InputStream is = getClass().getResourceAsStream("book.xml");
+ private void doTestMixedContent(String data, boolean ignore, String
fileName) throws Exception {
+ InputStream is = getClass().getResourceAsStream(fileName);
JAXBContext context = JAXBContext.newInstance(new Class[]{Books.class,
Book.class});
Unmarshaller um = context.createUnmarshaller();
JAXBElement jaxbEl = um.unmarshal(new StreamSource(is), Books.class);
@@ -322,6 +331,44 @@
}
@Test
+ public void testWriteListOfDerivedTypes() throws Exception {
+ JSONProvider p = new JSONProvider();
+ Map<String, String> namespaceMap = new HashMap<String, String>();
+ namespaceMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsins");
+ p.setNamespaceMap(namespaceMap);
+ Books2 books2 = new Books2();
+ books2.setBooks(Collections.singletonList(
+ new SuperBook("CXF Rocks", 123L, 124L)));
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+ p.writeTo(books2, (Class)Books2.class, Books2.class,
Books2.class.getAnnotations(),
+ MediaType.APPLICATION_JSON_TYPE, new MetadataMap<String,
Object>(), os);
+ String s = os.toString();
+ String data =
"{\"books2\":{\"books\":{\"@xsins.type\":\"superBook\",\"id\":123,"
+ + "\"name\":\"CXF Rocks\",\"superId\":124}}}";
+ assertEquals(data, s);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testReadListOfDerivedTypes() throws Exception {
+ JSONProvider p = new JSONProvider();
+ Map<String, String> namespaceMap = new HashMap<String, String>();
+ namespaceMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsins");
+ p.setNamespaceMap(namespaceMap);
+ String data =
"{\"books2\":{\"books\":{\"@xsins.type\":\"superBook\",\"id\":123,"
+ + "\"name\":\"CXF Rocks\",\"superId\":124}}}";
+ byte[] bytes = data.getBytes();
+ Object books2Object = p.readFrom((Class)Books2.class, null, null,
+ null, null, new
ByteArrayInputStream(bytes));
+ Books2 books = (Books2)books2Object;
+ List<? extends Book> list = books.getBooks();
+ assertEquals(1, list.size());
+ SuperBook book = (SuperBook)list.get(0);
+ assertEquals(124L, book.getSuperId());
+ }
+
+ @Test
public void testWriteToListWithManyValues() throws Exception {
JSONProvider p = new JSONProvider();
Tags tags = new Tags();
@@ -394,4 +441,17 @@
@XmlAnyElement(lax = true)
protected List<Object> books;
}
+
+ @XmlRootElement()
+ public static class Books2 {
+ protected List<? extends Book> books;
+
+ public void setBooks(List<? extends Book> list) {
+ books = list;
+ }
+
+ public List<? extends Book> getBooks() {
+ return books;
+ }
+ }
}
Modified:
cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_add_book_aegis.txt
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_add_book_aegis.txt?rev=797124&r1=797123&r2=797124&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_add_book_aegis.txt
(original)
+++
cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_add_book_aegis.txt
Thu Jul 23 16:04:25 2009
@@ -1 +1 @@
-<ns1:Book xmlns:ns1="http://jaxrs.systest.cxf.apache.org"
xmlns:ns2="http://www.w3.org/2001/XMLSchema-instance"
ns2:type="ns1:Book"><ns1:id>124</ns1:id><ns1:name>CXF in Action -
2</ns1:name></ns1:Book>
\ No newline at end of file
+<?xml version='1.0' encoding='UTF-8'?><ns1:Book
xmlns:ns1="http://jaxrs.systest.cxf.apache.org"
xmlns:ns2="http://www.w3.org/2001/XMLSchema-instance"
ns2:type="ns1:Book"><ns1:id>124</ns1:id><ns1:name>CXF in Action -
2</ns1:name></ns1:Book>
\ No newline at end of file