You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by st...@apache.org on 2012/04/05 22:11:58 UTC

svn commit: r1310044 - /jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java

Author: stefan
Date: Thu Apr  5 20:11:58 2012
New Revision: 1310044

URL: http://svn.apache.org/viewvc?rev=1310044&view=rev
Log:
OAK-47: NPE with nested add&copy operation

Modified:
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java?rev=1310044&r1=1310043&r2=1310044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java Thu Apr  5 20:11:58 2012
@@ -141,6 +141,13 @@ public class CommitBuilder {
         MutableNode destParent = getOrCreateStagedNode(destParentPath);
         destParent.add(new ChildNode(destNodeName, srcCNE.getId()));
 
+        if (srcCNE.getId() == null) {
+            // a 'new' node is being copied
+
+            // update staging area
+            copyStagedNodes(srcPath, destPath);
+        }
+
         // update change log
         changeLog.add(new CopyNode(srcPath, destPath));
     }
@@ -269,6 +276,17 @@ public class CommitBuilder {
         }
     }
 
+    void copyStagedNodes(String srcPath, String destPath) throws Exception {
+        MutableNode node = staged.get(srcPath);
+        if (node != null) {
+            staged.put(destPath, new MutableNode(node, store, destPath));
+            for (Iterator<String> it = node.getChildNodeNames(0, -1); it.hasNext(); ) {
+                String childName = it.next();
+                copyStagedNodes(PathUtils.concat(srcPath, childName), PathUtils.concat(destPath, childName));
+            }
+        }
+    }
+
     void removeStagedNodes(String nodePath) throws Exception {
         MutableNode node = staged.get(nodePath);
         if (node != null) {