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 11:01:33 UTC

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

Author: jukka
Date: Thu Oct  6 09:01:32 2011
New Revision: 1179541

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

Collect all results to a Map before serializing the JSON result inside the JsonWriter class

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonWriter.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=1179541&r1=1179540&r2=1179541&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 09:01:32 2011
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Workspace;
@@ -54,7 +55,9 @@ import javax.servlet.http.HttpServletRes
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 /**
  * <code>JcrRemotingServlet</code> is an extended version of the
@@ -366,33 +369,6 @@ 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) {
@@ -581,29 +557,29 @@ public abstract class JcrRemotingServlet
     }
 
     protected void getMultiple(
-            Session session, String[] getArgs, DavResourceLocator locator,
+            Session session, String[] paths, DavResourceLocator locator,
             WebdavResponse webdavResponse)
             throws IOException, RepositoryException {
-        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) {
+        // Collect all requested nodes
+        Map<String, Node> nodes = new HashMap<String, Node>();
+        Node node = session.getNode(locator.getRepositoryPath());
+        nodes.put(node.getPath(), node);
+        for (String path : paths) {
             try {
-                if (!getArg.equals(path) && getSingle(session, getArg, locator, webdavWriter, isFirst, true)) {
-                    isFirst = false;
-                }
-            } catch (RepositoryException ex) {
-
+                nodes.put(path, session.getNode(path));
+            } catch (PathNotFoundException ignore) {
+                // skip a missing node
             }
         }
-        webdavWriter.write("}}");
+
+        int depth = ((WrappingLocator) locator).getDepth();
+        if (depth < BatchReadConfig.DEPTH_INFINITE) {
+            depth = getDepth(node);
+        }
+
+        webdavResponse.setContentType("text/plain;charset=utf-8");
+        webdavResponse.setStatus(DavServletResponse.SC_OK);
+        new JsonWriter(webdavResponse.getWriter()).write(nodes, depth);
     }
 
     //--------------------------------------------------------------------------

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonWriter.java?rev=1179541&r1=1179540&r2=1179541&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonWriter.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonWriter.java Thu Oct  6 09:01:32 2011
@@ -25,6 +25,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import java.io.Writer;
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.commons.json.JsonUtil;
@@ -68,6 +69,25 @@ class JsonWriter {
         write(node, 0, maxLevels);
     }
 
+    void write(Map<String, Node> nodes, int maxLevels)
+            throws RepositoryException, IOException {
+        writer.write('{');
+        writeKey(writer, "nodes");
+        writer.write('{');
+        boolean first = true;
+        for (Map.Entry<String, Node> entry : nodes.entrySet()) {
+            if (first) {
+                first = false;
+            } else {
+                writer.write(',');
+            }
+            writeKey(writer, entry.getKey());
+            write(entry.getValue(), maxLevels);
+        }
+        writer.write('}');
+        writer.write('}');
+    }
+
     private void write(Node node, int currentLevel, int maxLevels)
             throws RepositoryException, IOException {
         // start of node info