You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/03/22 21:05:38 UTC

svn commit: r1084332 - in /jackrabbit/sandbox/jackrabbit-j3/src: main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java main/java/org/apache/jackrabbit/j3/json/NodeImpl.java test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java

Author: thomasm
Date: Tue Mar 22 20:05:38 2011
New Revision: 1084332

URL: http://svn.apache.org/viewvc?rev=1084332&view=rev
Log:
Json/Jsop Tokenizer

Modified:
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java?rev=1084332&r1=1084331&r2=1084332&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/JsopTokenizer.java Tue Mar 22 20:05:38 2011
@@ -82,6 +82,15 @@ public class JsopTokenizer {
     }
 
     /**
+     * Read a string.
+     *
+     * @throws IllegalStateException if the token type doesn't match
+     */
+    public String readString() {
+        return read(STRING);
+    }
+
+    /**
      * Read a token which must match a given token type.
      *
      * @param type the token type
@@ -155,6 +164,8 @@ public class JsopTokenizer {
         case '+':
         case ':':
         case ',':
+        case '>':
+        case '^':
             return ch;
         case '-':
             ch = jsop.charAt(pos);
@@ -294,6 +305,9 @@ public class JsopTokenizer {
      */
     public static String encode(String s) {
         int length = s.length();
+        if (length == 0) {
+            return "\"\"";
+        }
         StringBuilder buff = new StringBuilder(length + 2);
         buff.append('\"');
         for (int i = 0; i < length; i++) {
@@ -329,17 +343,28 @@ public class JsopTokenizer {
                 break;
             default:
                 int ch = c;
-                if (ch >= ' ' && ch <= 127) {
-                    buff.append(c);
-                } else {
+                if (ch < ' ') {
+                    // guaranteed to be 1 or 2 hex digits only
+                    buff.append("\\u00");
+                    String hex = Integer.toHexString(c);
+                    if (hex.length() == 1) {
+                        buff.append('0');
+                    }
+                    buff.append(hex);
+                } else if (ch > 127) {
+                    // ascii only mode
                     buff.append("\\u");
-                    // make sure it's four characters
-                    buff.append(Integer.toHexString(0x10000 | ch).substring(1));
+                    String hex = Integer.toHexString(c);
+                    for (int len = hex.length(); len < 4; len++) {
+                        buff.append('0');
+                    }
+                    buff.append(hex);
+                } else {
+                    buff.append(c);
                 }
             }
         }
-        buff.append('\"');
-        return buff.toString();
+        return buff.append('\"').toString();
     }
 
     private static String getTokenType(int type) {

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java?rev=1084332&r1=1084331&r2=1084332&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java Tue Mar 22 20:05:38 2011
@@ -23,6 +23,9 @@ import java.util.Map.Entry;
 import javax.jcr.PropertyType;
 import org.apache.jackrabbit.j3.mc.Val;
 
+/**
+ * A prototype implementation of a node with child nodes.
+ */
 public class NodeImpl {
 
     private HashMap<String, Val> properties;
@@ -88,11 +91,11 @@ public class NodeImpl {
         return parse(t);
     }
 
-    private static NodeImpl parse(JsopTokenizer t) {
+    static NodeImpl parse(JsopTokenizer t) {
         NodeImpl node = new NodeImpl();
         if (!t.matches('}')) {
             do {
-                String key = t.read(JsopTokenizer.STRING);
+                String key = t.readString();
                 t.read(':');
                 if (t.matches('{')) {
                     node.addChildNode(key, parse(t));
@@ -106,7 +109,7 @@ public class NodeImpl {
         return node;
     }
 
-    private static Val parseValue(JsopTokenizer t) {
+    static Val parseValue(JsopTokenizer t) {
         if (t.matches('[')) {
             ArrayList<Val> list = new ArrayList<Val>();
             if (!t.matches(']')) {
@@ -118,7 +121,7 @@ public class NodeImpl {
             Val[] array = new Val[list.size()];
             list.toArray(array);
             return Val.get(array);
-        } else if(t.matches(JsopTokenizer.NUMBER)) {
+        } else if (t.matches(JsopTokenizer.NUMBER)) {
             String token = t.getToken();
             if (token.indexOf('.') >= 0) {
                 if (token.indexOf('e') >= 0) {
@@ -132,8 +135,7 @@ public class NodeImpl {
         } else if (t.matches(JsopTokenizer.FALSE)) {
             return Val.FALSE;
         }
-        t.read(JsopTokenizer.STRING);
-        return Val.get(t.getToken());
+        return Val.get(t.readString());
     }
 
 }

Modified: jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java?rev=1084332&r1=1084331&r2=1084332&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestTokenizer.java Tue Mar 22 20:05:38 2011
@@ -24,6 +24,7 @@ import junit.framework.TestCase;
 public class TestTokenizer extends TestCase {
 
     public void test() {
+
         try {
             JsopTokenizer.decode("test\\");
             fail();
@@ -54,7 +55,12 @@ public class TestTokenizer extends TestC
         test("- \"test/test\"", "-\"test\\/test\"");
         test(" {\n\"x\": 1, \"y\": 2\n}\n", "{\"x\":1, \"y\":2}");
         test(" [\ntrue, false, null\n]\n", "[true, false, null]");
-        test("\"-\\\\-\\\"-\\b-\\f-\\n-\\r-\\t-\\u1234\"", "\"-\\\\-\\\"-\\b-\\f-\\n-\\r-\\t-\\u1234\"");
+        test("\"\"", "\"\"");
+        test("\"\\u0003\"", "\"\\u0003\"");
+        test("\"\\u0012\"", "\"\\u0012\"");
+        test("\"\\u0123\"", "\"\\u0123\"");
+        test("\"\\u1234\"", "\"\\u1234\"");
+        test("\"-\\\\-\\\"-\\b-\\f-\\n-\\r-\\t\"", "\"-\\\\-\\\"-\\b-\\f-\\n-\\r-\\t\"");
         test("\"-\\b-\\f-\\n-\\r-\\t\"", "\"-\b-\f-\n-\r-\t\"");
         test(" [\n0, 12, -1, 0.1, -0.1, -2.3e1, 1e+1, 1.e-20\n]\n", "[0,12,-1,0.1,-0.1,-2.3e1,1e+1,1.e-20]");
         test("\"Hello\"", "\"Hello\"");