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");