You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2011/12/20 17:53:53 UTC

svn commit: r1221335 - /jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java

Author: jukka
Date: Tue Dec 20 16:53:52 2011
New Revision: 1221335

URL: http://svn.apache.org/viewvc?rev=1221335&view=rev
Log:
JCR-3005: Make it possible to get multiple nodes in one call via davex

Add support for using POST for requesting multiple nodes.
Don't use automatic node type -based depth configuration when requesting multiple nodes.

Drop the conditional feature flag. I think this is ready for use as an official API.

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java?rev=1221335&r1=1221334&r2=1221335&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java Tue Dec 20 16:53:52 2011
@@ -130,10 +130,9 @@ import org.slf4j.LoggerFactory;
  *   JSON value must not have any trailing ".0" removed.
  * </pre>
  *
- * <!--
  * <h3><a name="mread">Multi Read</a></h3>
  * <p>
- * Since Jackrabbit 2.3.1 it is also possible to request multiple subtrees
+ * Since Jackrabbit 2.3.6 it is also possible to request multiple subtrees
  * in a single request. This is done by adding one or more ":include"
  * parameters to a batch read request describe above. These extra parameters
  * specify the (relative) paths of all the nodes to be included in the
@@ -147,7 +146,6 @@ import org.slf4j.LoggerFactory;
  * $ curl 'http://.../parent.json?:path=child1&:path=child2'
  * {"nodes":{"/parent/child1":{...},"/parent/child2":{...}}}
  * </pre>
- * -->
  *
  * <h3><a name="bwrite">Batch Write</a></h3>
  *
@@ -217,9 +215,6 @@ public abstract class JcrRemotingServlet
 
     private static Logger log = LoggerFactory.getLogger(JcrRemotingServlet.class);
 
-    /** Temporary feature switch, remove when JCR-3005 is resolved. */
-    private static final boolean JCR_3005 = Boolean.getBoolean("JCR-3005");
-
     /**
      * the home init parameter. other relative filesystem paths are
      * relative to this location.
@@ -323,44 +318,24 @@ public abstract class JcrRemotingServlet
             DavResourceLocator locator = davResource.getLocator();
             String path = locator.getRepositoryPath();
 
-            Session session = JcrDavSession.getRepositorySession(
-                    webdavRequest.getDavSession());
+            Session session = getRepositorySession(webdavRequest);
             try {
                 Node node = session.getNode(path);
                 int depth = ((WrappingLocator) locator).getDepth();
-                if (depth < BatchReadConfig.DEPTH_INFINITE) {
-                    NodeType type = node.getPrimaryNodeType();
-                    depth = brConfig.getDepth(type.getName());
-                }
 
                 webdavResponse.setContentType("text/plain;charset=utf-8");
                 webdavResponse.setStatus(DavServletResponse.SC_OK);
                 JsonWriter writer = new JsonWriter(webdavResponse.getWriter());
 
                 String[] includes = webdavRequest.getParameterValues(PARAM_INCLUDE);
-                if (includes == null || !JCR_3005) {
+                if (includes == null) {
+                    if (depth < BatchReadConfig.DEPTH_INFINITE) {
+                        NodeType type = node.getPrimaryNodeType();
+                        depth = brConfig.getDepth(type.getName());
+                    }
                     writer.write(node, depth);
                 } else {
-                    Collection<Node> nodes = new ArrayList<Node>();
-                    Set<String> alreadyAdded = new HashSet<String>();
-                    for (String include : includes) {
-                        try {
-                            Node n;
-                            if (include.startsWith("/")) {
-                                n = session.getNode(include);
-                            } else {
-                                n = node.getNode(include);
-                            }
-                            String np = n.getPath();
-                            if (!alreadyAdded.contains(np)) {
-                                nodes.add(n);
-                                alreadyAdded.add(np);
-                            }
-                        } catch (PathNotFoundException e) {
-                            // skip missing node
-                        }
-                    }
-                    writer.write(nodes, depth);
+                    writeMultiple(writer, node, includes, depth);
                 }
             } catch (PathNotFoundException e) {
                 // properties cannot be requested as json object.
@@ -377,6 +352,31 @@ public abstract class JcrRemotingServlet
         }
     }
 
+    private void writeMultiple(
+            JsonWriter writer, Node node, String[] includes, int depth)
+            throws RepositoryException, IOException {
+        Collection<Node> nodes = new ArrayList<Node>();
+        Set<String> alreadyAdded = new HashSet<String>();
+        for (String include : includes) {
+            try {
+                Node n;
+                if (include.startsWith("/")) {
+                    n = node.getSession().getNode(include);
+                } else {
+                    n = node.getNode(include);
+                }
+                String np = n.getPath();
+                if (!alreadyAdded.contains(np)) {
+                    nodes.add(n);
+                    alreadyAdded.add(np);
+                }
+            } catch (PathNotFoundException e) {
+                // skip missing node
+            }
+        }
+        writer.write(nodes, depth);
+    }
+
     @Override
     protected void doPost(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource)
             throws IOException, DavException {
@@ -388,6 +388,7 @@ public abstract class JcrRemotingServlet
             String loc = null;
             try {
                 String[] pValues;
+                String[] includes = null; // multi-read over POST
                 if ((pValues = data.getParameterValues(PARAM_CLONE)) != null) {
                     loc = clone(session, pValues, davResource.getLocator());
                 } else if ((pValues = data.getParameterValues(PARAM_COPY)) != null) {
@@ -395,6 +396,9 @@ public abstract class JcrRemotingServlet
                 } else if (data.getParameterValues(PARAM_DIFF) != null) {
                     String targetPath = davResource.getLocator().getRepositoryPath();
                     processDiff(session, targetPath, data);
+                } else if ((pValues = data.getParameterValues(PARAM_INCLUDE)) != null
+                        && canHandle(DavMethods.DAV_GET, webdavRequest, davResource)) {
+                    includes = pValues;
                 } else {
                     String targetPath = davResource.getLocator().getRepositoryPath();
                     loc = modifyContent(session, targetPath, data);
@@ -403,6 +407,18 @@ public abstract class JcrRemotingServlet
                 // TODO: append entity
                 if (loc == null) {
                     webdavResponse.setStatus(HttpServletResponse.SC_OK);
+                    if (includes != null) {
+                        webdavResponse.setContentType("text/plain;charset=utf-8");
+                        JsonWriter writer = new JsonWriter(webdavResponse.getWriter());
+
+                        DavResourceLocator locator = davResource.getLocator();
+                        String path = locator.getRepositoryPath();
+
+                        Node node = session.getNode(path);
+                        int depth = ((WrappingLocator) locator).getDepth();
+
+                        writeMultiple(writer, node, includes, depth);
+                    }
                 } else {
                     webdavResponse.setHeader(DeltaVConstants.HEADER_LOCATION, loc);
                     webdavResponse.setStatus(HttpServletResponse.SC_CREATED);