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/09/05 17:12:52 UTC

svn commit: r1165320 - in /jackrabbit/sandbox/microkernel/src: main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java test/java/org/apache/jackrabbit/mk/json/JsopTest.java

Author: thomasm
Date: Mon Sep  5 15:12:52 2011
New Revision: 1165320

URL: http://svn.apache.org/viewvc?rev=1165320&view=rev
Log:
Slightly improved Jsop tokenizer and builder

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java?rev=1165320&r1=1165319&r2=1165320&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java Mon Sep  5 15:12:52 2011
@@ -216,10 +216,17 @@ public class JsopBuilder {
         if (length == 0) {
             return "\"\"";
         }
+        for (int i = 0; i < length; i++) {
+            char c = s.charAt(i);
+            if (c == '\"' || c == '\\' || c < ' ' || c >= 127) {
+                StringBuilder buff = new StringBuilder(length + 2 + length / 8);
+                buff.append('\"');
+                escape(s, length, buff);
+                return buff.append('\"').toString();
+            }
+        }
         StringBuilder buff = new StringBuilder(length + 2);
-        buff.append('\"');
-        escape(s, length, buff);
-        return buff.append('\"').toString();
+        return buff.append('\"').append(s).append('\"').toString();
     }
 
     /**
@@ -233,55 +240,54 @@ public class JsopBuilder {
         for (int i = 0; i < length; i++) {
             char c = s.charAt(i);
             switch (c) {
-                case '"':
-                    // quotation mark
-                    buff.append("\\\"");
-                    break;
-                case '\\':
-                    // backslash
-                    buff.append("\\\\");
-                    break;
-                case '\b':
-                    // backspace
-                    buff.append("\\b");
-                    break;
-                case '\f':
-                    // formfeed
-                    buff.append("\\f");
-                    break;
-                case '\n':
-                    // newline
-                    buff.append("\\n");
-                    break;
-                case '\r':
-                    // carriage return
-                    buff.append("\\r");
-                    break;
-                case '\t':
-                    // horizontal tab
-                    buff.append("\\t");
-                    break;
-                default:
-                    int ch = c;
-                    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");
-                        String hex = Integer.toHexString(c);
-                        for (int len = hex.length(); len < 4; len++) {
-                            buff.append('0');
-                        }
-                        buff.append(hex);
-                    } else {
-                        buff.append(c);
+            case '"':
+                // quotation mark
+                buff.append("\\\"");
+                break;
+            case '\\':
+                // backslash
+                buff.append("\\\\");
+                break;
+            case '\b':
+                // backspace
+                buff.append("\\b");
+                break;
+            case '\f':
+                // formfeed
+                buff.append("\\f");
+                break;
+            case '\n':
+                // newline
+                buff.append("\\n");
+                break;
+            case '\r':
+                // carriage return
+                buff.append("\\r");
+                break;
+            case '\t':
+                // horizontal tab
+                buff.append("\\t");
+                break;
+            default:
+                if (c < ' ') {
+                    // 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 (c >= 127) {
+                    // ascii only mode
+                    buff.append("\\u");
+                    String hex = Integer.toHexString(c);
+                    for (int len = hex.length(); len < 4; len++) {
+                        buff.append('0');
                     }
+                    buff.append(hex);
+                } else {
+                    buff.append(c);
+                }
             }
         }
     }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java?rev=1165320&r1=1165319&r2=1165320&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java Mon Sep  5 15:12:52 2011
@@ -238,7 +238,7 @@ public class JsopTokenizer {
                 } else if (ch >= 'a' && ch <= 'z') {
                     while (pos < length) {
                         ch = jsop.charAt(pos);
-                        if ((ch < 'a' || ch > 'z') && (ch < '0' || ch > '9')) {
+                        if ((ch < 'a' || ch > 'z') && ch != '_' && (ch < '0' || ch > '9')) {
                             break;
                         }
                         pos++;
@@ -372,6 +372,9 @@ public class JsopTokenizer {
      */
     public String readRawValue() {
         int start = lastPos;
+        while (jsop.charAt(start) <= ' ') {
+            start++;
+        }
         skipRawValue();
         return jsop.substring(start, lastPos);
     }

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java?rev=1165320&r1=1165319&r2=1165320&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Mon Sep  5 15:12:52 2011
@@ -25,6 +25,22 @@ import java.io.IOException;
  */
 public class JsopTest extends TestCase {
 
+    // run the micro-benchmark
+    public static void main(String... args) {
+        for (int k = 0; k < 5; k++) {
+            // String s = "Hello World Hello World Hello World Hello World Hello World Hello World ";
+            String s = "Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" Hello \"World\" ";
+            long t = System.currentTimeMillis();
+            int t2 = 0;
+            for (int i = 0; i < 10000000; i++) {
+                t2 += JsopBuilder.encode(s).length();
+            }
+            System.out.println(System.currentTimeMillis() - t);
+        }
+        // old: not escaped: 5691 ms; escaped: 10609 ms
+        // new: not escaped: 3931 ms; escaped: 11001 ms
+    }
+
     public void testDataType() {
         String dateString = new JsopBuilder().
                 key("string").value("/Date(0)/").
@@ -84,13 +100,13 @@ public class JsopTest extends TestCase {
         t.read('{');
         assertEquals("x", t.readString());
         t.read(':');
-        assertEquals(" [1]", t.readRawValue());
+        assertEquals("[1]", t.readRawValue());
         t.read(',');
-        assertEquals(" null", t.readRawValue());
+        assertEquals("null", t.readRawValue());
         t.read(',');
-        assertEquals(" true", t.readRawValue());
+        assertEquals("true", t.readRawValue());
         t.read(',');
-        assertEquals(" {\"y\": 1}", t.readRawValue());
+        assertEquals("{\"y\": 1}", t.readRawValue());
         try {
             t.readRawValue();
             fail();