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 al...@apache.org on 2013/02/13 10:57:54 UTC
svn commit: r1445524 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
Author: alexparvulescu
Date: Wed Feb 13 09:57:53 2013
New Revision: 1445524
URL: http://svn.apache.org/r1445524
Log:
OAK-620 Add CommitHook processing to MemoryNodeStoreBranch
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java?rev=1445524&r1=1445523&r2=1445524&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java Wed Feb 13 09:57:53 2013
@@ -16,12 +16,19 @@
*/
package org.apache.jackrabbit.oak.plugins.memory;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Nonnull;
+
import com.google.common.io.ByteStreams;
import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
@@ -35,6 +42,12 @@ public class MemoryNodeStore implements
private final AtomicReference<NodeState> root =
new AtomicReference<NodeState>(MemoryNodeState.EMPTY_NODE);
+ /**
+ * Commit hook.
+ */
+ @Nonnull
+ private volatile CommitHook hook = EmptyHook.INSTANCE;
+
@Override
public NodeState getRoot() {
return root.get();
@@ -42,7 +55,7 @@ public class MemoryNodeStore implements
@Override
public NodeStoreBranch branch() {
- return new MemoryNodeStoreBranch(root.get());
+ return new MemoryNodeStoreBranch(this, root.get());
}
/**
@@ -58,13 +71,23 @@ public class MemoryNodeStore implements
}
}
- private class MemoryNodeStoreBranch implements NodeStoreBranch {
+ public void setHook(CommitHook hook) {
+ this.hook = checkNotNull(hook);
+ }
+
+ private static class MemoryNodeStoreBranch implements NodeStoreBranch {
+
+ /** The underlying store to which this branch belongs */
+ private final MemoryNodeStore store;
+ /** Root state of the base revision of this branch */
private final NodeState base;
+ /** Root state of the head revision of this branch*/
private volatile NodeState root;
- public MemoryNodeStoreBranch(NodeState base) {
+ public MemoryNodeStoreBranch(MemoryNodeStore store, NodeState base) {
+ this.store = store;
this.base = base;
this.root = base;
}
@@ -76,21 +99,26 @@ public class MemoryNodeStore implements
@Override
public NodeState getRoot() {
+ checkNotMerged();
return root;
}
@Override
public void setRoot(NodeState newRoot) {
+ checkNotMerged();
this.root = newRoot;
}
@Override
public NodeState merge() throws CommitFailedException {
- while (!MemoryNodeStore.this.root.compareAndSet(base, root)) {
+ checkNotMerged();
+ while (!store.root.compareAndSet(base,
+ store.hook.processCommit(base, root))) {
// TODO: rebase();
throw new UnsupportedOperationException();
}
- return root;
+ root = null; // Mark as merged
+ return store.getRoot();
}
@Override
@@ -107,6 +135,12 @@ public class MemoryNodeStore implements
public void rebase() {
throw new UnsupportedOperationException();
}
+
+ // ----------------------------------------------------< private >---
+
+ private void checkNotMerged() {
+ checkState(root != null, "Branch has already been merged");
+ }
}
}