You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2012/01/04 18:27:50 UTC

svn commit: r1227230 - in /jackrabbit/sandbox/microkernel/src: main/java/org/apache/jackrabbit/mk/ main/java/org/apache/jackrabbit/mk/model/ main/java/org/apache/jackrabbit/mk/util/ test/java/org/apache/jackrabbit/mk/ test/java/org/apache/jackrabbit/mk...

Author: stefan
Date: Wed Jan  4 17:27:50 2012
New Revision: 1227230

URL: http://svn.apache.org/viewvc?rev=1227230&view=rev
Log:
- fixed PathUtils.isDescendantOf
- fixed OOM caused by '> /parent : /parent/child'

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableNode.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java Wed Jan  4 17:27:50 2012
@@ -406,18 +406,33 @@ public class MicroKernelImpl implements 
                         pos = t.getLastPos();
                         String subPath = t.readString();
                         t.read(':');
-                        t.read('{');
-                        String nodePath = PathUtils.concat(path, subPath);
-                        if (!PathUtils.isAbsolute(nodePath)) {
-                            throw new Exception("absolute path expected: " + nodePath + ", pos: " + pos);
-                        }
-                        String parentPath = PathUtils.getParentPath(nodePath);
-                        String nodeName = PathUtils.getName(nodePath);
-                        // build the list of added nodes recursively
-                        LinkedList<AddNodeOperation> list = new LinkedList<AddNodeOperation>();
-                        addNode(list, parentPath, nodeName, t);
-                        for (AddNodeOperation op : list) {
-                            cb.addNode(op.path, op.name, op.props);
+                        if (t.matches('{')) {
+                            String nodePath = PathUtils.concat(path, subPath);
+                            if (!PathUtils.isAbsolute(nodePath)) {
+                                throw new Exception("absolute path expected: " + nodePath + ", pos: " + pos);
+                            }
+                            String parentPath = PathUtils.getParentPath(nodePath);
+                            String nodeName = PathUtils.getName(nodePath);
+                            // build the list of added nodes recursively
+                            LinkedList<AddNodeOperation> list = new LinkedList<AddNodeOperation>();
+                            addNode(list, parentPath, nodeName, t);
+                            for (AddNodeOperation op : list) {
+                                cb.addNode(op.path, op.name, op.props);
+                            }
+                        } else {
+                            String value;
+                            if (t.matches(JsopTokenizer.NULL)) {
+                                value = null;
+                            } else {
+                                value = t.readRawValue().trim();
+                            }
+                            String targetPath = PathUtils.concat(path, subPath);
+                            if (!PathUtils.isAbsolute(targetPath)) {
+                                throw new Exception("absolute path expected: " + targetPath + ", pos: " + pos);
+                            }
+                            String parentPath = PathUtils.getParentPath(targetPath);
+                            String propName = PathUtils.getName(targetPath);
+                            cb.setProperty(parentPath, propName, value);
                         }
                         break;
                     }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java Wed Jan  4 17:27:50 2012
@@ -27,7 +27,6 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
 
 /**
  *
@@ -65,7 +64,7 @@ public class CommitBuilder {
         newChild.getProperties().putAll(properties);
 
         // id will be computed on commit
-        modParent.put(new ChildNodeEntry(nodeName, ""));
+        modParent.add(new ChildNodeEntry(nodeName, ""));
         String newPath = PathUtils.concat(parentNodePath, nodeName);
         staged.put(newPath, newChild);
         // update change log
@@ -89,6 +88,10 @@ public class CommitBuilder {
     }
 
     public void moveNode(String srcPath, String destPath) throws NotFoundException, Exception {
+        if (PathUtils.isAncestor(srcPath, destPath)) {
+            throw new Exception("target path cannot be descendant of source path: " + destPath);
+        }
+
         String srcParentPath = PathUtils.getParentPath(srcPath);
         String srcNodeName = PathUtils.getName(srcPath);
 
@@ -96,6 +99,15 @@ public class CommitBuilder {
         String destNodeName = PathUtils.getName(destPath);
 
         MutableNode srcParent = getOrCreateStagedNode(srcParentPath);
+        if (srcParentPath.equals(destParentPath)) {
+            if (srcParent.getChildNodeEntry(destNodeName) != null) {
+                throw new Exception("node already exists at move destination path: " + destPath);
+            }
+            if (srcParent.rename(srcNodeName, destNodeName) == null) {
+                throw new NotFoundException(srcPath);
+            }
+            return;
+        }
         ChildNodeEntry srcCNE = srcParent.remove(srcNodeName);
         if (srcCNE == null) {
             throw new NotFoundException(srcPath);
@@ -105,7 +117,7 @@ public class CommitBuilder {
         if (destParent.getChildNodeEntry(destNodeName) != null) {
             throw new Exception("node already exists at move destination path: " + destPath);
         }
-        destParent.put(new ChildNodeEntry(destNodeName, srcCNE.getId()));
+        destParent.add(new ChildNodeEntry(destNodeName, srcCNE.getId()));
 
         // update staging area
         moveStagedNodes(srcPath, destPath);
@@ -128,7 +140,7 @@ public class CommitBuilder {
         }
 
         MutableNode destParent = getOrCreateStagedNode(destParentPath);
-        destParent.put(new ChildNodeEntry(destNodeName, srcCNE.getId()));
+        destParent.add(new ChildNodeEntry(destNodeName, srcCNE.getId()));
 
         // update change log
         changeLog.add(new CopyNode(srcPath, destPath));
@@ -304,7 +316,7 @@ public class CommitBuilder {
             if (PathUtils.denotesRoot(path)) {
                 rootNodeId = id;
             } else {
-                staged.get(PathUtils.getParentPath(path)).put(new ChildNodeEntry(PathUtils.getName(path), id));
+                staged.get(PathUtils.getParentPath(path)).add(new ChildNodeEntry(PathUtils.getName(path), id));
             }
         }
         if (rootNodeId == null) {
@@ -350,10 +362,10 @@ public class CommitBuilder {
 
         // todo fixme
         for (Map.Entry<String, String> entry : ourChanges.getAddedChildNodes ().entrySet()) {
-            mergedNode.put(new ChildNodeEntry(entry.getKey(), entry.getValue()));
+            mergedNode.add(new ChildNodeEntry(entry.getKey(), entry.getValue()));
         }
         for (Map.Entry<String, String> entry : ourChanges.getChangedChildNodes ().entrySet()) {
-            mergedNode.put(new ChildNodeEntry(entry.getKey(), entry.getValue()));
+            mergedNode.add(new ChildNodeEntry(entry.getKey(), entry.getValue()));
         }
         for (String name : ourChanges.getRemovedChildNodes().keySet()) {
             mergedNode.remove(name);

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableNode.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableNode.java Wed Jan  4 17:27:50 2012
@@ -16,6 +16,9 @@
  */
 package org.apache.jackrabbit.mk.model;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+
 /**
  *
  */
@@ -28,11 +31,30 @@ public class MutableNode extends Abstrac
         super(other);
     }
 
-    public ChildNodeEntry put(ChildNodeEntry newEntry) {
+    public ChildNodeEntry add(ChildNodeEntry newEntry) {
         return childEntries.put(newEntry.getName(), newEntry);
     }
     
     public ChildNodeEntry remove(String name) {
         return childEntries.remove(name);
     }
+
+    public ChildNodeEntry rename(String oldName, String newName) {
+        if (oldName.equals(newName)) {
+            return childEntries.get(oldName);
+        }
+        LinkedHashMap<String, ChildNodeEntry> clone = 
+                (LinkedHashMap<String, ChildNodeEntry>) childEntries.clone();
+        childEntries.clear();
+        ChildNodeEntry oldCNE = null;
+        for (Map.Entry<String, ChildNodeEntry> entry : clone.entrySet()) {
+            if (entry.getKey().equals(oldName)) {
+                oldCNE = entry.getValue();
+                childEntries.put(newName, new ChildNodeEntry(newName, oldCNE.getId()));
+            } else {
+                childEntries.put(entry.getKey(), entry.getValue());
+            }
+        }
+        return oldCNE;
+    }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java Wed Jan  4 17:27:50 2012
@@ -324,7 +324,7 @@ public class PathUtils {
     public static boolean isAncestor(String ancestor, String path) {
         assertValid(ancestor);
         assertValid(path);
-        return path.startsWith(ancestor) && path.length() > ancestor.length();
+        return path.startsWith(ancestor) && getDepth(path) > getDepth(ancestor);
     }
 
     /**

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java Wed Jan  4 17:27:50 2012
@@ -49,22 +49,11 @@ public class MoveNodeTest extends MultiM
 
     @Test
     public void addProperty() {
-        if (!isMemoryKernel(mk)) {
-            return;
-        }
-
         // add a property /test/c
         commit("/", "+ \"test/c\": 123");
         Assert.assertEquals("{c:123,a,b,c}", getNode("/test"));
         assertJournal("+\"/test/c\":123");
 
-        // duplicate add property should fail
-        try {
-            commit("/", "+ \"test/c\": 123");
-            Assert.fail();
-        } catch (MicroKernelException e) {
-            // expected
-        }
         Assert.assertEquals("{c:123,a,b,c}", getNode("/test"));
     }
 
@@ -75,10 +64,6 @@ public class MoveNodeTest extends MultiM
 
     @Test
     public void rename() {
-        if (!isMemoryKernel(mk)) {
-            return;
-        }
-
         // rename /test/b
         commit("/", "> \"test/b\": \"test/b1\"");
         Assert.assertEquals("{a,b1,c}", getNode("/test"));
@@ -281,6 +266,19 @@ public class MoveNodeTest extends MultiM
         }
     }
 
+    @Test
+    public void moveTryBecomeDescendantOfSelf() {
+        // move /test to /test/a/test
+
+        try {
+            // try to move /test to /test/a/test
+            commit("/", "> \"test\": \"/test/a/test\"");
+            fail();
+        } catch (Exception e) {
+            // expected
+        }
+    }
+
     private void commit(String root, String diff) {
         head = mk.commit(root, diff, head, null);
     }

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java?rev=1227230&r1=1227229&r2=1227230&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java Wed Jan  4 17:27:50 2012
@@ -148,6 +148,7 @@ public class PathTest extends TestCase {
         assertFalse(PathUtils.isAncestor("/", parent + "/" + child));
         assertTrue(PathUtils.isAncestor("/" + parent, "/" + parent + "/" + child));
         assertFalse(PathUtils.isAncestor(parent, child));
+        assertFalse(PathUtils.isAncestor("/" + parent, "/" + parent + "123"));
 
         // relativize
         assertEquals("", PathUtils.relativize("/", "/"));