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 2021/03/23 07:59:56 UTC

[camel] 05/05: CAMEL-13374: XMLTokenizer should detect and use encoding/charset from input xml instead of exchange charset.

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 <cl...@gmail.com>
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());