Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 79557 invoked from network); 22 Jul 2009 14:34:24 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 22 Jul 2009 14:34:24 -0000 Received: (qmail 15431 invoked by uid 500); 22 Jul 2009 14:29:48 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 15394 invoked by uid 500); 22 Jul 2009 14:29:48 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 15385 invoked by uid 99); 22 Jul 2009 14:29:47 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Jul 2009 14:29:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Jul 2009 14:29:43 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4F64B2388895; Wed, 22 Jul 2009 14:29:22 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r796741 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/provider/ Date: Wed, 22 Jul 2009 14:29:22 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090722142922.4F64B2388895@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Wed Jul 22 14:29:21 2009 New Revision: 796741 URL: http://svn.apache.org/viewvc?rev=796741&view=rev Log: JAXRS : updating JSONProvider to optionally ignore mixed content characters Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml (with props) 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/JSONProvider.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=796741&r1=796740&r2=796741&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 Jul 22 14:29:21 2009 @@ -19,6 +19,8 @@ package org.apache.cxf.jaxrs.provider; +import java.io.PrintWriter; +import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.lang.annotation.Annotation; import java.lang.reflect.Array; @@ -155,7 +157,11 @@ protected QName getJaxbQName(Class cls, Type type, Object object, boolean pluralName) throws Exception { - //try the easy way first + + if (cls == JAXBElement.class) { + return object != null ? ((JAXBElement)object).getName() : null; + } + XmlRootElement root = cls.getAnnotation(XmlRootElement.class); QName qname = null; if (root != null) { @@ -431,6 +437,9 @@ } protected static void handleJAXBException(JAXBException e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + LOG.warning(sw.toString()); StringBuilder sb = new StringBuilder(); if (e.getMessage() != null) { sb.append(e.getMessage()).append(". "); @@ -445,7 +454,6 @@ ? e.getLinkedException() : e.getCause() != null ? e.getCause() : e; String message = new org.apache.cxf.common.i18n.Message("JAXB_EXCEPTION", BUNDLE, sb.toString()).toString(); - LOG.warning(message); Response r = Response.status(Response.Status.INTERNAL_SERVER_ERROR) .type(MediaType.TEXT_PLAIN).entity(message).build(); throw new WebApplicationException(t, r); 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=796741&r1=796740&r2=796741&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 Jul 22 14:29:21 2009 @@ -74,7 +74,7 @@ private Map wrapperMap; private boolean dropRootElement; private boolean dropCollectionWrapperElement; - + private boolean ignoreMixedContent; @Context public void setMessageContext(MessageContext mc) { super.setContext(mc); @@ -88,6 +88,10 @@ this.dropCollectionWrapperElement = drop; } + public void setIgnoreMixedContent(boolean ignore) { + this.ignoreMixedContent = ignore; + } + public void setSupportUnwrapped(boolean unwrap) { this.unwrapped = unwrap; } @@ -293,6 +297,9 @@ XMLStreamWriter writer = createWriter(actualObject, actualClass, genericType, enc, os, isCollection); + if (ignoreMixedContent) { + writer = new IgnoreMixedContentWriter(writer); + } ms.marshal(actualObject, writer); writer.close(); } @@ -373,5 +380,24 @@ } } - + protected static class IgnoreMixedContentWriter extends DelegatingXMLStreamWriter { + boolean lastWriteChars; + + public IgnoreMixedContentWriter(XMLStreamWriter writer) { + super(writer); + } + + public void writeCharacters(String text) throws XMLStreamException { + if (!lastWriteChars) { + super.writeCharacters(text); + lastWriteChars = true; + } + } + + public void writeStartElement(String prefix, String localName, String namespaceURI) + throws XMLStreamException { + super.writeStartElement(prefix, localName, namespaceURI); + lastWriteChars = false; + } + } } 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=796741&r1=796740&r2=796741&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 Jul 22 14:29:21 2009 @@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.ArrayList; @@ -31,8 +32,16 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.MessageBodyReader; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.transform.stream.StreamSource; import org.apache.cxf.jaxrs.impl.MetadataMap; +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.TagVO; @@ -288,6 +297,31 @@ } @Test + public void testWriteIgnoreMixedContent() throws Exception { + doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125}}", true); + } + + @Test + public void testWriteMixedContent() throws Exception { + doTestMixedContent("{\"Book\":{\"name\":\"CXF\",\"id\":125,\"$\":\"\\n \\n\"}}", false); + } + + private void doTestMixedContent(String data, boolean ignore) throws Exception { + InputStream is = getClass().getResourceAsStream("book.xml"); + JAXBContext context = JAXBContext.newInstance(new Class[]{Books.class, Book.class}); + Unmarshaller um = context.createUnmarshaller(); + JAXBElement jaxbEl = um.unmarshal(new StreamSource(is), Books.class); + JSONProvider p = new JSONProvider(); + p.setIgnoreMixedContent(ignore); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + p.writeTo(jaxbEl, (Class)JAXBElement.class, JAXBElement.class, JAXBElement.class.getAnnotations(), + MediaType.APPLICATION_JSON_TYPE, new MetadataMap(), os); + String s = os.toString(); + assertEquals(data, s); + } + + @Test public void testWriteToListWithManyValues() throws Exception { JSONProvider p = new JSONProvider(); Tags tags = new Tags(); @@ -341,7 +375,6 @@ MediaType.APPLICATION_JSON_TYPE, new MetadataMap(), os); String s = os.toString(); - System.out.println(s); assertEquals( "{\"ManyTags\":{\"tags\":{\"list\":[{\"group\":\"b\",\"name\":\"a\"}]}}}", s); @@ -354,4 +387,11 @@ private TagVO2 createTag2(String name, String group) { return new TagVO2(name, group); } + + @XmlRootElement() + public static class Books { + @XmlMixed + @XmlAnyElement(lax = true) + protected List books; + } } Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml?rev=796741&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml (added) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml Wed Jul 22 14:29:21 2009 @@ -0,0 +1,7 @@ + + + + CXF + 125 + + Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/book.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml