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 14:00:07 UTC
svn commit: r1084155 - in /jackrabbit/sandbox/jackrabbit-j3/src:
main/java/org/apache/jackrabbit/j3/json/NodeImpl.java
test/java/org/apache/jackrabbit/j3/json/TestAll.java
test/java/org/apache/jackrabbit/j3/json/TestNode.java
Author: thomasm
Date: Tue Mar 22 13:00:07 2011
New Revision: 1084155
URL: http://svn.apache.org/viewvc?rev=1084155&view=rev
Log:
Node <-> Json
Added:
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/TestNode.java
Modified:
jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestAll.java
Added: 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=1084155&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/json/NodeImpl.java Tue Mar 22 13:00:07 2011
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.j3.json;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+import javax.jcr.PropertyType;
+import org.apache.jackrabbit.j3.mc.Val;
+
+public class NodeImpl {
+
+ private HashMap<String, Val> properties;
+ private LinkedHashMap<String, NodeImpl> childNodes;
+
+ void setProperty(String name, Val value) {
+ if (properties == null) {
+ properties = new HashMap<String, Val>();
+ }
+ if (value == null) {
+ properties.remove(name);
+ } else {
+ properties.put(name, value);
+ }
+ }
+
+ void addChildNode(String name, NodeImpl node) {
+ if (childNodes == null) {
+ childNodes = new LinkedHashMap<String, NodeImpl>();
+ }
+ childNodes.put(name, node);
+ }
+
+ public String toString() {
+ return toString(0);
+ }
+
+ public String toString(int childNodeLevels) {
+ StringBuilder buff = new StringBuilder();
+ buff.append('{');
+ int i = 0;
+ if (properties != null) {
+ for (Entry<String, Val> p : properties.entrySet()) {
+ if (i++ > 0) {
+ buff.append(",\n");
+ }
+ buff.append(JsopTokenizer.encode(p.getKey())).append(": ");
+ buff.append(p.getValue());
+ }
+ }
+ if (childNodes != null) {
+ if (i++ > 0) {
+ buff.append(",\n");
+ }
+ buff.append("\":childNodeCount\": ").append(childNodes.size());
+ if (childNodeLevels > 0) {
+ for (Entry<String, NodeImpl> c : childNodes.entrySet()) {
+ if (i++ > 0) {
+ buff.append(",\n");
+ }
+ buff.append(JsopTokenizer.encode(c.getKey())).append(": ");
+ buff.append(c.getValue().toString(childNodeLevels - 1));
+ }
+ }
+ }
+ buff.append("\n}");
+ return buff.toString();
+ }
+
+ public static NodeImpl fromString(String json) {
+ JsopTokenizer t = new JsopTokenizer(json);
+ t.read('{');
+ return parse(t);
+ }
+
+ private static NodeImpl parse(JsopTokenizer t) {
+ NodeImpl node = new NodeImpl();
+ if (!t.matches('}')) {
+ do {
+ String key = t.read(JsopTokenizer.STRING);
+ t.read(':');
+ if (t.matches('{')) {
+ node.addChildNode(key, parse(t));
+ } else {
+ Val val = parseValue(t);
+ node.setProperty(key, val);
+ }
+ } while (t.matches(','));
+ t.read('}');
+ }
+ return node;
+ }
+
+ private static Val parseValue(JsopTokenizer t) {
+ if (t.matches('[')) {
+ ArrayList<Val> list = new ArrayList<Val>();
+ if (!t.matches(']')) {
+ do {
+ list.add(parseValue(t));
+ } while (t.matches(','));
+ t.read(']');
+ }
+ Val[] array = new Val[list.size()];
+ list.toArray(array);
+ return Val.get(array);
+ } else if(t.matches(JsopTokenizer.NUMBER)) {
+ String token = t.getToken();
+ if (token.indexOf('.') >= 0) {
+ if (token.indexOf('e') >= 0) {
+ return Val.get(Double.parseDouble(token));
+ }
+ return Val.get(PropertyType.DECIMAL, token);
+ }
+ return Val.get(Long.parseLong(token));
+ } else if (t.matches(JsopTokenizer.TRUE)) {
+ return Val.TRUE;
+ } else if (t.matches(JsopTokenizer.FALSE)) {
+ return Val.FALSE;
+ }
+ t.read(JsopTokenizer.STRING);
+ return Val.get(t.getToken());
+ }
+
+}
Modified: jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestAll.java?rev=1084155&r1=1084154&r2=1084155&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestAll.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestAll.java Tue Mar 22 13:00:07 2011
@@ -35,6 +35,7 @@ public class TestAll extends TestCase {
public static Test suite() {
TestSuite suite = new TestSuite("org.apache.jackrabbit.j3.json");
+ suite.addTestSuite(TestNode.class);
suite.addTestSuite(TestTokenizer.class);
return suite;
Added: jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestNode.java?rev=1084155&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestNode.java (added)
+++ jackrabbit/sandbox/jackrabbit-j3/src/test/java/org/apache/jackrabbit/j3/json/TestNode.java Tue Mar 22 13:00:07 2011
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.j3.json;
+
+import junit.framework.TestCase;
+
+/**
+ * Test converting a node to Json and back.
+ */
+public class TestNode extends TestCase {
+
+ public void test() {
+ NodeImpl node;
+
+ node = NodeImpl.fromString("{\"id\": 1}");
+ assertEquals("{\"id\": 1\n}", node.toString());
+
+ node = NodeImpl.fromString("{\"id\": 1, \"name\": \"Hello World\"}");
+ assertEquals("{\"id\": 1,\n\"name\": \"Hello World\"\n}", node.toString());
+
+ node = NodeImpl.fromString("{\"id\": 1, \"c1\": {}}");
+ assertEquals("{\"id\": 1,\n\":childNodeCount\": 1\n}", node.toString());
+ assertEquals("{\"id\": 1,\n\":childNodeCount\": 1\n}", node.toString(0));
+ assertEquals("{\"id\": 1,\n\":childNodeCount\": 1,\n\"c1\": {\n}\n}", node.toString(1));
+
+ node = NodeImpl.fromString("{\"t\": true, \"f\": false}");
+ assertEquals("{\"f\": false,\n\"t\": true\n}", node.toString());
+
+ node = NodeImpl.fromString("{\"id\": []}");
+ assertEquals("{\"id\": [ ]\n}", node.toString());
+ node = NodeImpl.fromString("{\"id\": [1]}");
+ assertEquals("{\"id\": [ 1 ]\n}", node.toString());
+ node = NodeImpl.fromString("{\"id\": [1, 2]}");
+ assertEquals("{\"id\": [ 1, 2 ]\n}", node.toString());
+ node.setProperty("id", null);
+ assertEquals("{\n}", node.toString());
+
+ node = NodeImpl.fromString("{\"long\": -230, \"decimal\": 230.0, \"double\": 230.0e1}");
+ assertEquals("{\"double\": /* Double */ 2300.0,\n\"long\": -230,\n\"decimal\": /* Decimal */ 230.0\n}", node.toString());
+
+ }
+
+}