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 ju...@apache.org on 2012/06/27 01:05:11 UTC

svn commit: r1354284 - in /jackrabbit/oak/trunk/oak-http: pom.xml src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java

Author: jukka
Date: Tue Jun 26 23:05:10 2012
New Revision: 1354284

URL: http://svn.apache.org/viewvc?rev=1354284&view=rev
Log:
OAK-104: HTTP bindings for Oak

Add simple content modification support

Modified:
    jackrabbit/oak/trunk/oak-http/pom.xml
    jackrabbit/oak/trunk/oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java

Modified: jackrabbit/oak/trunk/oak-http/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-http/pom.xml?rev=1354284&r1=1354283&r2=1354284&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-http/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-http/pom.xml Tue Jun 26 23:05:10 2012
@@ -92,6 +92,11 @@
       <version>2.0.0</version>
     </dependency>
     <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.0.0</version>
+    </dependency>
+    <dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-smile</artifactId>
       <version>2.0.2</version>

Modified: jackrabbit/oak/trunk/oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java?rev=1354284&r1=1354283&r2=1354284&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java (original)
+++ jackrabbit/oak/trunk/oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java Tue Jun 26 23:05:10 2012
@@ -19,6 +19,8 @@ package org.apache.jackrabbit.oak.http;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Map.Entry;
 
 import javax.jcr.GuestCredentials;
 import javax.jcr.NoSuchWorkspaceException;
@@ -29,16 +31,22 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.core.DefaultConflictHandler;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryValueFactory;
 
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.smile.SmileFactory;
 
 public class OakServlet extends HttpServlet {
@@ -62,13 +70,9 @@ public class OakServlet extends HttpServ
             try {
                 Root root = session.getCurrentRoot();
                 Tree tree = root.getTree(request.getPathInfo());
-                if (tree != null) {
-                    JsonGenerator generator = getRenderer(request, response);
-                    int depth = getDepth(request);
-                    render(tree, depth, generator);
-                } else {
-                    response.sendError(HttpServletResponse.SC_NOT_FOUND);
-                }
+                request.setAttribute("root", root);
+                request.setAttribute("tree", tree);
+                super.service(request, response);
             } finally {
                 session.close();
             }
@@ -79,6 +83,93 @@ public class OakServlet extends HttpServ
         }
     }
 
+    @Override
+    protected void doGet(
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
+        Tree tree = (Tree) request.getAttribute("tree");
+        render(tree, getDepth(request), getRenderer(request, response));
+    }
+
+    @Override
+    protected void doPost(
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
+        try {
+            Root root = (Root) request.getAttribute("root");
+            Tree tree = (Tree) request.getAttribute("tree");
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode node = mapper.readTree(request.getInputStream());
+            if (node.isObject()) {
+                post(node, tree);
+                root.commit(DefaultConflictHandler.OURS);
+                doGet(request, response);
+            } else {
+                response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+            }
+        } catch (CommitFailedException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private void post(JsonNode node, Tree tree) {
+        Iterator<Entry<String, JsonNode>> iterator = node.fields();
+        while (iterator.hasNext()) {
+            Entry<String, JsonNode> entry = iterator.next();
+            String name = entry.getKey();
+            JsonNode value = entry.getValue();
+            if (value.isObject()) {
+                if (tree.hasProperty(name)) {
+                    tree.removeProperty(name);
+                }
+                Tree child = tree.getChild(name);
+                if (child == null) {
+                    child = tree.addChild(name);
+                }
+                post(value, child);
+            } else {
+                if (tree.hasChild(name)) {
+                    tree.removeChild(name);
+                }
+                CoreValueFactory vf = MemoryValueFactory.INSTANCE;
+                if (value.isNull()) {
+                    tree.removeProperty(name);
+                } else if (value.isBoolean()) {
+                    tree.setProperty(name, vf.createValue(value.asBoolean()));
+                } else if (value.isLong()) {
+                    tree.setProperty(name, vf.createValue(value.asLong()));
+                } else if (value.isDouble()) {
+                    tree.setProperty(name, vf.createValue(value.asDouble()));
+                } else if (value.isBigDecimal()) {
+                    tree.setProperty(name, vf.createValue(value.decimalValue()));
+                } else {
+                    tree.setProperty(name, vf.createValue(value.asText()));
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void doDelete(
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
+        try {
+            Root root = (Root) request.getAttribute("root");
+            Tree tree = (Tree) request.getAttribute("tree");
+            Tree parent = tree.getParent();
+            if (parent != null) {
+                parent.removeChild(tree.getName());
+                root.commit(DefaultConflictHandler.OURS);
+                response.sendError(HttpServletResponse.SC_OK);
+            } else {
+                // Can't remove the root node
+                response.sendError(HttpServletResponse.SC_FORBIDDEN);
+            }
+        } catch (CommitFailedException e) {
+            throw new ServletException(e);
+        }
+    }
+
     private int getDepth(HttpServletRequest request) {
         String d = request.getParameter("depth");
         if (d == null) {