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 md...@apache.org on 2012/05/14 17:17:14 UTC
svn commit: r1338251 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java
test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java
Author: mduerig
Date: Mon May 14 15:17:14 2012
New Revision: 1338251
URL: http://svn.apache.org/viewvc?rev=1338251&view=rev
Log:
OAK-100: Proper CommitHook handling in NodeStore
- test case
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java?rev=1338251&r1=1338250&r2=1338251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java Mon May 14 15:17:14 2012
@@ -98,7 +98,7 @@ public class KernelNodeStore extends Abs
@Override
public NodeStateBuilder getBuilder(NodeState base) {
if (!(base instanceof KernelNodeState)) {
- throw new IllegalArgumentException("Alien node state");
+ throw new IllegalArgumentException("Alien node state " + base.getClass() + ": " + root);
}
NodeStateBuilderContext context = new NodeStateBuilderContext((KernelNodeState) base);
@@ -115,7 +115,7 @@ public class KernelNodeStore extends Abs
committed = ((NodeStateBuilderContext.NodeDecorator) newRoot).applyChanges();
}
else {
- throw new CommitFailedException("Alien node state: " + newRoot);
+ throw new CommitFailedException("Alien node state " + newRoot.getClass() + ": " + newRoot);
}
commitHook.afterCommit(this, baseState, committed);
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java?rev=1338251&r1=1338250&r2=1338251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/AbstractOakTest.java Mon May 14 15:17:14 2012
@@ -20,6 +20,8 @@ import org.apache.jackrabbit.mk.api.Micr
import org.apache.jackrabbit.mk.core.MicroKernelImpl;
import org.apache.jackrabbit.oak.api.CoreValueFactory;
import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyCommitHook;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.junit.Before;
@@ -45,12 +47,16 @@ public abstract class AbstractOakTest {
@Before
public void setUp() {
MicroKernel microKernel = new MicroKernelImpl();
- store = new KernelNodeStore(microKernel);
+ store = new KernelNodeStore(microKernel, createCommitHook());
valueFactory = store.getValueFactory();
state = createInitialState(microKernel);
}
+ protected CommitHook createCommitHook() {
+ return new EmptyCommitHook();
+ }
+
protected abstract NodeState createInitialState(MicroKernel microKernel);
}
\ No newline at end of file
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java?rev=1338251&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreTest.java Mon May 14 15:17:14 2012
@@ -0,0 +1,158 @@
+package org.apache.jackrabbit.oak.kernel;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.core.AbstractOakTest;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyCommitHook;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class KernelNodeStoreTest extends AbstractOakTest {
+ private final CommitHookDelegate commitHookDelegate = new CommitHookDelegate();
+
+ private NodeState root;
+
+ @Override
+ protected NodeState createInitialState(MicroKernel microKernel) {
+ String jsop =
+ "+\"test\":{\"a\":1,\"b\":2,\"c\":3,"
+ + "\"x\":{},\"y\":{},\"z\":{}}";
+ microKernel.commit("/", jsop, null, "test data");
+ root = store.getRoot();
+ return root;
+ }
+
+ @Override
+ protected CommitHook createCommitHook() {
+ return commitHookDelegate;
+ }
+
+ @Test
+ public void getRoot() {
+ assertEquals(root, store.getRoot());
+ assertEquals(root.getChildNode("test"), store.getRoot().getChildNode("test"));
+ assertEquals(root.getChildNode("test").getChildNode("x"),
+ store.getRoot().getChildNode("test").getChildNode("x"));
+ assertEquals(root.getChildNode("test").getChildNode("any"),
+ store.getRoot().getChildNode("test").getChildNode("any"));
+ assertEquals(root.getChildNode("test").getProperty("a"),
+ store.getRoot().getChildNode("test").getProperty("a"));
+ assertEquals(root.getChildNode("test").getProperty("any"),
+ store.getRoot().getChildNode("test").getProperty("any"));
+ }
+
+ @Test
+ public void setRoot() throws CommitFailedException {
+ NodeState test = store.getRoot().getChildNode("test");
+ NodeStateBuilder testBuilder = store.getBuilder(test);
+
+ NodeStateBuilder newNodeBuilder = testBuilder.addNode("newNode");
+ testBuilder.removeNode("a");
+ CoreValue fortyTwo = store.getValueFactory().createValue(42);
+ newNodeBuilder.setProperty("n", fortyTwo);
+ NodeState testState = testBuilder.getNodeState();
+
+ store.setRoot(testBuilder.getNodeState());
+
+ assertNotNull(testState.getChildNode("newNode"));
+ assertNull(testState.getChildNode("a"));
+ assertEquals(fortyTwo, testState.getChildNode("newNode").getProperty("n").getValue());
+ assertEquals(testState, store.getRoot().getChildNode("test"));
+ }
+
+ @Test
+ public void afterCommitHook() throws CommitFailedException {
+ NodeState test = store.getRoot().getChildNode("test");
+ NodeStateBuilder testBuilder = store.getBuilder(test);
+
+ NodeStateBuilder newNodeBuilder = testBuilder.addNode("newNode");
+ testBuilder.removeNode("a");
+ final CoreValue fortyTwo = store.getValueFactory().createValue(42);
+ newNodeBuilder.setProperty("n", fortyTwo);
+ final NodeState testState = testBuilder.getNodeState();
+
+ commitWithHook(testBuilder.getNodeState(), new EmptyCommitHook() {
+ @Override
+ public void afterCommit(NodeStore store, NodeState before, NodeState after) {
+ assertNull(before.getChildNode("newNode"));
+ assertNotNull(after.getChildNode("newNode"));
+ assertNull(after.getChildNode("a"));
+ assertEquals(fortyTwo, after.getChildNode("newNode").getProperty("n").getValue());
+ assertEquals(testState, after);
+ }
+ });
+ }
+
+ @Test
+ @Ignore ("WIP") // TODO OAK-100: NodeStore.getBuilder() only works for KernelNodeState type arguments
+ public void beforeCommitHook() throws CommitFailedException {
+ NodeState test = store.getRoot().getChildNode("test");
+ NodeStateBuilder testBuilder = store.getBuilder(test);
+
+ NodeStateBuilder newNodeBuilder = testBuilder.addNode("newNode");
+ testBuilder.removeNode("a");
+ final CoreValue fortyTwo = store.getValueFactory().createValue(42);
+ newNodeBuilder.setProperty("n", fortyTwo);
+ final NodeState testState = testBuilder.getNodeState();
+
+ commitWithHook(testBuilder.getNodeState(), new EmptyCommitHook() {
+ @Override
+ public NodeState beforeCommit(NodeStore store, NodeState before, NodeState after) {
+ NodeStateBuilder afterBuilder = store.getBuilder(after);
+ afterBuilder.addNode("fromHook");
+ return afterBuilder.getNodeState();
+ }
+ });
+
+ assertNotNull(testState.getChildNode("newNode"));
+ assertNotNull(testState.getChildNode("fromHook"));
+ assertNull(testState.getChildNode("a"));
+ assertEquals(fortyTwo, testState.getChildNode("newNode").getProperty("n").getValue());
+ assertEquals(testState, store.getRoot().getChildNode("test"));
+
+ }
+
+ //------------------------------------------------------------< private >---
+
+ private void commitWithHook(NodeState nodeState, CommitHook commitHook)
+ throws CommitFailedException {
+
+ commitHookDelegate.set(commitHook);
+ try {
+ store.setRoot(nodeState);
+ }
+ finally {
+ commitHookDelegate.set(new EmptyCommitHook());
+ }
+ }
+
+ private static class CommitHookDelegate implements CommitHook {
+ private CommitHook delegate = new EmptyCommitHook();
+
+ public void set(CommitHook commitHook) {
+ delegate = commitHook;
+ }
+
+ @Override
+ public NodeState beforeCommit(NodeStore store, NodeState before, NodeState after)
+ throws CommitFailedException {
+
+ return delegate.beforeCommit(store, before, after);
+ }
+
+ @Override
+ public void afterCommit(NodeStore store, NodeState before, NodeState after) {
+ delegate.afterCommit(store, before, after);
+ }
+ }
+
+}