You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ay...@apache.org on 2016/03/30 10:10:41 UTC

camel git commit: CAMEL-9774: CXFPayload may lose CDATA sections under stream caching

Repository: camel
Updated Branches:
  refs/heads/master 1627e5b0c -> e4ae4fb2f


CAMEL-9774: CXFPayload may lose CDATA sections under stream caching


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e4ae4fb2
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e4ae4fb2
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e4ae4fb2

Branch: refs/heads/master
Commit: e4ae4fb2f53438fc5f4aeac36625b102a96f05a4
Parents: 1627e5b
Author: Akitoshi Yoshida <ay...@apache.org>
Authored: Wed Mar 30 10:09:18 2016 +0200
Committer: Akitoshi Yoshida <ay...@apache.org>
Committed: Wed Mar 30 10:09:58 2016 +0200

----------------------------------------------------------------------
 .../cxf/converter/CachedCxfPayload.java         | 26 ++++++++------------
 .../cxf/converter/CachedCxfPayloadTest.java     | 25 ++++++++++---------
 2 files changed, 24 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e4ae4fb2/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CachedCxfPayload.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CachedCxfPayload.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CachedCxfPayload.java
index b480a73..b2b4db6 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CachedCxfPayload.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CachedCxfPayload.java
@@ -22,14 +22,11 @@ import java.util.ArrayList;
 import java.util.ListIterator;
 import java.util.Map;
 
+import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.Source;
-import javax.xml.transform.TransformerException;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stax.StAXSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.w3c.dom.Document;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.StreamCache;
@@ -38,18 +35,17 @@ import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.converter.stream.CachedOutputStream;
 import org.apache.camel.converter.stream.StreamSourceCache;
 import org.apache.cxf.staxutils.StaxSource;
+import org.apache.cxf.staxutils.StaxUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
     private static final Logger LOG = LoggerFactory.getLogger(CachedCxfPayload.class);
-    private final XmlConverter xml;
 
     public CachedCxfPayload(CxfPayload<T> orig, Exchange exchange, XmlConverter xml) {
         super(orig.getHeaders(), new ArrayList<Source>(orig.getBodySources()), orig.getNsMap());
         ListIterator<Source> li = getBodySources().listIterator();
-        this.xml = xml;
         while (li.hasNext()) {
             Source source = li.next();
             XMLStreamReader reader = null;
@@ -67,22 +63,22 @@ public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
             if (reader != null) {
                 Map<String, String> nsmap = getNsMap();
                 if (nsmap != null && !(reader instanceof DelegatingXMLStreamReader)) {
-                    source = new StAXSource(new DelegatingXMLStreamReader(reader, nsmap));
+                    reader = new DelegatingXMLStreamReader(reader, nsmap);
                 }
                 CachedOutputStream cos = new CachedOutputStream(exchange);
-                StreamResult sr = new StreamResult(cos);
                 try {
-                    xml.toResult(source, sr);
+                    StaxUtils.copy(reader, cos);
                     li.set(new StreamSourceCache(cos.newStreamCache()));
-                } catch (TransformerException e) {
+                } catch (XMLStreamException e) {
                     LOG.error("Transformation failed ", e);
                 } catch (IOException e) {
                     LOG.error("Cannot Create StreamSourceCache ", e);
                 }
+
             } else if (!(source instanceof DOMSource)) {
-                Document document = exchange.getContext().getTypeConverter().convertTo(Document.class, exchange, source);
+                DOMSource document = exchange.getContext().getTypeConverter().convertTo(DOMSource.class, exchange, source);
                 if (document != null) {
-                    li.set(new DOMSource(document));
+                    li.set(document);
                 }
             }
         }
@@ -91,7 +87,6 @@ public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
     private CachedCxfPayload(CachedCxfPayload<T> orig, Exchange exchange) throws IOException {
         super(orig.getHeaders(), new ArrayList<Source>(orig.getBodySources()), orig.getNsMap());
         ListIterator<Source> li = getBodySources().listIterator();
-        this.xml = orig.xml;
         while (li.hasNext()) {
             Source source = li.next();
             if (source instanceof StreamCache) {
@@ -119,10 +114,9 @@ public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
         if (body instanceof StreamCache) {
             ((StreamCache) body).writeTo(os);
         } else {
-            StreamResult sr = new StreamResult(os);
             try {
-                xml.toResult(body, sr);
-            } catch (TransformerException e) {
+                StaxUtils.copy(body, os);
+            } catch (XMLStreamException e) {
                 throw new IOException("Transformation failed", e);
             }
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/e4ae4fb2/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/converter/CachedCxfPayloadTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/converter/CachedCxfPayloadTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/converter/CachedCxfPayloadTest.java
index 96cee5e..ac9c30e 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/converter/CachedCxfPayloadTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/converter/CachedCxfPayloadTest.java
@@ -36,41 +36,44 @@ import org.apache.cxf.staxutils.StaxUtils;
 import org.junit.Test;
 
 public class CachedCxfPayloadTest extends ExchangeTestSupport {
-    private static final String PAYLOAD = "<foo>bar</foo>";
+    private static final String PAYLOAD = "<foo>bar<![CDATA[ & a cdata section ]]></foo>";
+    private static final String PAYLOAD_AMPED = "<foo>bar &amp; a cdata section </foo>";
 
     @Test
     public void testCachedCxfPayloadSAXSource() throws TypeConversionException, NoTypeConversionAvailableException, IOException {
         SAXSource source = context.getTypeConverter().mandatoryConvertTo(SAXSource.class, PAYLOAD);
-        doTest(source);
+        // this conversion uses org.apache.camel.converter.jaxp.XmlConverter.toDOMNodeFromSAX which uses Transformer
+        // to convert SAXSource to DOM. This conversion preserves the content but loses its original representation.
+        doTest(source, PAYLOAD_AMPED);
     }
 
     @Test
     public void testCachedCxfPayloadStAXSource() throws TypeConversionException, NoTypeConversionAvailableException, IOException {
         StAXSource source = context.getTypeConverter().mandatoryConvertTo(StAXSource.class, PAYLOAD);
-        doTest(source);
+        doTest(source, PAYLOAD);
     }
 
     @Test
     public void testCachedCxfPayloadStaxSource() throws TypeConversionException, NoTypeConversionAvailableException, IOException {
         XMLStreamReader streamReader = StaxUtils.createXMLStreamReader(new StreamSource(new StringReader(PAYLOAD)));
         StaxSource source = new StaxSource(streamReader);
-        doTest(source);
+        doTest(source, PAYLOAD);
     }
 
     @Test
     public void testCachedCxfPayloadDOMSource() throws TypeConversionException, NoTypeConversionAvailableException, IOException {
         DOMSource source = context.getTypeConverter().mandatoryConvertTo(DOMSource.class, PAYLOAD);
-        doTest(source);
+        doTest(source, PAYLOAD);
     }
 
     @Test
     public void testCachedCxfPayloadStreamSource() throws TypeConversionException, NoTypeConversionAvailableException, IOException {
         StreamSource source = context.getTypeConverter().mandatoryConvertTo(StreamSource.class, PAYLOAD);
-        doTest(source);
+        doTest(source, PAYLOAD);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    private void doTest(Object source) throws IOException {
+    private void doTest(Object source, String payload) throws IOException {
         CxfPayload<?> originalPayload = context.getTypeConverter().convertTo(CxfPayload.class, source);
         CachedCxfPayload<?> cache = new CachedCxfPayload(originalPayload, exchange, new XmlConverter());
 
@@ -80,7 +83,7 @@ public class CachedCxfPayloadTest extends ExchangeTestSupport {
         cache.writeTo(bos);
 
         String s = context.getTypeConverter().convertTo(String.class, bos);
-        assertEquals(PAYLOAD, s);
+        assertEquals(payload, s);
 
         cache.reset();
 
@@ -89,15 +92,15 @@ public class CachedCxfPayloadTest extends ExchangeTestSupport {
         clone.writeTo(bos);
 
         s = context.getTypeConverter().convertTo(String.class, bos);
-        assertEquals(PAYLOAD, s);
+        assertEquals(payload, s);
 
         cache.reset();
         clone.reset();
 
         s = context.getTypeConverter().convertTo(String.class, cache);
-        assertEquals(PAYLOAD, s);
+        assertEquals(payload, s);
 
         s = context.getTypeConverter().convertTo(String.class, clone);
-        assertEquals(PAYLOAD, s);
+        assertEquals(payload, s);
     }
 }