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/04/01 17:10:43 UTC
svn commit: r1308129 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/api/
oak-core/src/main/java/org/apache/jackrabbit/oak/core/
oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/
oak-jcr/src/main/java/org/apache/jack...
Author: mduerig
Date: Sun Apr 1 15:10:42 2012
New Revision: 1308129
URL: http://svn.apache.org/viewvc?rev=1308129&view=rev
Log:
OAK-9: Internal tree builder
use branch to private copy and merge for editing trees
Added:
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java
Removed:
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeBuilder.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Connection.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ConnectionImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStore.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Connection.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Connection.java?rev=1308129&r1=1308128&r2=1308129&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Connection.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Connection.java Sun Apr 1 15:10:42 2012
@@ -16,8 +16,8 @@
*/
package org.apache.jackrabbit.oak.api;
-import org.apache.jackrabbit.mk.model.NodeBuilder;
import org.apache.jackrabbit.mk.model.NodeState;
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
import java.io.Closeable;
@@ -83,9 +83,9 @@ public interface Connection extends Clos
NodeState getCurrentRoot();
- NodeState commit(NodeState newRoot) throws CommitFailedException;
+ NodeState commit(NodeStateEditor editor) throws CommitFailedException;
- NodeBuilder getNodeBuilder(NodeState state);
+ NodeStateEditor getNodeStateEditor(NodeState state);
// TODO : add versioning operations
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ConnectionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ConnectionImpl.java?rev=1308129&r1=1308128&r2=1308129&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ConnectionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ConnectionImpl.java Sun Apr 1 15:10:42 2012
@@ -17,8 +17,8 @@
package org.apache.jackrabbit.oak.core;
import org.apache.jackrabbit.mk.api.MicroKernel;
-import org.apache.jackrabbit.mk.model.NodeBuilder;
import org.apache.jackrabbit.mk.model.NodeState;
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
import org.apache.jackrabbit.mk.model.NodeStore;
import org.apache.jackrabbit.oak.api.AuthInfo;
import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -94,21 +94,20 @@ public class ConnectionImpl implements C
}
@Override
- public NodeState commit(NodeState newRoot) throws CommitFailedException {
+ public NodeState commit(NodeStateEditor editor) throws CommitFailedException {
if (workspaceName == null) {
-// todo store.setRoot(newRoot);
+// todo merge changes from editor into base
return root = store.getRoot();
}
else {
-// todo NodeBuilder builder = store.getNodeBuilder(store.getRoot());
-// builder.setChildNode(workspaceName, newRoot);
+// todo merge changes from editor into base
return root = store.getRoot().getChildNode(workspaceName);
}
}
@Override
- public NodeBuilder getNodeBuilder(NodeState state) {
- return store.getNodeBuilder(state);
+ public NodeStateEditor getNodeStateEditor(NodeState state) {
+ return store.branch(state);
}
@Override
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=1308129&r1=1308128&r2=1308129&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 Sun Apr 1 15:10:42 2012
@@ -19,8 +19,8 @@
package org.apache.jackrabbit.oak.kernel;
import org.apache.jackrabbit.mk.api.MicroKernel;
-import org.apache.jackrabbit.mk.model.NodeBuilder;
import org.apache.jackrabbit.mk.model.NodeState;
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
import org.apache.jackrabbit.mk.model.NodeStore;
/**
@@ -40,13 +40,13 @@ public class KernelNodeStore implements
}
@Override
- public void setRoot(NodeState newRoot) {
- throw new UnsupportedOperationException(); // FIXME
+ public NodeStateEditor branch(NodeState base) {
+ return null; // todo implement branch
}
@Override
- public NodeBuilder getNodeBuilder(NodeState base) {
- throw new UnsupportedOperationException(); // FIXME
+ public NodeState merge(NodeStateEditor branch, NodeState base) {
+ return null; // todo implement merge
}
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1308129&r1=1308128&r2=1308129&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Sun Apr 1 15:10:42 2012
@@ -213,7 +213,7 @@ public class SessionImpl extends Abstrac
checkIsAlive();
try {
transientSpace.save();
- connection.commit(connection.getCurrentRoot()); // todo: need a better way to update a connection to head
+ connection.commit(connection.getNodeStateEditor(connection.getCurrentRoot())); // todo: need a better way to update a connection to head
nodeStateProvider.clear();
}
catch (CommitFailedException e) {
@@ -226,7 +226,7 @@ public class SessionImpl extends Abstrac
checkIsAlive();
try {
transientSpace.refresh(keepChanges);
- connection.commit(connection.getCurrentRoot()); // todo: need a better way to update a connection to head
+ connection.commit(connection.getNodeStateEditor(connection.getCurrentRoot())); // todo: need a better way to update a connection to head
nodeStateProvider.clear();
}
catch (CommitFailedException e) {
Added: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java?rev=1308129&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java (added)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java Sun Apr 1 15:10:42 2012
@@ -0,0 +1,72 @@
+package org.apache.jackrabbit.mk.model;
+
+/**
+ * An editor for modifying existing and creating new
+ * {@link NodeState node states}.
+ */
+public interface NodeStateEditor {
+
+ /**
+ * Add or replace the child node state with the given {@code name}.
+ * @param name name of the new node state
+ * @return editor for the added node state
+ */
+ NodeStateEditor addNode(String name);
+
+ /**
+ * Remove the child node state with the given {@code name}.
+ * @param name name of the node state to remove
+ */
+ void removeNode(String name);
+
+ /**
+ * Set a property on this node state
+ * @param name name of the property
+ * @param value value of the property
+ */
+ void setProperty(String name, Scalar value);
+
+ /**
+ * Remove a property from this node state
+ * @param name name of the property
+ */
+ void removeProperty(String name);
+
+ /**
+ * Move the node state located at {@code sourcePath} to a node
+ * state at {@code destPath}.
+ * @param sourcePath source path relative to this node state
+ * @param destPath destination path relative to this node state
+ */
+ void move(String sourcePath, String destPath);
+
+ /**
+ * Copy the node state located at {@code sourcePath} to a node
+ * state at {@code destPath}.
+ * @param sourcePath source path relative to this node state
+ * @param destPath destination path relative to this node state
+ */
+ void copy(String sourcePath, String destPath);
+
+ /**
+ * Edit the child node state with the given {@code name}.
+ * @param name name of the child node state to edit.
+ * @return editor for the child node state of the given name or
+ * {@code null} if no such node state exists.
+ */
+ NodeStateEditor edit(String name);
+
+ /**
+ * Returns an immutable node state that matches the current state of
+ * the editor.
+ *
+ * @return immutable node state
+ */
+ NodeState getNodeState();
+
+ /**
+ * Return the base node state of this private branch
+ * @return base node state
+ */
+ NodeState getBaseNodeState();
+}
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStore.java?rev=1308129&r1=1308128&r2=1308129&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStore.java Sun Apr 1 15:10:42 2012
@@ -19,10 +19,10 @@ package org.apache.jackrabbit.mk.model;
/**
* Storage abstraction for content trees. At any given point in time
* the stored content tree is rooted at a single immutable node state.
- * Changes in the tree are constructed using {@link NodeBuilder} instances
- * based on the root and other node states in the tree. The state of the
- * entire tree can then be changed by setting the resulting modified root
- * node state as the new root of the tree.
+ * Changes in the tree are constructed by branching off a private copy
+ * using the {@link #branch(NodeState)} method which can be modified
+ * and merged back using the {@link #merge(NodeStateEditor, NodeState)}
+ * method.
* <p>
* This is a low-level interface that doesn't cover functionality like
* merging concurrent changes or rejecting new tree states based on some
@@ -38,22 +38,25 @@ public interface NodeStore {
NodeState getRoot();
/**
- * Updates the state of the content tree.
+ * Creates a private branch from a {@code base} node state
+ * for editing. The branch can later be merged back into
+ * the node store using the {@link #merge(NodeStateEditor, NodeState) merge}
+ * method.
*
- * @param newRoot new root node state
+ * @param base base node state
+ * @return a private branch rooted at {@code base}
*/
- void setRoot(NodeState newRoot);
+ NodeStateEditor branch(NodeState base);
/**
- * Returns a builder for constructing a new or modified node state.
- * The builder is initialized with all the properties and child nodes
- * from the given base node state, or with no properties or child nodes
- * if no base node state is given.
+ * Atomically merges the changes from {@code branch} back
+ * into the sub-tree rooted at {@code base}.
*
- * @param base base node state,
- * or <code>null</code> to construct a new node state
- * @return builder instance
+ * @param branch branch to merge into {@code base}
+ * @param base base of the sub-tree for merging
+ * @return result of the merge operation: the new node state of the
+ * sub tree rooted at {@code base}.
*/
- NodeBuilder getNodeBuilder(NodeState base);
+ NodeState merge(NodeStateEditor branch, NodeState base);
}