Author: mduerig
Date: Wed Nov 13 20:57:05 2013
New Revision: 1541707

URL: http://svn.apache.org/r1541707
Log:
OAK-1178: MutableTree#isNew: replace implementation by NodeBuilder#isNew
- Rebasing should correctly set the base state of the KernelNodeBuilder and the 
MongoNodeBuilder
- MongoNodeBuilder needs to calculate its base state instead of relying on that 
of the MemoryNodeBuilder backing it

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoRootBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilderTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
 Wed Nov 13 20:57:05 2013
@@ -18,8 +18,22 @@
  */
 package org.apache.jackrabbit.oak.core;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.indexOf;
+import static org.apache.jackrabbit.oak.api.Tree.Status.EXISTING;
+import static org.apache.jackrabbit.oak.api.Tree.Status.MODIFIED;
+import static org.apache.jackrabbit.oak.api.Tree.Status.NEW;
+import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
+import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
+import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.isHidden;
+
 import java.util.Collections;
 import java.util.Set;
+
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
@@ -36,19 +50,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.PropertyBuilder;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.indexOf;
-import static org.apache.jackrabbit.oak.api.Tree.Status.EXISTING;
-import static org.apache.jackrabbit.oak.api.Tree.Status.MODIFIED;
-import static org.apache.jackrabbit.oak.api.Tree.Status.NEW;
-import static org.apache.jackrabbit.oak.api.Type.STRING;
-import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
-import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
-import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.isHidden;
-
 public class MutableTree extends AbstractTree {
 
     /**
@@ -86,7 +87,7 @@ public class MutableTree extends Abstrac
 
     @Override
     protected boolean isNew() {
-        return !getBase().exists();
+        return nodeBuilder.isNew();
     }
 
     @Override
@@ -335,15 +336,6 @@ public class MutableTree extends Abstrac
     }
 
     //---------------------------------------------------------< internal >---
-
-    private NodeState getBase() {
-        if (parent == null) {
-            return root.getBaseState();
-        } else {
-            return parent.getBase().getChildNode(name);
-        }
-    }
-
     /**
      * Set the parent and name of this tree.
      * @param parent  parent of this tree
@@ -480,7 +472,7 @@ public class MutableTree extends Abstrac
      * Internal method for checking whether this node exists and is visible
      * (i.e. not hidden).
      *
-     * @return {@true} if the node is visible, {@code false} if not
+     * @return {@code true} if the node is visible, {@code false} if not
      */
     private boolean isVisible() {
         return !isHidden(name) && nodeBuilder.exists();

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilder.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilder.java
 Wed Nov 13 20:57:05 2013
@@ -34,7 +34,7 @@ public class KernelNodeBuilder extends M
 
     private NodeState base = null;
 
-    protected NodeState rootBase = null;
+    private NodeState rootBase = null;
 
     KernelNodeBuilder(MemoryNodeBuilder parent, String name, KernelRootBuilder 
root) {
         super(parent, name);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootBuilder.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootBuilder.java
 Wed Nov 13 20:57:05 2013
@@ -117,7 +117,8 @@ class KernelRootBuilder extends MemoryNo
         purge();
         branch.rebase();
         NodeState head = branch.getHead();
-        reset(head);
+        reset(branch.getBase());
+        super.reset(head);
         return head;
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
 Wed Nov 13 20:57:05 2013
@@ -260,7 +260,7 @@ public class MemoryNodeBuilder implement
 
     @Override
     public boolean isNew() {
-        return exists() && !base.exists();
+        return exists() && !getBaseState().exists();
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeBuilder.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeBuilder.java
 Wed Nov 13 20:57:05 2013
@@ -18,11 +18,13 @@ package org.apache.jackrabbit.oak.plugin
 
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * A node builder implementation for MongoMK.
  */
 class MongoNodeBuilder extends MemoryNodeBuilder {
+    private NodeState base;
 
     protected MongoNodeBuilder(MongoNodeState base) {
         super(base);
@@ -33,6 +35,14 @@ class MongoNodeBuilder extends MemoryNod
     }
 
     @Override
+    public NodeState getBaseState() {
+        if (base == null) {
+            base = getParent().getBaseState().getChildNode(getName());
+        }
+        return base;
+    }
+
+    @Override
     protected MongoNodeBuilder createChildBuilder(String name) {
         return new MongoNodeBuilder(this, name);
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoRootBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoRootBuilder.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoRootBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoRootBuilder.java
 Wed Nov 13 20:57:05 2013
@@ -98,7 +98,8 @@ class MongoRootBuilder extends MongoNode
         purge();
         branch.rebase();
         NodeState head = branch.getHead();
-        reset(head);
+        reset(branch.getBase());
+        super.reset(head);
         return head;
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilderTest.java?rev=1541707&r1=1541706&r2=1541707&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeBuilderTest.java
 Wed Nov 13 20:57:05 2013
@@ -21,12 +21,14 @@ package org.apache.jackrabbit.oak.kernel
 
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
 
 import org.apache.jackrabbit.mk.core.MicroKernelImpl;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.junit.Test;
 
@@ -51,11 +53,39 @@ public class KernelNodeBuilderTest {
         NodeStore store = new KernelNodeStore(new MicroKernelImpl());
         NodeBuilder root = store.getRoot().builder();
         NodeBuilder added = root.setChildNode("added");
+        assertTrue(root.hasChildNode("added"));
         assertTrue(added.isNew());
         store.rebase(root);
+        assertTrue(added.exists());
+        assertTrue(root.hasChildNode("added"));
         assertTrue(added.isNew());
     }
 
+    @Test
+    public void rebaseInvariant() {
+        NodeStore store = new KernelNodeStore(new MicroKernelImpl());
+        NodeBuilder root = store.getRoot().builder();
+        NodeBuilder added = root.setChildNode("added");
+        NodeState base = root.getBaseState();
+        store.rebase(root);
+        assertEquals(base, root.getBaseState());
+    }
+
+    @Test
+    public void rebase() throws CommitFailedException {
+        NodeStore store = new KernelNodeStore(new MicroKernelImpl());
+        NodeBuilder root = store.getRoot().builder();
+        modify(store);
+        store.rebase(root);
+        assertEquals(store.getRoot(), root.getBaseState());
+    }
+
+    private static void modify(NodeStore store) throws CommitFailedException {
+        NodeBuilder root = store.getRoot().builder();
+        root.setChildNode("added");
+        store.merge(root, EmptyHook.INSTANCE, null);
+    }
+
     private static void init(NodeStore store) throws CommitFailedException {
         NodeBuilder builder = store.getRoot().builder();
         builder.child("x").child("y").child("z");


Reply via email to