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();
+ }
+ }
}
}