You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/01/28 10:12:00 UTC

[camel] branch master updated: CAMEL-13130: camel3 - Components should not use XmlConverter directly

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 84527e4  CAMEL-13130: camel3 - Components should not use XmlConverter directly
84527e4 is described below

commit 84527e4981daca538050911417199eb34802c31a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jan 28 11:04:43 2019 +0100

    CAMEL-13130: camel3 - Components should not use XmlConverter directly
---
 components/camel-cxf/pom.xml                       |  4 ---
 .../component/cxf/converter/CachedCxfPayload.java  | 36 ++++++++++++++++++++--
 .../cxf/converter/CxfPayloadConverter.java         |  4 +--
 .../cxf/converter/CachedCxfPayloadTest.java        |  3 +-
 4 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/components/camel-cxf/pom.xml b/components/camel-cxf/pom.xml
index d3b2c81..4cbbe2e 100644
--- a/components/camel-cxf/pom.xml
+++ b/components/camel-cxf/pom.xml
@@ -111,10 +111,6 @@
 
     <dependency>
       <groupId>org.springframework</groupId>
-      <artifactId>spring-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
       <artifactId>spring-beans</artifactId>
     </dependency>
     <dependency>
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 d82fcac..650632c 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
@@ -21,10 +21,15 @@ import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Properties;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.Result;
 import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stax.StAXSource;
 import javax.xml.transform.stream.StreamResult;
@@ -32,9 +37,11 @@ import javax.xml.transform.stream.StreamResult;
 import org.apache.camel.Exchange;
 import org.apache.camel.StreamCache;
 import org.apache.camel.component.cxf.CxfPayload;
-import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.converter.stream.CachedOutputStream;
 import org.apache.camel.converter.stream.StreamSourceCache;
+import org.apache.camel.support.builder.xml.StAX2SAXSource;
+import org.apache.camel.support.builder.xml.XMLConverterHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.cxf.staxutils.StaxSource;
 import org.apache.cxf.staxutils.StaxUtils;
 import org.slf4j.Logger;
@@ -42,8 +49,9 @@ import org.slf4j.LoggerFactory;
 
 public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
     private static final Logger LOG = LoggerFactory.getLogger(CachedCxfPayload.class);
+    private static String defaultCharset = ObjectHelper.getSystemProperty("org.apache.camel.default.charset", "UTF-8");
 
-    public CachedCxfPayload(CxfPayload<T> orig, Exchange exchange, XmlConverter xml) {
+    public CachedCxfPayload(CxfPayload<T> orig, Exchange exchange) {
         super(orig.getHeaders(), new ArrayList<>(orig.getBodySources()), orig.getNsMap());
         ListIterator<Source> li = getBodySources().listIterator();
         while (li.hasNext()) {
@@ -75,7 +83,7 @@ public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
                     // fallback to trying to read the reader using another way
                     StreamResult sr = new StreamResult(cos);
                     try {
-                        xml.toResult(source, sr);
+                        toResult(source, sr);
                         li.set(new StreamSourceCache(cos.newStreamCache()));
                         // this worked so continue
                         continue;
@@ -94,6 +102,28 @@ public class CachedCxfPayload<T> extends CxfPayload<T> implements StreamCache {
         }
     }
 
+    private static void toResult(Source source, Result result) throws TransformerException {
+        if (source != null) {
+            XMLConverterHelper xml = new XMLConverterHelper();
+            TransformerFactory factory = xml.getTransformerFactory();
+            Transformer transformer = factory.newTransformer();
+            if (transformer == null) {
+                throw new TransformerException("Could not create a transformer - JAXP is misconfigured!");
+            } else {
+                Properties outputProperties = new Properties();
+                outputProperties.put("encoding", defaultCharset);
+                outputProperties.put("omit-xml-declaration", "yes");
+
+                transformer.setOutputProperties(outputProperties);
+                if (factory.getClass().getName().equals("org.apache.xalan.processor.TransformerFactoryImpl") && source instanceof StAXSource) {
+                    source = new StAX2SAXSource(((StAXSource)source).getXMLStreamReader());
+                }
+
+                transformer.transform(source, result);
+            }
+        }
+    }
+
     private CachedCxfPayload(CachedCxfPayload<T> orig, Exchange exchange) throws IOException {
         super(orig.getHeaders(), new ArrayList<>(orig.getBodySources()), orig.getNsMap());
         ListIterator<Source> li = getBodySources().listIterator();
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
index 9bc96d7..dff05c6 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
@@ -41,7 +41,6 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StreamCache;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.component.cxf.CxfPayload;
-import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.cxf.staxutils.StaxSource;
 import org.apache.cxf.staxutils.StaxUtils;
@@ -50,7 +49,6 @@ import static org.apache.camel.TypeConverter.MISS_VALUE;
 
 @Converter
 public final class CxfPayloadConverter {
-    private static XmlConverter xml = new XmlConverter();
 
     private CxfPayloadConverter() {
         // Helper class
@@ -118,7 +116,7 @@ public final class CxfPayloadConverter {
 
     @Converter
     public static <T> StreamCache cxfPayLoadToStreamCache(CxfPayload<T> payload, Exchange exchange) {
-        return new CachedCxfPayload<>(payload, exchange, xml);
+        return new CachedCxfPayload<>(payload, exchange);
     }
 
     @SuppressWarnings("unchecked")
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 ac9c30e..d4ce3a3 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
@@ -29,7 +29,6 @@ import javax.xml.transform.stream.StreamSource;
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.TypeConversionException;
 import org.apache.camel.component.cxf.CxfPayload;
-import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.test.junit4.ExchangeTestSupport;
 import org.apache.cxf.staxutils.StaxSource;
 import org.apache.cxf.staxutils.StaxUtils;
@@ -75,7 +74,7 @@ public class CachedCxfPayloadTest extends ExchangeTestSupport {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     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());
+        CachedCxfPayload<?> cache = new CachedCxfPayload(originalPayload, exchange);
 
         assertTrue(cache.inMemory());