diff --git a/components/camel-stax/pom.xml b/components/camel-stax/pom.xml index 4c8f199675299..6fd1b60dac7fe 100644 --- a/components/camel-stax/pom.xml +++ b/components/camel-stax/pom.xml @@ -40,8 +40,12 @@ org.apache.camel camel-support + + + com.fasterxml.woodstox + woodstox-core + 5.1.0 - org.apache.camel diff --git a/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java b/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java index 641a8733273ea..f401bd623856d 100644 --- a/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java +++ b/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java @@ -26,6 +26,8 @@ import org.apache.camel.Processor; import org.apache.camel.support.ExchangeHelper; +import com.ctc.wstx.sr.ValidatingStreamReader; + /** * It uses SAX content handler to handle events. *

@@ -49,25 +51,34 @@ public StAXProcessor(ContentHandler contentHandler) { @Override public void process(Exchange exchange) throws Exception { - InputSource is = exchange.getIn().getMandatoryBody(InputSource.class); - XMLStreamReader stream = exchange.getIn().getMandatoryBody(XMLStreamReader.class); - XMLReader reader = new StaxStreamXMLReader(stream); - - ContentHandler handler; - if (contentHandlerClass != null) { - handler = contentHandlerClass.newInstance(); - } else { - handler = contentHandler; - } - reader.setContentHandler(handler); - reader.parse(is); + XMLStreamReader stream = null; + try { + stream = exchange.getIn().getMandatoryBody(XMLStreamReader.class); + StaxStreamXMLReader reader = new StaxStreamXMLReader(stream); + ContentHandler handler; + if (this.contentHandlerClass != null) { + handler = (ContentHandler) this.contentHandlerClass.newInstance(); + } else { + handler = this.contentHandler; + } - if (ExchangeHelper.isOutCapable(exchange)) { - // preserve headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); - exchange.getOut().setBody(handler); - } else { - exchange.getIn().setBody(handler); + reader.setContentHandler(handler); + // InputSource is ignored anyway + reader.parse((InputSource) null); + if (ExchangeHelper.isOutCapable(exchange)) { + exchange.getOut().setHeaders(exchange.getIn().getHeaders()); + exchange.getOut().setBody(handler); + } else { + exchange.getIn().setBody(handler); + } + } finally { + if (stream != null) { + stream.close(); + if (stream instanceof ValidatingStreamReader) { + // didn't find any method without using the woodstox package + ((ValidatingStreamReader) stream).closeCompletely(); + } + } } }