You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2011/12/30 14:17:13 UTC
svn commit: r1225820 - in /jackrabbit/sandbox/jackrabbit-microkernel/src:
main/java/org/apache/jackrabbit/state/ChangeTree.java
test/java/org/apache/jackrabbit/state/TransientSpaceTest.java
Author: mduerig
Date: Fri Dec 30 13:17:12 2011
New Revision: 1225820
URL: http://svn.apache.org/viewvc?rev=1225820&view=rev
Log:
Microkernel based prototype of JCR implementation (WIP)
- removing the parent of the target of a move operation results in the source of move operation to not being removed: fixed
Modified:
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/ChangeTree.java
jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/state/TransientSpaceTest.java
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/ChangeTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/ChangeTree.java?rev=1225820&r1=1225819&r2=1225820&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/ChangeTree.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/ChangeTree.java Fri Dec 30 13:17:12 2011
@@ -613,7 +613,15 @@ public class ChangeTree {
}
@Override
- NodeDelta remove() {
+ NodeDelta remove() throws ItemNotFoundException {
+ // Propagate remove down the tree in order to convert move operations
+ // into this sub-tree to remove operations at the move's source node.
+ for (NodeDelta child : childNodes()) {
+ // Ignore removed and added nodes
+ if (!child.isRemoved() && (!child.isTransient() || child.isMoved())) {
+ child.remove();
+ }
+ }
return parent.addChild(new Removed(parent, name, false));
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/state/TransientSpaceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/state/TransientSpaceTest.java?rev=1225820&r1=1225819&r2=1225820&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/state/TransientSpaceTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/state/TransientSpaceTest.java Fri Dec 30 13:17:12 2011
@@ -11,7 +11,12 @@ import org.apache.jackrabbit.mk.MicroKer
import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.mk.api.MicroKernelException;
import org.apache.jackrabbit.mk.store.NotFoundException;
+import org.apache.jackrabbit.state.ChangeTree.Added;
+import org.apache.jackrabbit.state.ChangeTree.Existing;
+import org.apache.jackrabbit.state.ChangeTree.Moved;
import org.apache.jackrabbit.state.ChangeTree.NodeDelta;
+import org.apache.jackrabbit.state.ChangeTree.Removed;
+import org.apache.jackrabbit.state.ChangeTree.Visitor;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
@@ -724,6 +729,47 @@ public class TransientSpaceTest {
}
@Test
+ public void removeMoved() throws RepositoryException {
+ NodeDelta root = transientSpace.getNode(ROOT);
+ root.addNode("source").addNode("node");
+ root.addNode("target");
+ transientSpace.save();
+
+ root.getNode("source").moveNode("node", ROOT.concat("target/moved"));
+ root.removeNode("target");
+
+ assertNotNull(transientSpace.getNode(ROOT.concat("source")));
+ assertNull(transientSpace.getNode(ROOT.concat("source/node")));
+ assertNull(transientSpace.getNode(ROOT.concat("target")));
+
+ transientSpace.save();
+
+ assertNotNull(transientSpace.getNode(ROOT.concat("source")));
+ assertNull(transientSpace.getNode(ROOT.concat("source/node")));
+ assertNull(transientSpace.getNode(ROOT.concat("target")));
+ }
+
+ @Test
+ public void removeMovedTransient() throws RepositoryException {
+ NodeDelta root = transientSpace.getNode(ROOT);
+ root.addNode("source").addNode("node");
+ root.addNode("target");
+
+ root.getNode("source").moveNode("node", ROOT.concat("target/moved"));
+ root.removeNode("target");
+
+ assertNotNull(transientSpace.getNode(ROOT.concat("source")));
+ assertNull(transientSpace.getNode(ROOT.concat("source/node")));
+ assertNull(transientSpace.getNode(ROOT.concat("target")));
+
+ transientSpace.save();
+
+ assertNotNull(transientSpace.getNode(ROOT.concat("source")));
+ assertNull(transientSpace.getNode(ROOT.concat("source/node")));
+ assertNull(transientSpace.getNode(ROOT.concat("target")));
+ }
+
+ @Test
public void setPropertyTest() throws RepositoryException {
// Set property
NodeDelta root = transientSpace.getNode(ROOT);
@@ -779,7 +825,9 @@ public class TransientSpaceTest {
assertTrue(root.getNode("test").hasNode("c2"));
}
- public static class MicrokernelMatcher {
+ //------------------------------------------< internal >---
+
+ static class MicrokernelMatcher {
private MicrokernelMatcher() { }
public static Matcher<MicroKernel> propertyHasValue(final Path path, final int value) {
@@ -852,4 +900,45 @@ public class TransientSpaceTest {
}
}
+ /* Debugging */
+ @SuppressWarnings("UseOfSystemOutOrSystemErr")
+ private static void dump(NodeDelta delta) {
+ delta.accept(new Visitor() {
+ private String ident = "";
+
+
+ @Override
+ public void visit(Existing delta) {
+ System.out.println(ident + delta.getName() + ":E");
+ visitChildren(delta);
+ }
+
+ @Override
+ public void visit(Added delta) {
+ System.out.println(ident + delta.getName() + ":A");
+ visitChildren(delta);
+ }
+
+ @Override
+ public void visit(Removed delta) {
+ System.out.println(ident + delta.getName() + (delta.isMoved() ? ":M-" : ":R"));
+ visitChildren(delta);
+ }
+
+ @Override
+ public void visit(Moved delta) {
+ System.out.println(ident + delta.getName() + ":M+");
+ visitChildren(delta);
+ }
+
+ private void visitChildren(NodeDelta delta) {
+ ident = ident + " ";
+ for (NodeDelta child : delta.childNodes()) {
+ child.accept(this);
+ }
+ ident = ident.substring(0, ident.length() - 2);
+ }
+
+ });
+ }
}