[Practicalxml-commits] SF.net SVN: practicalxml:[127] branches/dev-1.1/src
Brought to you by:
kdgregory
|
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-11 18:30:46
|
Revision: 127
http://practicalxml.svn.sourceforge.net/practicalxml/?rev=127&view=rev
Author: kdgregory
Date: 2009-09-11 18:30:39 +0000 (Fri, 11 Sep 2009)
Log Message:
-----------
Xml2JsonConverter now escapes strings
Modified Paths:
--------------
branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java
branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java
branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java
branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java
Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java
===================================================================
--- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java 2009-09-11 17:43:24 UTC (rev 126)
+++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java 2009-09-11 18:30:39 UTC (rev 127)
@@ -24,6 +24,53 @@
public class JsonUtil
{
/**
+ * Escapes a string, replacing quotes, backslashes, non-printable and
+ * non-ASCII characters by a defined set of single-character or 4-digit
+ * unicode escapes.
+ */
+ public static String escape(String src)
+ {
+ if (src == null)
+ return "";
+
+ StringBuffer buf = new StringBuffer(src.length() + 20);
+ for (int ii = 0 ; ii < src.length() ; ii++)
+ {
+ char c = src.charAt(ii);
+ switch (c)
+ {
+ case '"' :
+ case '\\' :
+ case '/' :
+ buf.append('\\').append(c);
+ break;
+ case '\b' :
+ buf.append("\\b");
+ break;
+ case '\f' :
+ buf.append("\\f");
+ break;
+ case '\n' :
+ buf.append("\\n");
+ break;
+ case '\r' :
+ buf.append("\\r");
+ break;
+ case '\t' :
+ buf.append("\\t");
+ break;
+ default :
+ if ((c >= 32) && (c <= 127))
+ buf.append(c);
+ else
+ buf.append(escapeUnicode(c));
+ }
+ }
+ return buf.toString();
+ }
+
+
+ /**
* Unescapes a string, replacing "slash-sequences" by actual characters.
* Null is converted to empty string.
*
@@ -100,4 +147,18 @@
}
return (char)value;
}
+
+
+ private static String escapeUnicode(char c)
+ {
+ char[] buf = new char[] { '\\', 'u', '0', '0', '0', '0' };
+ int value = c & 0xFFFF;
+ for (int ii = 5 ; ii > 1 ; ii--)
+ {
+ int digit = value % 16;
+ value /= 16;
+ buf[ii] = Character.forDigit(digit, 16);
+ }
+ return new String(buf);
+ }
}
Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java
===================================================================
--- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java 2009-09-11 17:43:24 UTC (rev 126)
+++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java 2009-09-11 18:30:39 UTC (rev 127)
@@ -48,7 +48,7 @@
private StringBuffer appendText(String text, StringBuffer buf)
{
buf.append('"')
- .append(text)
+ .append(JsonUtil.escape(text))
.append('"');
return buf;
}
Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java
===================================================================
--- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java 2009-09-11 17:43:24 UTC (rev 126)
+++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java 2009-09-11 18:30:39 UTC (rev 127)
@@ -18,6 +18,45 @@
public class TestJsonUtil extends TestCase
{
+ public void testEscapeNullAndEmpty() throws Exception
+ {
+ assertEquals("", JsonUtil.escape(null));
+ assertEquals("", JsonUtil.escape(""));
+ }
+
+
+ public void testEscapeNormalString() throws Exception
+ {
+ assertEquals("f", JsonUtil.unescape("f"));
+ assertEquals("fo", JsonUtil.unescape("fo"));
+ assertEquals("foo", JsonUtil.unescape("foo"));
+ }
+
+
+ public void testEescapeSingleChar() throws Exception
+ {
+ assertEquals("\\\"", JsonUtil.escape("\""));
+ assertEquals("\\\\", JsonUtil.escape("\\"));
+ assertEquals("\\/", JsonUtil.escape("/"));
+ assertEquals("\\b", JsonUtil.escape("\b"));
+ assertEquals("\\f", JsonUtil.escape("\f"));
+ assertEquals("\\n", JsonUtil.escape("\n"));
+ assertEquals("\\r", JsonUtil.escape("\r"));
+ assertEquals("\\t", JsonUtil.escape("\t"));
+
+ // and a couple of tests to ensure that we don't overstep
+ assertEquals("ba\\rbaz", JsonUtil.escape("ba\rbaz"));
+ assertEquals("\\r\\n", JsonUtil.escape("\r\n"));
+ }
+
+
+ public void testEscapeUnicode() throws Exception
+ {
+ assertEquals("\\u0019", JsonUtil.escape("\u0019"));
+ assertEquals("\\u1bcd", JsonUtil.escape("\u1bcd"));
+ }
+
+
public void testUnescapeNullAndEmpty() throws Exception
{
assertEquals("", JsonUtil.unescape(null));
@@ -33,7 +72,7 @@
}
- public void testUnescapeSingleCharSlashes() throws Exception
+ public void testUnescapeSingleChar() throws Exception
{
assertEquals("\"", JsonUtil.unescape("\\\""));
assertEquals("\\", JsonUtil.unescape("\\\\"));
Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java
===================================================================
--- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java 2009-09-11 17:43:24 UTC (rev 126)
+++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java 2009-09-11 18:30:39 UTC (rev 127)
@@ -84,4 +84,19 @@
element("biz", text("baz")),
element("fizz", text("buzz")))));
}
+
+
+ public void testStringEscaping() throws Exception
+ {
+ convertAndAssert(
+ "{backslash: \"\\\\\", "
+ + "quote: \"\\\"\", "
+ + "nonprint: \"\\b\\f\\n\\r\\t\", "
+ + "unicode: \"b\\u00e4r\"}",
+ element("data",
+ element("backslash", text("\\")),
+ element("quote", text("\"")),
+ element("nonprint", text("\b\f\n\r\t")),
+ element("unicode", text("b\u00e4r"))));
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|