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 2013/10/01 11:38:57 UTC

[2/2] git commit: CAMEL-6779: StaxConverter: encoding problems for XMLEventReader and XMLStreamReader. Thanks to Franz Forsthofer for the patch.

CAMEL-6779: StaxConverter: encoding problems for XMLEventReader and XMLStreamReader. Thanks to Franz Forsthofer for the patch.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/77fb728a
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/77fb728a
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/77fb728a

Branch: refs/heads/camel-2.11.x
Commit: 77fb728a4e79536bb46a178ff32853765a4336c8
Parents: 3d93c7f
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Oct 1 11:33:23 2013 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Oct 1 11:37:32 2013 +0200

----------------------------------------------------------------------
 .../camel/converter/jaxp/StaxConverter.java     |   4 +-
 .../camel/converter/jaxp/StaxConverterTest.java | 136 +++++++++++++++++++
 2 files changed, 138 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/77fb728a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
index 747a2d6..dbcd4f4 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
@@ -167,7 +167,7 @@ public class StaxConverter {
     public XMLStreamReader createXMLStreamReader(InputStream in, Exchange exchange) throws XMLStreamException {
         XMLInputFactory factory = getInputFactory();
         try {
-            return factory.createXMLStreamReader(IOHelper.buffered(in), IOHelper.getCharsetName(exchange));
+            return factory.createXMLStreamReader(IOHelper.buffered(in), IOHelper.getCharsetName(exchange, false));
         } finally {
             returnXMLInputFactory(factory);
         }
@@ -236,7 +236,7 @@ public class StaxConverter {
     public XMLEventReader createXMLEventReader(InputStream in, Exchange exchange) throws XMLStreamException {
         XMLInputFactory factory = getInputFactory();
         try {
-            return factory.createXMLEventReader(IOHelper.buffered(in), IOHelper.getCharsetName(exchange));
+            return factory.createXMLEventReader(IOHelper.buffered(in), IOHelper.getCharsetName(exchange, false));
         } finally {
             returnXMLInputFactory(factory);
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/77fb728a/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxConverterTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxConverterTest.java b/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxConverterTest.java
new file mode 100644
index 0000000..eba7b59
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxConverterTest.java
@@ -0,0 +1,136 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.converter.jaxp;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.nio.charset.Charset;
+
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLEventWriter;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.events.XMLEvent;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultExchange;
+
+public class StaxConverterTest extends ContextTestSupport {
+
+    private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
+
+    private static final Charset UTF_8 = Charset.forName("UTF-8");
+
+    private static final String TEST_XML = "<test>Test Message with umlaut \u00E4\u00F6\u00FC</test>"; // umlauts have different encoding in UTF-8 and ISO-8859-1 (Latin1)
+
+    private static final String TEST_XML_WITH_XML_HEADER_ISO_8859_1 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + TEST_XML;
+
+    private static final ByteArrayInputStream TEST_XML_WITH_XML_HEADER_ISO_8859_1_AS_BYTE_ARRAY_STREAM = new ByteArrayInputStream(
+            TEST_XML_WITH_XML_HEADER_ISO_8859_1.getBytes(ISO_8859_1));
+
+    private static final String TEST_XML_WITH_XML_HEADER = "<?xml version=\"1.0\"?>" + TEST_XML;
+
+    public void testEncodingXmlEventReader() throws Exception {
+        TEST_XML_WITH_XML_HEADER_ISO_8859_1_AS_BYTE_ARRAY_STREAM.reset();
+        XMLEventReader reader = null;
+        XMLEventWriter writer = null;
+        ByteArrayOutputStream output = null;
+        try {
+            // enter text encoded with Latin1
+            reader = context.getTypeConverter().mandatoryConvertTo(XMLEventReader.class,
+                    TEST_XML_WITH_XML_HEADER_ISO_8859_1_AS_BYTE_ARRAY_STREAM);
+
+            output = new ByteArrayOutputStream();
+            // ensure UTF-8 encoding
+            Exchange exchange = new DefaultExchange(context);
+            exchange.setProperty(Exchange.CHARSET_NAME, UTF_8.name());
+            writer = context.getTypeConverter().mandatoryConvertTo(XMLEventWriter.class, exchange, output);
+            while (reader.hasNext()) {
+                writer.add(reader.nextEvent());
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+            if (writer != null) {
+                writer.close();
+            }
+        }
+        assertNotNull(output);
+
+        String result = new String(output.toByteArray(), UTF_8.name());
+
+        assertEquals(TEST_XML_WITH_XML_HEADER, result);
+
+    }
+
+    public void testEncodingXmlStreamReader() throws Exception {
+        TEST_XML_WITH_XML_HEADER_ISO_8859_1_AS_BYTE_ARRAY_STREAM.reset();
+
+        XMLStreamReader reader = null;
+        XMLStreamWriter writer = null;
+        ByteArrayOutputStream output = null;
+        try {
+            // enter text encoded with Latin1
+            reader = context.getTypeConverter().mandatoryConvertTo(XMLStreamReader.class,
+                    TEST_XML_WITH_XML_HEADER_ISO_8859_1_AS_BYTE_ARRAY_STREAM);
+
+            output = new ByteArrayOutputStream();
+            // ensure UTF-8 encoding
+            Exchange exchange = new DefaultExchange(context);
+            exchange.setProperty(Exchange.CHARSET_NAME, UTF_8.name());
+            writer = context.getTypeConverter().mandatoryConvertTo(XMLStreamWriter.class, exchange, output);
+            // copy to writer
+            while (reader.hasNext()) {
+                reader.next();
+                switch (reader.getEventType()) {
+                case XMLEvent.START_DOCUMENT:
+                    writer.writeStartDocument();
+                    break;
+                case XMLEvent.END_DOCUMENT:
+                    writer.writeEndDocument();
+                    break;
+                case XMLEvent.START_ELEMENT:
+                    writer.writeStartElement(reader.getName().getLocalPart());
+                    break;
+                case XMLEvent.CHARACTERS:
+                    writer.writeCharacters(reader.getText());
+                    break;
+                case XMLEvent.END_ELEMENT:
+                    writer.writeEndElement();
+                    break;
+                default:
+                    break;
+                }
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+            if (writer != null) {
+                writer.close();
+            }
+        }
+        assertNotNull(output);
+
+        String result = new String(output.toByteArray(), UTF_8.name());
+
+        assertEquals(TEST_XML, result);
+    }
+
+}