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
commit e7926586383412d1049bb559d10947f58f73dedb Author: Claus Ibsen <[email protected]> AuthorDate: Tue Mar 23 08:58:48 2021 +0100 CAMEL-13374: XMLTokenizer should detect and use encoding/charset from input xml instead of exchange charset. --- core/camel-xml-jaxp/pom.xml | 4 ++++ .../language/xtokenizer/XMLTokenExpressionIterator.java | 15 ++++++++++----- .../xtokenizer/XMLTokenExpressionIteratorTest.java | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/camel-xml-jaxp/pom.xml b/core/camel-xml-jaxp/pom.xml index f077163..0b1ef1d 100644 --- a/core/camel-xml-jaxp/pom.xml +++ b/core/camel-xml-jaxp/pom.xml @@ -43,6 +43,10 @@ <groupId>org.apache.camel</groupId> <artifactId>camel-support</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-xml-io-util</artifactId> + </dependency> <!-- testing --> <dependency> diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java index 335d731..bc98e27 100644 --- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java +++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java @@ -40,14 +40,13 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.apache.camel.Exchange; -import org.apache.camel.InvalidPayloadException; import org.apache.camel.converter.jaxp.StaxConverter; import org.apache.camel.spi.NamespaceAware; -import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.ExpressionAdapter; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; +import org.apache.camel.xml.io.util.XmlStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,6 +111,11 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam return createIterator(new InputStreamReader(in, charset)); } + protected Iterator<?> createIterator(InputStream in) + throws XMLStreamException, IOException { + return createIterator(new XmlStreamReader(in)); + } + protected Iterator<?> createIterator(Reader in) throws XMLStreamException { return new XMLTokenIterator(path, nsmap, mode, group, in); } @@ -145,11 +149,12 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam reader = new StringReader(val); } else { InputStream in = exchange.getIn().getMandatoryBody(InputStream.class); - String charset = ExchangeHelper.getCharsetName(exchange); - reader = new InputStreamReader(in, charset); + // use xml stream reader which is capable of handling reading the xml stream + // according to <xml encoding> charset + reader = new XmlStreamReader(in); } return createIterator(reader); - } catch (InvalidPayloadException | XMLStreamException | UnsupportedEncodingException e) { + } catch (Exception e) { exchange.setException(e); // must close input stream IOHelper.close(reader); diff --git a/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java b/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java index 3b3236f..d1ae99d 100644 --- a/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java +++ b/core/camel-xml-jaxp/src/test/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIteratorTest.java @@ -436,7 +436,7 @@ public class XMLTokenExpressionIteratorTest { XMLTokenExpressionIterator xtei = new XMLTokenExpressionIterator(path, mode); xtei.setNamespaces(nsmap); - Iterator<?> it = xtei.createIterator(in, "utf-8"); + Iterator<?> it = xtei.createIterator(in); List<String> results = new ArrayList<>(); while (it.hasNext()) { results.add((String) it.next());
