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/05/04 14:16:11 UTC

svn commit: r1333899 - in /jackrabbit/oak/trunk: oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java

Author: stefan
Date: Fri May  4 12:16:10 2012
New Revision: 1333899

URL: http://svn.apache.org/viewvc?rev=1333899&view=rev
Log:
OAK-83: Copy operation would recurse indefinitely if memory permitted

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

Modified: jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java?rev=1333899&r1=1333898&r2=1333899&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java (original)
+++ jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java Fri May  4 12:16:10 2012
@@ -255,6 +255,17 @@ public class MicroKernelIT extends Abstr
     }
 
     @Test
+    public void copyToDescendant() {
+        mk.commit("/",
+                "+\"test/child\":{}\n" +
+                "*\"test\":\"test/copy\"\n",
+                null, "");
+
+        assertTrue(mk.nodeExists("/test/child", null));
+        assertTrue(mk.nodeExists("/test/copy/child", null));
+    }
+
+    @Test
     public void getNodes() {
         String head = mk.getHeadRevision();
 

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=1333899&r1=1333898&r2=1333899&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 Fri May  4 12:16:10 2012
@@ -284,13 +284,18 @@ public class CommitBuilder {
         }
     }
 
-    void copyStagedNodes(String srcPath, String destPath) throws Exception {
+    void copyStagedNodes(String srcPath, String destPath, String breakAtSrcPath) throws Exception {
+        if (srcPath.equals(breakAtSrcPath)) {
+            // OAK-83: prevent infinite recursion when copying to descendant path
+            return;
+        }
+
         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));
+                copyStagedNodes(PathUtils.concat(srcPath, childName), PathUtils.concat(destPath, childName), breakAtSrcPath);
             }
         }
     }
@@ -617,7 +622,7 @@ public class CommitBuilder {
                 // the copied subtree is modified
 
                 // update staging area
-                copyStagedNodes(srcPath, destPath);
+                copyStagedNodes(srcPath, destPath, destPath);
             }
         }