You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2012/08/10 12:12:20 UTC

svn commit: r1371637 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java test/java/org/apache/jackrabbit/mk/json/JsopTest.java

Author: thomasm
Date: Fri Aug 10 10:12:20 2012
New Revision: 1371637

URL: http://svn.apache.org/viewvc?rev=1371637&view=rev
Log:
OAK-19 Consolidate JSON utilities - bugfix in readRawValue()

Modified:
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java?rev=1371637&r1=1371636&r2=1371637&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java Fri Aug 10 10:12:20 2012
@@ -373,7 +373,7 @@ public class JsopTokenizer implements Js
      * Add an asterisk ('[*]') at the given position. This format is used to
      * show where parsing failed in a statement.
      *
-     * @param s     the text
+     * @param s the text
      * @param index the position
      * @return the text with asterisk
      */
@@ -386,13 +386,14 @@ public class JsopTokenizer implements Js
     }
 
     /**
-     * Read a value and return the raw Json representation.
+     * Read a value and return the raw Json representation. This includes arrays
+     * and nested arrays.
      *
      * @return the Json representation of the value
      */
     public String readRawValue() {
         int start = lastPos;
-        while (jsop.charAt(start) <= ' ') {
+        while (start < length && jsop.charAt(start) <= ' ') {
             start++;
         }
         skipRawValue();
@@ -402,13 +403,16 @@ public class JsopTokenizer implements Js
     private void skipRawValue() {
         switch (currentType) {
             case '[': {
-                read();
                 int level = 0;
                 while (true) {
-                    if (matches(']') && level-- == 0) {
-                        break;
+                    if (matches(']')) {
+                        if (--level == 0) {
+                            break;
+                        }
                     } else if (matches('[')) {
                         level++;
+                    } else if (matches(JsopReader.END)) {
+                        throw getFormatException(jsop, pos, "value");
                     } else {
                         read();
                     }

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java?rev=1371637&r1=1371636&r2=1371637&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Fri Aug 10 10:12:20 2012
@@ -31,7 +31,7 @@ public class JsopTest extends TestCase {
             String s = "Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" ";
             StopWatch timer = new StopWatch();
             int t2 = 0;
-            for (int i = 0; i < 10000000; i++) {
+            for (int i = 0; i < 1000000; i++) {
                 t2 += JsopBuilder.encode(s).length();
             }
             System.out.println(timer.seconds() + " dummy: " + t2);
@@ -61,8 +61,9 @@ public class JsopTest extends TestCase {
         assertEquals("\\/Date(0)\\/", t.getEscapedToken());
     }
 
-    public void testNull() {
-        JsopTokenizer t = new JsopTokenizer("null, 1, null, true, false");
+    public void testNullTrueFalse() {
+        JsopTokenizer t;
+        t = new JsopTokenizer("null, 1, null, true, false");
         assertEquals(null, t.read(JsopReader.NULL));
         assertEquals(",", t.read(','));
         assertEquals("1", t.read(JsopReader.NUMBER));
@@ -72,6 +73,14 @@ public class JsopTest extends TestCase {
         assertEquals("true", t.read(JsopReader.TRUE));
         assertEquals(",", t.read(','));
         assertEquals("false", t.read(JsopReader.FALSE));
+        t = new JsopTokenizer("true, false");
+        assertEquals("true", t.read(JsopReader.TRUE));
+        assertEquals(",", t.read(','));
+        assertEquals("false", t.read(JsopReader.FALSE));
+        t = new JsopTokenizer("false, true");
+        assertEquals("false", t.read(JsopReader.FALSE));
+        assertEquals(",", t.read(','));
+        assertEquals("true", t.read(JsopReader.TRUE));
     }
 
     public void testLineLength() {
@@ -103,7 +112,22 @@ public class JsopTest extends TestCase {
     }
 
     public void testRawValue() {
-        JsopTokenizer t = new JsopTokenizer("{\"x\": [1], null, true, {\"y\": 1}, error}");
+        JsopTokenizer t;
+        t = new JsopTokenizer("");
+        try {
+            t.readRawValue();
+            fail();
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+        t = new JsopTokenizer("[unclosed");
+        try {
+            t.readRawValue();
+            fail();
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+        t = new JsopTokenizer("{\"x\": [1], null, true, {\"y\": 1}, [1, 2], [], [[1]], +error+}");
         t.read('{');
         assertEquals("x", t.readString());
         t.read(':');
@@ -114,6 +138,13 @@ public class JsopTest extends TestCase {
         assertEquals("true", t.readRawValue());
         t.read(',');
         assertEquals("{\"y\": 1}", t.readRawValue());
+        t.read(',');
+        assertEquals("[1, 2]", t.readRawValue());
+        t.read(',');
+        assertEquals("[]", t.readRawValue());
+        t.read(',');
+        assertEquals("[[1]]", t.readRawValue());
+        t.read(',');
         try {
             t.readRawValue();
             fail();