You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2009/01/28 14:06:24 UTC

svn commit: r738474 - in /jackrabbit/trunk/jackrabbit-jcr-commons/src: main/java/org/apache/jackrabbit/util/Text.java test/java/org/apache/jackrabbit/util/TextTest.java

Author: angela
Date: Wed Jan 28 13:06:23 2009
New Revision: 738474

URL: http://svn.apache.org/viewvc?rev=738474&view=rev
Log:
- JCR-1958: Enhanced JCR remoting (work in progress)
- javadoc issue with Text.escapeIllegalXpathSearchChars

Modified:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/Text.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/util/TextTest.java

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/Text.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/Text.java?rev=738474&r1=738473&r2=738474&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/Text.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/Text.java Wed Jan 28 13:06:23 2009
@@ -487,7 +487,7 @@
      * A search string like 'test?' will run into a ParseException
      * documented in http://issues.apache.org/jira/browse/JCR-1248
      * 
-     * @param string the string to encode
+     * @param s the string to encode
      * @return the escaped string
      */
     public static String escapeIllegalXpathSearchChars(String s) {
@@ -730,7 +730,7 @@
      *                                  variable is not found
      */
     public static String replaceVariables(Properties variables, String value,
-                                   boolean ignoreMissing)
+                                          boolean ignoreMissing)
             throws IllegalArgumentException {
         StringBuffer result = new StringBuffer();
 
@@ -764,4 +764,66 @@
         return result.toString();
     }
 
+    /**
+     * Generate a valid JSON string from the given <code>str</code>.
+     * 
+     * @param str A String
+     * @return JSON string surrounded by double quotes.
+     * @see <a href="http://tools.ietf.org/html/rfc4627">RFC 4627</a>
+     */
+    public static String getJSONString(String str) {
+        if (str == null || str.length() == 0) {
+            return "\"\"";
+        }
+
+        int len = str.length();
+        StringBuffer sb = new StringBuffer(len + 2);
+        // leading quote
+        sb.append('"');
+        // append passed string escaping characters as required
+        for (int i = 0; i < len; i++) {
+            char c = str.charAt(i);
+            switch (c) {
+                // reverse solidus and double quote
+                case '\\':
+                case '"':
+                    sb.append('\\').append(c);
+                    break;
+                // tab, line breaking chars and backspace
+                case '\b':
+                    sb.append("\\b");
+                    break;
+                case '\f':
+                    sb.append("\\f");
+                    break;
+                case '\n':
+                    sb.append("\\n");
+                    break;
+                case '\r':
+                    sb.append("\\r");
+                    break;
+                case '\t':
+                    sb.append("\\t");
+                    break;
+                // other control characters and 'unescaped'
+                default:
+                    if (c < 32) {
+                        // control characters except those already covered above.
+                        String uc = Integer.toHexString(c);
+                        sb.append("\\u");
+                        int uLen = uc.length();
+                        while (uLen++ < 4) {
+                            sb.append('0');
+                        }
+                        sb.append(uc);
+                    } else {
+                        // unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
+                        sb.append(c);
+                    }
+            }
+        }
+        // trailing quote
+        sb.append('"');
+        return sb.toString();
+    }
 }

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/util/TextTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/util/TextTest.java?rev=738474&r1=738473&r2=738474&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/util/TextTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/util/TextTest.java Wed Jan 28 13:06:23 2009
@@ -23,6 +23,8 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
 
 /**
  * Test cases for the Text utility class.
@@ -153,6 +155,33 @@
         assertInvalidUnescape("%%%"); // not a number
     }
 
+    public void testGetJSONString() {
+        Map m = new HashMap();
+        m.put("abc", "\"abc\"");
+        m.put("a \"b\" c", "\"a \\\"b\\\" c\"");
+        m.put("a\tb\rc\nd\fe\b", "\"a\\tb\\rc\\nd\\fe\\b\"");
+        m.put("\\abc", "\"\\\\abc\"");
+        m.put("abc", "\"abc\"");
+
+        // non-printable ascii other than those treated (\t,\r,\n)
+        m.put(String.valueOf((char) 7), "\"\\u0007\"");
+        m.put(String.valueOf((char) 30), "\"\\u001e\"");
+
+        // chinese
+        m.put("\u4e00a\u4e8cb\u4e09c", "\"\u4e00a\u4e8cb\u4e09c\"");
+        /* arabic */
+        m.put("\u062c\u062f\u064a\u062f", "\"\u062c\u062f\u064a\u062f\"");
+        /* Ñaçb?c */
+        m.put("\u00d1a\u00e7b\u0416c", "\"\u00d1a\u00e7b\u0416c\"");
+        // âèøü
+        m.put("âèøü", "\"\u00e2\u00e8\u00f8\u00fc\"");
+
+        for (Iterator it = m.keySet().iterator(); it.hasNext();) {
+            String key = it.next().toString();
+            assertEquals(m.get(key).toString(), Text.getJSONString(key));
+        }
+    }
+    
     private void assertInvalidUnescape(String string) {
         try {
             Text.unescape(string);
@@ -162,4 +191,4 @@
         }
     }
 
-}
+}
\ No newline at end of file