Author: reschke
Date: Mon Oct  6 17:24:46 2014
New Revision: 1629714

URL: http://svn.apache.org/r1629714
Log:
OAK-1941 - replace JSON serialization using json-simple by custom serializer

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1629714&r1=1629713&r2=1629714&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
 Mon Oct  6 17:24:46 2014
@@ -699,17 +699,6 @@ public class RDBDocumentStore implements
         }
     }
 
-    private static String asString(@Nonnull Document doc) {
-        JSONObject obj = new JSONObject();
-        for (String key : doc.keySet()) {
-            if (! COLUMNPROPERTIES.contains(key)) {
-                Object value = doc.get(key);
-                obj.put(key, value);
-            }
-        }
-        return obj.toJSONString();
-    }
-
     private <T extends Document> T fromDBRow(Collection<T> collection, DBRow 
row) throws ParseException {
         T doc = collection.newDocument(this);
         doc.put("_id", row.id);
@@ -1256,4 +1245,103 @@ public class RDBDocumentStore implements
             this.data = data;
         }
     }
+
+    // custom serializer
+    private static String asString(@Nonnull Document doc) {
+        StringBuilder sb = new StringBuilder(32768);
+        sb.append("{");
+        boolean needComma = false;
+        for (String key : doc.keySet()) {
+            if (!COLUMNPROPERTIES.contains(key)) {
+                if (needComma) {
+                    sb.append(",");
+                }
+                Object value = doc.get(key);
+                sb.append("\"");
+                appendEscapedString(sb, key);
+                sb.append("\":");
+                if (value == null) {
+                    sb.append("null");
+                } else if (value instanceof Number) {
+                    sb.append(value.toString());
+                } else if (value instanceof Boolean) {
+                    sb.append(value.toString());
+                } else if (value instanceof String) {
+                    sb.append("\"");
+                    appendEscapedString(sb, (String) value);
+                    sb.append("\"");
+                } else if (value instanceof Map) {
+                    serializeMap(sb, (Map<Object, Object>) value);
+                } else {
+                    throw new RuntimeException("unexpected type: " + 
value.getClass());
+                }
+                needComma = true;
+            }
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    private static void serializeMap(StringBuilder sb, Map<Object, Object> 
map) {
+        sb.append("{");
+        boolean needComma = false;
+        for (Map.Entry<Object, Object> e : map.entrySet()) {
+            if (needComma) {
+                sb.append(",");
+            }
+            Object value = e.getValue();
+            sb.append("\"");
+            appendEscapedString(sb, e.getKey().toString());
+            sb.append("\":");
+            if (value == null) {
+                sb.append("null");
+            } else if (value instanceof Number) {
+                sb.append(value.toString());
+            } else if (value instanceof String) {
+                sb.append("\"");
+                appendEscapedString(sb, (String) value);
+                sb.append("\"");
+            } else if (value instanceof Boolean) {
+                sb.append(value.toString());
+            } else if (value instanceof Map) {
+                serializeMap(sb, (Map) value);
+            } else {
+                throw new RuntimeException("unexpected type");
+            }
+            needComma = true;
+        }
+        sb.append("}");
+    }
+
+    private static String[] JSONCONTROLS = new String[] { "\\u0000", 
"\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005",
+            "\\u0006", "\\u0007", "\\b", "\\t", "\\n", "\\u000b", "\\f", 
"\\r", "\\u000e", "\\u000f", "\\u0010", "\\u0011",
+            "\\u0012", "\\u0013", "\\u0014", "\\u0015", "\\u0016", "\\u0017", 
"\\u0018", "\\u0019", "\\u001a", "\\u001b",
+            "\\u001c", "\\u001d", "\\u001e", "\\u001f" };
+
+    private static void appendEscapedString(StringBuilder sb, String s) {
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+            if (c == '\"') {
+                sb.append("\\\"");
+            } else if (c == '\\') {
+                sb.append("\\\\");
+            } else if (c >= 0 && c < 0x20) {
+                sb.append(JSONCONTROLS[c]);
+            } else {
+                sb.append(c);
+            }
+        }
+    }
+
+    // JSON simple serializer
+//    private static String asString(@Nonnull Document doc) {
+//        JSONObject obj = new JSONObject();
+//        for (String key : doc.keySet()) {
+//            if (! COLUMNPROPERTIES.contains(key)) {
+//                Object value = doc.get(key);
+//                obj.put(key, value);
+//            }
+//        }
+//        return obj.toJSONString();
+//    }
 }


Reply via email to