incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From vram...@apache.org
Subject svn commit: r766087 - in /incubator/sling/trunk/bundles/commons/json/src: main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java
Date Fri, 17 Apr 2009 17:12:58 GMT
Author: vramdal
Date: Fri Apr 17 17:12:57 2009
New Revision: 766087

URL: http://svn.apache.org/viewvc?rev=766087&view=rev
Log:
SLING-930 Adding o.a.s.c.json.jcr.JsonJcrNode + testcase

Added:
    incubator/sling/trunk/bundles/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java
    incubator/sling/trunk/bundles/commons/json/src/test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java

Added: incubator/sling/trunk/bundles/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java?rev=766087&view=auto
==============================================================================
--- incubator/sling/trunk/bundles/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java
(added)
+++ incubator/sling/trunk/bundles/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonJcrNode.java
Fri Apr 17 17:12:57 2009
@@ -0,0 +1,132 @@
+package org.apache.sling.commons.json.jcr;
+
+import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.commons.json.JSONException;
+
+import javax.jcr.*;
+import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * This class makes it easy to create a JSON object out of a JCR node. It is a shameless
copy of {@link JsonItemWriter},
+ * but instead of writing the resulting JSON directly to an output, you get a JSONObject
that you can deal with.
+ *
+ * @author vidar@idium.no
+ * @since Apr 17, 2009 6:55:30 PM
+ */
+public class JsonJcrNode extends JSONObject {
+
+    private Node node;
+    private Set<String> propertyNamesToIgnore;
+
+    /**
+     * Creates a JSONObject out of <code>node</code>. All <code>node</code>'s
properties will be reflected in the JSON
+     * object. In addition, properties <code>jcr:path</code> and <code>jcr:name</code>
are added. Their values are
+     * those returned by <code>node.getPath()</code> and <code>node.getName()</code>,
respectively.
+     * @param node The JCR node to use
+     * @throws JSONException If there's a problem generating the JSON object
+     * @throws RepositoryException If there's a problem reading data from the JCR repository
+     */
+    public JsonJcrNode(Node node) throws JSONException, RepositoryException {
+        this(node, null);
+    }
+
+    /**
+     * Creates a <code>JSONObject</code> out of <code>node</code>.
All <code>node</code>'s properties will be reflected
+     * in the JSON object, except those in <code>propertyNamesToIgnore</code>.
In addition, properties
+     * <code>jcr:path</code> and <code>jcr:name</code> are added.
Their values are those returned by
+     * <code>node.getPath()</code> and <code>node.getName()</code>,
respectively.
+     * @param node The JCR node to use
+     * @param propertyNamesToIgnore A set of property names that should <em>not</em>
be reflected in the resulting
+     * JSON object.
+     * @throws JSONException If there's a problem generating the JSON object
+     * @throws RepositoryException If there's a problem reading data from the JCR repository
+     */
+    public JsonJcrNode(Node node, Set<String> propertyNamesToIgnore) throws JSONException,
RepositoryException {
+        this.node = node;
+        this.propertyNamesToIgnore = propertyNamesToIgnore;
+        this.populate();
+    }
+
+    private void populate() throws JSONException, RepositoryException {
+        PropertyIterator properties = node.getProperties();
+        addNative("jcr:path", node.getPath());
+        addNative("jcr:name", node.getName());
+        while (properties.hasNext()) {
+            Property prop = properties.nextProperty();
+            String name = prop.getName();
+            if (propertyNamesToIgnore != null && propertyNamesToIgnore.contains(name))
{
+                continue;
+            }
+            addProperty(prop);
+        }
+    }
+
+    private void addNative(String key, String value) throws JSONException, RepositoryException
{
+        if (propertyNamesToIgnore == null || !propertyNamesToIgnore.contains(key)) {
+            this.put(key, value);
+        }
+    }
+
+    protected void addProperty(Property p)
+            throws ValueFormatException, RepositoryException, JSONException {
+        // special handling for binaries: we dump the length and not the length
+        if (p.getType() == PropertyType.BINARY) {
+            // TODO for now we mark binary properties with an initial colon in
+            // their name
+            // (colon is not allowed as a JCR property name)
+            // in the name, and the value should be the size of the binary data
+            String key = ":" + p.getName();
+            if (!p.getDefinition().isMultiple()) {
+                this.put(key, p.getLength());
+            } else {
+                final long[] sizes = p.getLengths();
+                List<Long> list = new ArrayList<Long>();
+                for (long value : sizes) {
+                    list.add(value);
+                }
+                this.put(key, list);
+            }
+        } else {
+            String key = p.getName();
+
+            if (!p.getDefinition().isMultiple()) {
+                addValue(key, p.getValue());
+            } else {
+                for (Value v : p.getValues()) {
+                    addValue(key, v);
+                }
+            }
+        }
+    }
+
+    protected void addValue(String key, Value v) throws IllegalStateException, RepositoryException,
JSONException {
+
+        switch (v.getType()) {
+            case PropertyType.BINARY:
+                this.accumulate(key, 0);
+                break;
+
+            case PropertyType.DATE:
+                this.accumulate(key, JsonItemWriter.format(v.getDate()));
+                break;
+
+            case PropertyType.BOOLEAN:
+                this.accumulate(key, v.getBoolean());
+                break;
+
+            case PropertyType.LONG:
+                this.accumulate(key, v.getLong());
+                break;
+
+            case PropertyType.DOUBLE:
+                this.accumulate(key, v.getDouble());
+                break;
+            default:
+                this.accumulate(key, v.getString());
+        }
+    }
+
+
+}

Added: incubator/sling/trunk/bundles/commons/json/src/test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/commons/json/src/test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java?rev=766087&view=auto
==============================================================================
--- incubator/sling/trunk/bundles/commons/json/src/test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java
(added)
+++ incubator/sling/trunk/bundles/commons/json/src/test/java/org/apache/sling/commons/json/jcr/JsonJcrNodeTest.java
Fri Apr 17 17:12:57 2009
@@ -0,0 +1,31 @@
+package org.apache.sling.commons.json.jcr;
+
+import junit.framework.TestCase;
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.testing.jcr.MockNode;
+
+import javax.jcr.RepositoryException;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author vidar@idium.no
+ * @since Apr 17, 2009 6:57:04 PM
+ */
+public class JsonJcrNodeTest extends TestCase {
+
+    public void testJcrJsonObject() throws RepositoryException, JSONException {
+        MockNode node = new MockNode("/node1");
+        node.setProperty("prop1", "value1");
+        node.setProperty("prop2", "value2");
+        Set<String> ignoredProperties = new HashSet<String>();
+        ignoredProperties.add("prop2");
+        JsonJcrNode json = new JsonJcrNode(node, ignoredProperties);
+        assertTrue("Did not create property", json.has("prop1"));
+        assertFalse("Created ignored property", json.has("prop2"));
+        assertTrue("Did not create jcr:name", json.has("jcr:name"));
+        assertTrue("Did not create jcr:path", json.has("jcr:path"));
+    }
+
+
+}



Mime
View raw message