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/10/06 14:55:45 UTC
svn commit: r1179606 -
/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
Author: jukka
Date: Thu Oct 6 12:55:45 2011
New Revision: 1179606
URL: http://svn.apache.org/viewvc?rev=1179606&view=rev
Log:
JCR-3005: Make it possible to get multiple nodes in one call via davex
Allow also POST requests for the multi read feature.
Add documentation.
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=1179606&r1=1179605&r2=1179606&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 Thu Oct 6 12:55:45 2011
@@ -66,6 +66,7 @@ import org.slf4j.LoggerFactory;
* that provides improved
* <ul>
* <li><a href="#bread">Batch read</a></li>
+ * <li><a href="#mread">Multi read</a></li>
* <li><a href="#bwrite">Batch write</a></li>
* </ul>
* functionality and supports cross workspace copy and cloning.
@@ -128,6 +129,24 @@ 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
+ * in a single request. This is done by sending a GET or a POST request to
+ * a workspace request and specifying the paths of the selected subtrees
+ * as ":path" parameters of the request. The response is a JSON object
+ * whose "nodes" property contains all the selected nodes keyed by
+ * path. Missing nodes are not included in the response. Each included
+ * node is serialized as defined above for <a href="#bread">batch read</a>.
+ * The configured default subtree depth can be overridden by specifying the
+ * optional ":depth" parameter.
+ * <p>
+ * Example:
+ * <pre>
+ * $ curl 'http://localhost:8080/server/default?:path=/node1&:path=/node2'
+ * {"nodes":{"/node1":{...},"/node2":{...}}}
+ * </pre>
+ *
* <h3><a name="bwrite">Batch Write</a></h3>
*
* The complete SPI Batch is sent to the server in a single request, currently a
@@ -324,7 +343,9 @@ public abstract class JcrRemotingServlet
@Override
protected void doPost(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource)
throws IOException, DavException {
- if (canHandle(DavMethods.DAV_POST, webdavRequest, davResource)) {
+ if (doGetMultiple(webdavRequest, webdavResponse, davResource)) {
+ // request was handled by the multi-get handler
+ } else if (canHandle(DavMethods.DAV_POST, webdavRequest, davResource)) {
// special remoting request: the defined parameters are exclusive
// and cannot be combined.
Session session = getRepositorySession(webdavRequest);
@@ -557,9 +578,22 @@ public abstract class JcrRemotingServlet
return (File) servletCtx.getAttribute(ATTR_TMP_DIRECTORY);
}
+ /**
+ * Conditionally processes a multi read request.
+ *
+ * @since Apache Jackrabbit 2.3.1
+ * @param request request object
+ * @param response response object
+ * @param resource resource object
+ * @return <code>true</code> if this was a multi read request,
+ * <code>false</code> otherwise
+ * @throws IOException if the response could not be written
+ * @throws DavException if another error occurred
+ */
protected boolean doGetMultiple(
WebdavRequest request, WebdavResponse response,
DavResource resource) throws IOException, DavException {
+ // Check if this is a multi-GET request
String[] paths = request.getParameterValues(PARAM_PATH);
if (paths == null
|| resource.getLocator().getWorkspaceName() == null
@@ -567,7 +601,7 @@ public abstract class JcrRemotingServlet
return false;
}
- // Get the depth
+ // Get the depth (TODO: support depth per node type)
int depth = brConfig.getDefaultDepth();
String depthParam = request.getParameter(PARAM_DEPTH);
if (depthParam != null) {
@@ -600,6 +634,7 @@ public abstract class JcrRemotingServlet
}
}
+ // Send the response
response.setContentType("text/plain;charset=utf-8");
response.setStatus(DavServletResponse.SC_OK);
try {