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 <claus.ib...@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());