Return-Path: X-Original-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Delivered-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1B4B798F5 for ; Tue, 26 Jun 2012 23:05:33 +0000 (UTC) Received: (qmail 92391 invoked by uid 500); 26 Jun 2012 23:05:33 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 92371 invoked by uid 500); 26 Jun 2012 23:05:33 -0000 Mailing-List: contact oak-commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oak-commits@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 92362 invoked by uid 99); 26 Jun 2012 23:05:32 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 26 Jun 2012 23:05:32 +0000 X-ASF-Spam-Status: No, hits=-1999.0 required=5.0 tests=ALL_TRUSTED,FRT_ADOBE2 X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 26 Jun 2012 23:05:31 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 78C782388865; Tue, 26 Jun 2012 23:05:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1354284 - in /jackrabbit/oak/trunk/oak-http: pom.xml src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java Date: Tue, 26 Jun 2012 23:05:11 -0000 To: oak-commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120626230511.78C782388865@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 @@ 2.0.0 + com.fasterxml.jackson.core + jackson-databind + 2.0.0 + + com.fasterxml.jackson.dataformat jackson-dataformat-smile 2.0.2 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> iterator = node.fields(); + while (iterator.hasNext()) { + Entry 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) {