You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2014/04/27 15:53:52 UTC
[3/3] git commit: TAP5-2219, TAP5-1778,
TAP5-1714: when transforming the template stream,
use the same encoding for the input and the output
TAP5-2219, TAP5-1778, TAP5-1714: when transforming the template stream, use the same encoding for the input and the output
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/1a37c6ab
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/1a37c6ab
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/1a37c6ab
Branch: refs/heads/master
Commit: 1a37c6abd59254d3e9e6ce676cd7b300d704ecac
Parents: 70d4efb
Author: Jochen Kemnade <jo...@web.de>
Authored: Sun Apr 27 15:30:30 2014 +0200
Committer: Jochen Kemnade <jo...@web.de>
Committed: Sun Apr 27 15:30:30 2014 +0200
----------------------------------------------------------------------
.../internal/services/XMLTokenStream.java | 6 +-
.../internal/services/XMLTokenStreamTests.java | 110 +++++++++++++++++++
2 files changed, 114 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1a37c6ab/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/XMLTokenStream.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/XMLTokenStream.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/XMLTokenStream.java
index 1fe5656..b80c6d6 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/XMLTokenStream.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/XMLTokenStream.java
@@ -345,12 +345,14 @@ public class XMLTokenStream
private InputStream openStream() throws IOException
{
InputStream rawStream = resource.openStream();
+
+ String transformationEncoding = "UTF8";
- InputStreamReader rawReader = new InputStreamReader(rawStream, "UTF8");
+ InputStreamReader rawReader = new InputStreamReader(rawStream, transformationEncoding);
LineNumberReader reader = new LineNumberReader(rawReader);
ByteArrayOutputStream bos = new ByteArrayOutputStream(5000);
- PrintWriter writer = new PrintWriter(bos);
+ PrintWriter writer = new PrintWriter(new OutputStreamWriter(bos, transformationEncoding));
State state = State.MAYBE_XML;
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1a37c6ab/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/XMLTokenStreamTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/XMLTokenStreamTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/XMLTokenStreamTests.java
new file mode 100644
index 0000000..e80ad06
--- /dev/null
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/XMLTokenStreamTests.java
@@ -0,0 +1,110 @@
+package org.apache.tapestry5.internal.services;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+
+import org.apache.tapestry5.internal.services.XMLTokenStream;
+import org.apache.tapestry5.internal.services.XMLTokenType;
+import org.apache.tapestry5.ioc.MappedConfiguration;
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.internal.util.AbstractResource;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+
+public class XMLTokenStreamTests
+{
+ private static class MappedConfigurationStub<K,V> extends HashMap<K, V> implements MappedConfiguration<K, V>
+ {
+ public void add(K key, V value)
+ {
+ put(key,value);
+ }
+ public void override(K key, V value)
+ {
+ put(key,value);
+ }
+ public void addInstance(K key, Class<? extends V> clazz)
+ {
+ throw new UnsupportedOperationException();
+ }
+ public void overrideInstance(K key, Class<? extends V> clazz)
+ {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+
+
+ private static class ResourceStub extends AbstractResource
+ {
+ final byte[] content;
+ public ResourceStub(byte[] content)
+ {
+ super("");
+ this.content=content;
+ }
+ public URL toURL()
+ {
+ return null;
+ }
+ protected Resource newResource(String path)
+ {
+ return null;
+ }
+ @Override
+ public InputStream openStream() throws IOException
+ {
+ return new ByteArrayInputStream(content);
+ }
+ }
+
+ protected void resetDefaultCharset() throws Exception
+ {
+ // The charset is cached after system start - so we ned to clear that cache to force a certain file.encoding
+ Field field=Charset.class.getDeclaredField("defaultCharset");
+ field.setAccessible(true);
+ field.set(null, null);
+ }
+
+ /**
+ * This test sets the system's default encoding to cp1252 (as on german windows) and tries to parse a non-ascii xml file
+ * with XMLTokenStream. This is to test a critical section within XMLTokenStream.openStream() where the
+ * binary file is converted to charcters and back before it is parsed.
+ * @throws Exception
+ */
+ @Test
+ public void testStreamEncoding() throws Exception
+ {
+ String oldEncoding=System.getProperty("file.encoding");
+ System.setProperty("file.encoding","cp1252");
+ resetDefaultCharset();
+ try
+ {
+ MappedConfigurationStub<String, URL> parserUrlMap=new MappedConfigurationStub<String, URL>();
+
+ String unicodeString="\u00FC";
+
+ String testDocument="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>"+unicodeString+"</root>\n";
+ XMLTokenStream xts=new XMLTokenStream(new ResourceStub(testDocument.getBytes("utf-8")),parserUrlMap);
+ xts.parse();
+ Assert.assertEquals(xts.next(), XMLTokenType.START_ELEMENT);
+ Assert.assertEquals(xts.getLocalName(), "root");
+ Assert.assertEquals(xts.next(), XMLTokenType.CHARACTERS);
+ Assert.assertEquals(xts.getText(), unicodeString);
+ Assert.assertEquals(xts.next(), XMLTokenType.END_ELEMENT);
+ Assert.assertEquals(xts.next(), XMLTokenType.END_DOCUMENT);
+ }
+ finally
+ {
+ System.setProperty("file.encoding", oldEncoding);
+ resetDefaultCharset();
+ }
+ }
+
+}