Updated Branches: refs/heads/camel-2.11.x 3d93c7fb3 -> 77fb728a4 refs/heads/camel-2.12.x 87001effc -> 5f91492e2
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/5f91492e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5f91492e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5f91492e Branch: refs/heads/camel-2.12.x Commit: 5f91492e2f40396fd76bd0684771ce0a0afac9a1 Parents: 87001ef Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Oct 1 11:33:23 2013 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Oct 1 11:37:17 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/5f91492e/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 1cd33ae..5469df5 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/5f91492e/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); + } + +}