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 10:12:13 UTC
svn commit: r1179531 -
/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
Author: jukka
Date: Thu Oct 6 08:12:12 2011
New Revision: 1179531
URL: http://svn.apache.org/viewvc?rev=1179531&view=rev
Log:
JCR-3005: Make it possible to get multiple nodes in one call via davex
Patch by Christian Stocker
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=1179531&r1=1179530&r2=1179531&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 08:12:12 2011
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.server.remoting.davex;
+import java.io.PrintWriter;
+import java.util.logging.Level;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavLocatorFactory;
import org.apache.jackrabbit.webdav.DavMethods;
@@ -214,6 +216,7 @@ public abstract class JcrRemotingServlet
private static final String PARAM_DIFF = ":diff";
private static final String PARAM_COPY = ":copy";
private static final String PARAM_CLONE = ":clone";
+ private static final String PARAM_GET = ":get";
private BatchReadConfig brConfig;
@@ -325,6 +328,10 @@ public abstract class JcrRemotingServlet
String[] pValues;
if ((pValues = data.getParameterValues(PARAM_CLONE)) != null) {
loc = clone(session, pValues, davResource.getLocator());
+ }
+ else if ((pValues = data.getParameterValues(PARAM_GET)) != null) {
+ getMultiple(session, pValues, davResource.getLocator(), webdavResponse);
+ return;
} else if ((pValues = data.getParameterValues(PARAM_COPY)) != null) {
loc = copy(session, pValues, davResource.getLocator());
} else if (data.getParameterValues(PARAM_DIFF) != null) {
@@ -361,6 +368,33 @@ public abstract class JcrRemotingServlet
}
}
+ private boolean getSingle(Session session, String path, DavResourceLocator locator, PrintWriter webdavWriter, boolean isFirst, boolean withPath) throws IOException, RepositoryException {
+ try {
+ Item item = session.getItem(path);
+ JsonWriter writer = new JsonWriter(webdavWriter);
+ if (item.isNode()) {
+ if (!isFirst) {
+ webdavWriter.write(',');
+ }
+ if (withPath) {
+ webdavWriter.write("\"" + path + "\":");
+ }
+ int depth = ((WrappingLocator) locator).getDepth();
+ if (depth < BatchReadConfig.DEPTH_INFINITE) {
+ depth = getDepth((Node) item);
+ }
+ writer.write((Node) item, depth);
+
+ return true;
+ } else {
+ return false;
+ }
+ } catch (PathNotFoundException ex) {
+ return false;
+ }
+ }
+
+
private boolean canHandle(int methodCode, WebdavRequest request, DavResource davResource) {
DavResourceLocator locator = davResource.getLocator();
switch (methodCode) {
@@ -548,6 +582,35 @@ public abstract class JcrRemotingServlet
return (File) servletCtx.getAttribute(ATTR_TMP_DIRECTORY);
}
+ protected void getMultiple(Session session, String[] getArgs, DavResourceLocator locator, WebdavResponse webdavResponse) {
+ try {
+ webdavResponse.setContentType("text/plain;charset=utf-8");
+ webdavResponse.setStatus(DavServletResponse.SC_OK);
+ PrintWriter webdavWriter = webdavResponse.getWriter();
+ Boolean isFirst = true;
+ webdavWriter.write("{\"nodes\": {");
+ String path = locator.getRepositoryPath();
+ if (getSingle(session, path, locator, webdavWriter, isFirst, true)) {
+ isFirst = false;
+ }
+
+ for (String getArg : getArgs) {
+ try {
+ if (!getArg.equals(path) && getSingle(session, getArg, locator, webdavWriter, isFirst, true)) {
+ isFirst = false;
+ }
+ } catch (RepositoryException ex) {
+
+ }
+ }
+ webdavWriter.write("}}");
+ } catch (IOException ex) {
+ java.util.logging.Logger.getLogger(JcrRemotingServlet.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (RepositoryException ex) {
+ java.util.logging.Logger.getLogger(JcrRemotingServlet.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
//--------------------------------------------------------------------------
/**
* Locator factory that specially deals with hrefs having a .json extension.