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/16 01:32:30 UTC

svn commit: r1326443 - 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-core/src/test/java/org/apache/jac...

Author: mduerig
Date: Sun Apr 15 23:32:29 2012
New Revision: 1326443

URL: http://svn.apache.org/viewvc?rev=1326443&view=rev
Log:
OAK-18: Define Oak API 
- redesigned NodeStateEditor into Branch
- moved CRUD methods to NodeStateEditor
- moved copy/move methods to Branch
- removed ItemStateProvider

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Branch.java
      - copied, changed from r1325846, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/NodeStateEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java
      - copied, changed from r1325846, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java   (contents, props changed)
      - copied, changed from r1325846, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorFuzzIT.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchTest.java
      - copied, changed from r1325846, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorTest.java
Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/NodeStateEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorFuzzIT.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorTest.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemStateProvider.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/api/TransientNodeState.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/core/TmpRepositoryService.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Branch.java (from r1325846, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/NodeStateEditor.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Branch.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Branch.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/NodeStateEditor.java&r1=1325846&r2=1326443&rev=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/NodeStateEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Branch.java Sun Apr 15 23:32:29 2012
@@ -18,59 +18,17 @@
  */
 package org.apache.jackrabbit.oak.api;
 
-import java.util.List;
-
 /**
- * An editor for modifying existing and creating new node states.
+ * An branch for modifying existing and creating new node states.
  */
-public interface NodeStateEditor {
-
-    /**
-     * Add the child node state with the given {@code name}. Does nothing
-     * if such a child node already exists.
-     *
-     * @param name name of the new node state
-     * @return the transient state of the child node with that name or {@code null}
-     * if no such node exists.
-     */
-    TransientNodeState addNode(String name);
-
-    /**
-     * Remove the child node state with the given {@code name}. Does nothing
-     * if no such child node exists.
-     * @param name  name of the node state to remove
-     */
-    void removeNode(String name);
-
-    /**
-     * Set a single valued property state on this node state.
-     *
-     * @param name The name of this property
-     * @param value The value of this property
-     */
-    void setProperty(String name, Scalar value);
-
-    /**
-     * Set a multivalued valued property state on this node state.
-     *
-     * @param name The name of this property
-     * @param values The value of this property
-     */
-    void setProperty(String name, List<Scalar> values);
-
-    /**
-     * Remove a property from this node state
-     * @param name name of the property
-     */
-    void removeProperty(String name);
+public interface Branch {
 
     /**
      * Move the node state located at {@code sourcePath} to a node
      * state at {@code destPath}. Do noting if either the source
      * does not exist, the parent of the destination does not exist
      * or the destination exists already. Both paths must resolve
-     * to node states located in the subtree below the transient
-     * state this editor is acting upon.
+     * to node states located in this branch.
      *
      * @param sourcePath source path relative to this node state
      * @param destPath destination path relative to this node state
@@ -82,8 +40,7 @@ public interface NodeStateEditor {
      * state at {@code destPath}. Do noting if either the source
      * does not exist, the parent of the destination does not exist
      * or the destination exists already. Both paths must resolve
-     * to node states located in the subtree below the transient
-     * state this editor is acting upon.
+     * to node states located in this branch.
      *
      * @param sourcePath source path relative to this node state
      * @param destPath destination path relative to this node state
@@ -91,19 +48,13 @@ public interface NodeStateEditor {
     void copy(String sourcePath, String destPath);
 
     /**
-     * Edit the child node state at the given {@code path}.
-     * The path must resolve to a node state located in the subtree
-     * below the transient state this editor is acting upon.
+     * Retrieve the child node state at the given {@code path}.
+     * The path must resolve to a node state located in this branch.
      *
-     * @param path path of the child node state to edit.
-     * @return editor for the child node state at the given path or
-     *         {@code null} if no such node state exists.
+     * @param path path of the child node state to getNode.
+     * @return transient node state at the given path or {@code null} if no
+     * such node state exists.
      */
-    NodeStateEditor edit(String path);
+    TransientNodeState getNode(String path);
 
-    /**
-     * Return the transient state which this editor is acting upon
-     * @return transient node state
-     */
-    TransientNodeState getTransientState();
 }

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=1326443&r1=1326442&r2=1326443&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 15 23:32:29 2012
@@ -85,21 +85,21 @@ public interface Connection extends Clos
     void refresh();
 
     /**
-     * Atomically apply all changes in the passed {@code editor} to the underlying
+     * Atomically apply all changes in the passed {@code branch} to the underlying
      * Microkernel.
      *
-     * @param editor  editor carrying the changes to be applies
+     * @param branch  branch carrying the changes to be applies
      * @throws CommitFailedException
      */
-    void commit(NodeStateEditor editor) throws CommitFailedException;
+    void commit(Branch branch) throws CommitFailedException;
 
     /**
-     * Get an node state editor for the current root. Use {@link #commit(NodeStateEditor)}
-     * to atomically apply the changes made in this editor to the underlying Microkernel.
+     * Branch the current root. Use {@link #commit(Branch)} to atomically apply the
+     * changes made in this branch to the underlying Microkernel.
      *
-     * @return editor for the current root.
+     * @return branch of the current root.
      */
-    NodeStateEditor getNodeStateEditor();
+    Branch branchRoot();
 
     /**
      * Get the query engine.

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java Sun Apr 15 23:32:29 2012
@@ -18,9 +18,10 @@
  */
 package org.apache.jackrabbit.oak.api;
 
+import java.util.List;
+
 /**
- * A transient node state represents a node being edited. All edit operations are
- * done through an associated {@link org.apache.jackrabbit.oak.api.NodeStateEditor}.
+ * A transient node state represents a mutable node.
  * <p>
  * A transient node state contains the current state of a node and is
  * in contrast to {@link org.apache.jackrabbit.mk.model.NodeState} instances
@@ -47,9 +48,9 @@ public interface TransientNodeState {
     TransientNodeState getParent();
 
     /**
-     * @return  editor acting upon this instance
+     * @return  the branch this state belongs to
      */
-    NodeStateEditor getEditor();
+    Branch getBranch();
 
     /**
      * Get a property state
@@ -74,6 +75,15 @@ public interface TransientNodeState {
     long getPropertyCount();
 
     /**
+     * All property states. The returned {@code Iterable} has snapshot semantics. That
+     * is, it reflect the state of this transient node state instance at the time of the
+     * call. Later changes to this instance are no visible to iterators obtained from
+     * the returned iterable.
+     * @return  An {@code Iterable} for all property states
+     */
+    Iterable<PropertyState> getProperties();
+
+    /**
      * Get a child node state
      * @param name  name of the child node state
      * @return  the child node state with the given {@code name} or {@code null}
@@ -96,15 +106,6 @@ public interface TransientNodeState {
     long getChildNodeCount();
 
     /**
-     * All property states. The returned {@code Iterable} has snapshot semantics. That
-     * is, it reflect the state of this transient node state instance at the time of the
-     * call. Later changes to this instance are no visible to iterators obtained from
-     * the returned iterable.
-     * @return  An {@code Iterable} for all property states
-     */
-    Iterable<PropertyState> getProperties();
-
-    /**
      * All child node states. The returned {@code Iterable} has snapshot semantics. That
      * is, it reflect the state of this transient node state instance at the time of the
      * call. Later changes to this instance are no visible to iterators obtained from
@@ -112,4 +113,44 @@ public interface TransientNodeState {
      * @return  An {@code Iterable} for all child node states
      */
     Iterable<TransientNodeState> getChildNodes();
+
+    /**
+     * Add the child node state with the given {@code name}. Does nothing
+     * if such a child node already exists.
+     *
+     * @param name name of the new node state
+     * @return the transient state of the child node with that name or {@code null}
+     * if no such node exists.
+     */
+    TransientNodeState addNode(String name);
+
+    /**
+     * Remove the child node state with the given {@code name}. Does nothing
+     * if no such child node exists.
+     * @param name  name of the node state to remove
+     */
+    void removeNode(String name);
+
+    /**
+     * Set a single valued property state on this node state.
+     *
+     * @param name The name of this property
+     * @param value The value of this property
+     */
+    void setProperty(String name, Scalar value);
+
+    /**
+     * Set a multivalued valued property state on this node state.
+     *
+     * @param name The name of this property
+     * @param values The value of this property
+     */
+    void setProperty(String name, List<Scalar> values);
+
+    /**
+     * Remove a property from this node state
+     * @param name name of the property
+     */
+    void removeProperty(String name);
+
 }

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=1326443&r1=1326442&r2=1326443&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 15 23:32:29 2012
@@ -21,7 +21,7 @@ import org.apache.jackrabbit.oak.api.Aut
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Connection;
 import org.apache.jackrabbit.oak.kernel.NodeState;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.kernel.NodeStore;
 import org.apache.jackrabbit.oak.api.QueryEngine;
 import org.slf4j.Logger;
@@ -99,16 +99,16 @@ public class ConnectionImpl implements C
     }
 
     @Override
-    public void commit(NodeStateEditor editor) throws CommitFailedException {
+    public void commit(Branch branch) throws CommitFailedException {
         try {
-            store.merge(editor);
+            store.merge(branch);
         } catch (MicroKernelException e) {
             throw new CommitFailedException(e);
         }
     }
 
     @Override
-    public NodeStateEditor getNodeStateEditor() {
+    public Branch branchRoot() {
         return store.branch(root);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TmpRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TmpRepositoryService.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TmpRepositoryService.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TmpRepositoryService.java Sun Apr 15 23:32:29 2012
@@ -20,7 +20,7 @@ import org.apache.jackrabbit.mk.MicroKer
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.api.Connection;
 import org.apache.jackrabbit.oak.kernel.NodeState;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.api.QueryEngine;
 import org.apache.jackrabbit.oak.api.RepositoryService;
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
@@ -83,9 +83,9 @@ public class TmpRepositoryService implem
             NodeState root = nodeStore.getRoot();
             NodeState wspNode = root.getChildNode(wspName);
             if (wspNode == null) {
-                NodeStateEditor editor = nodeStore.branch(root);
-                editor.addNode(wspName);
-                nodeStore.merge(editor);
+                Branch branch = nodeStore.branch(root);
+                branch.getNode("/").addNode(wspName);
+                nodeStore.merge(branch);
             }
         }
 

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java (from r1325846, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java&r1=1325846&r2=1326443&rev=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java Sun Apr 15 23:32:29 2012
@@ -20,8 +20,7 @@ package org.apache.jackrabbit.oak.kernel
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.mk.json.JsonBuilder;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
-import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.api.Scalar;
 import org.apache.jackrabbit.oak.api.TransientNodeState;
 
@@ -32,9 +31,9 @@ import static org.apache.jackrabbit.mk.u
 import static org.apache.jackrabbit.mk.util.PathUtils.getParentPath;
 
 /**
- * This {@code NodeStateEditor} implementation accumulates all changes into a json diff
+ * This {@code Branch} implementation accumulates all changes into a json diff
  * and applies them to the microkernel on
- * {@link NodeStore#merge(org.apache.jackrabbit.oak.api.NodeStateEditor)}
+ * {@link NodeStore#merge(org.apache.jackrabbit.oak.api.Branch)}
  *
  * TODO: review/rewrite when OAK-45 is resolved
  * When the MicroKernel has support for branching and merging private working copies,
@@ -44,79 +43,27 @@ import static org.apache.jackrabbit.mk.u
  *   transient space gets too big.
  * - spool write operations through to the private working copy on a background thread
  */
-public class KernelNodeStateEditor implements NodeStateEditor {
+public class KernelBranch implements Branch {
 
     /** Base node state of this private branch */
     private final NodeState base;
 
-    /** Transient state this editor is acting upon */
-    private final TransientKernelNodeState transientState;
+    /** Root state of this branch */
+    private final TransientKernelNodeState root;
 
     /** Json diff of this private branch */
     private final StringBuilder jsop;
 
     /**
-     * Create a new node state editor representing the root of a fresh
-     * private branch.
+     * Create a new branch for the given base node state
      * @param base  base node state of the private branch
      */
-    KernelNodeStateEditor(NodeState base) {
+    KernelBranch(NodeState base) {
         this.base = base;
-        transientState = new TransientKernelNodeState(base, this);
+        root = new TransientKernelNodeState(this, base);
         jsop = new StringBuilder();
     }
 
-    /**
-     * Create a new node state editor for a given transient node state.
-     * @param parentEditor  editor of the parent of {@code state}
-     * @param state  transient node state for which to create the node state editor
-     */
-    KernelNodeStateEditor(KernelNodeStateEditor parentEditor, TransientKernelNodeState state) {
-        base = parentEditor.base;
-        transientState = state;
-        jsop = parentEditor.jsop;
-    }
-
-    @Override
-    public TransientNodeState addNode(String name) {
-        if (!transientState.hasNode(name)) {
-            transientState.addNode(name);
-            jsop.append("+\"").append(path(name)).append("\":{}");
-        }
-
-        return transientState.getChildNode(name);
-    }
-
-    @Override
-    public void removeNode(String name) {
-        if (transientState.hasNode(name)) {
-            transientState.removeNode(name);
-            jsop.append("-\"").append(path(name)).append('"');
-        }
-    }
-
-    @Override
-    public void setProperty(String name, Scalar value) {
-        PropertyState propertyState = new KernelPropertyState(name, value);
-        transientState.setProperty(propertyState);
-        jsop.append("^\"").append(path(propertyState.getName())).append("\":")
-                .append(encode(propertyState));
-    }
-
-    @Override
-    public void setProperty(String name, List<Scalar> values) {
-        PropertyState propertyState = new KernelPropertyState(name, values);
-        transientState.setProperty(propertyState);
-        jsop.append("^\"").append(path(propertyState.getName())).append("\":")
-                .append(encode(propertyState));
-    }
-
-    @Override
-    public void removeProperty(String name) {
-        transientState.removeProperty(name);
-        jsop.append("^\"").append(path(name)).append("\":null");
-    }
-
     @Override
     public void move(String sourcePath, String destPath) {
         TransientKernelNodeState sourceParent = getTransientState(getParentPath(sourcePath));
@@ -132,8 +79,8 @@ public class KernelNodeStateEditor imple
         }
 
         sourceParent.move(sourceName, destParent, destName);
-        jsop.append(">\"").append(path(sourcePath))
-                .append("\":\"").append(path(destPath)).append('"');
+        jsop.append(">\"").append(sourcePath)
+                .append("\":\"").append(destPath).append('"');
     }
 
     @Override
@@ -151,22 +98,15 @@ public class KernelNodeStateEditor imple
         }
 
         sourceParent.copy(sourceName, destParent, destName);
-        jsop.append("*\"").append(path(sourcePath)).append("\":\"")
-                .append(path(destPath)).append('"');
+        jsop.append("*\"").append(sourcePath).append("\":\"")
+                .append(destPath).append('"');
     }
 
     @Override
-    public KernelNodeStateEditor edit(String path) {
-        TransientKernelNodeState state = getTransientState(path);
-        return state == null
-            ? null
-            : state.getEditor();
+    public TransientNodeState getNode(String path) {
+        return getTransientState(path);
     }
 
-    @Override
-    public TransientNodeState getTransientState() {
-        return transientState;
-    }
 
     //------------------------------------------------------------< internal >---
     /**
@@ -192,6 +132,26 @@ public class KernelNodeStateEditor imple
         return new KernelNodeState(microkernel, targetPath, rev);
     }
 
+    void addNode(TransientKernelNodeState state, String name) {
+        jsop.append("+\"").append(path(state, name)).append("\":{}");
+    }
+
+    void removeNode(TransientKernelNodeState state, String name) {
+        jsop.append("-\"").append(path(state, name)).append('"');
+    }
+
+    void setProperty(TransientKernelNodeState state, String name, Scalar value) {
+        jsop.append("^\"").append(path(state, name)).append("\":").append(encode(value));
+    }
+
+    void setProperty(TransientKernelNodeState state, String name, List<Scalar> values) {
+        jsop.append("^\"").append(path(state, name)).append("\":").append(encode(values));
+    }
+
+    void removeProperty(TransientKernelNodeState state, String name) {
+        jsop.append("^\"").append(path(state, name)).append("\":null");
+    }
+
     /**
      * Get a transient node state for the node identified by
      * {@code path}
@@ -200,7 +160,7 @@ public class KernelNodeStateEditor imple
      *          at {@code path} or {@code null} if no such item exits.
      */
     private TransientKernelNodeState getTransientState(String path) {
-        TransientKernelNodeState state = transientState;
+        TransientKernelNodeState state = root;
         for (String name : elements(path)) {
             state = state.getChildNode(name);
             if (state == null) {
@@ -211,23 +171,17 @@ public class KernelNodeStateEditor imple
     }
 
     /**
-     * Path of the item {@code name}
+     * Path of the item {@code name} of the given {@code state}
+     *
+     * @param state
      * @param name The item name.
      * @return relative path of the item {@code name}
      */
-    private String path(String name) {
-        String path = transientState.getPath();
+    private static String path(TransientKernelNodeState state, String name) {
+        String path = state.getPath();
         return path.isEmpty() ? name : path + '/' + name;
     }
 
-    private static String encode(PropertyState state) {
-        if (state.isArray()) {
-            return encode(state.getArray());
-        } else {
-            return encode(state.getScalar());
-        }
-    }
-
     private static String encode(Scalar scalar) {
         switch (scalar.getType()) {
             case BOOLEAN: return JsonBuilder.encode(scalar.getBoolean());

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=1326443&r1=1326442&r2=1326443&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 15 23:32:29 2012
@@ -19,7 +19,7 @@
 package org.apache.jackrabbit.oak.kernel;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 
 /**
  * {@link MicroKernel}-based {@link NodeStore} implementation.
@@ -38,23 +38,23 @@ public class KernelNodeStore implements 
     }
 
     @Override
-    public NodeStateEditor branch(NodeState base) {
-        return new KernelNodeStateEditor(base);
+    public Branch branch(NodeState base) {
+        return new KernelBranch(base);
     }
 
     @Override
-    public NodeState merge(NodeStateEditor branch) {
-        if (!(branch instanceof KernelNodeStateEditor)) {
+    public NodeState merge(Branch branch) {
+        if (!(branch instanceof KernelBranch)) {
             throw new IllegalArgumentException("Branch does not belong to this store");
         }
 
-        KernelNodeStateEditor kne = (KernelNodeStateEditor) branch;
+        KernelBranch kne = (KernelBranch) branch;
         NodeState target = kne.getBaseNodeState();
         if (!(target instanceof KernelNodeState)) {
             throw new IllegalArgumentException("Target does not belong to this store");
         }
 
-        return ((KernelNodeStateEditor) branch).mergeInto(kernel, (KernelNodeState) target);
+        return ((KernelBranch) branch).mergeInto(kernel, (KernelNodeState) target);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java Sun Apr 15 23:32:29 2012
@@ -16,14 +16,14 @@
  */
 package org.apache.jackrabbit.oak.kernel;
 
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 
 /**
  * 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 by branching off a private copy
  * using the {@link #branch(NodeState)} method which can be modified
- * and merged back using the {@link #merge(org.apache.jackrabbit.oak.api.NodeStateEditor)}
+ * and merged back using the {@link #merge(org.apache.jackrabbit.oak.api.Branch)}
  * method.
  * <p>
  * This is a low-level interface that doesn't cover functionality like
@@ -44,13 +44,13 @@ public interface NodeStore {
     /**
      * 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(org.apache.jackrabbit.oak.api.NodeStateEditor) merge}
+     * the node store using the {@link #merge(org.apache.jackrabbit.oak.api.Branch) merge}
      * method.
      *
      * @param base base node state
      * @return a private branch rooted at {@code base}
      */
-    NodeStateEditor branch(NodeState base);
+    Branch branch(NodeState base);
 
     /**
      * Atomically merges the changes from {@code branch} back into the
@@ -60,7 +60,7 @@ public interface NodeStore {
      * @param branch branch for merging.
      * @return node state resulting from merging {@code branch}.
      */
-    NodeState merge(NodeStateEditor branch);
+    NodeState merge(Branch branch);
 
     /**
      * Compares the given two node states. Any found differences are

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java Sun Apr 15 23:32:29 2012
@@ -19,6 +19,7 @@
 package org.apache.jackrabbit.oak.kernel;
 
 import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Scalar;
 import org.apache.jackrabbit.oak.api.TransientNodeState;
 import org.apache.jackrabbit.oak.util.Function1;
 import org.apache.jackrabbit.oak.util.Iterators;
@@ -28,6 +29,7 @@ import org.apache.jackrabbit.oak.util.Pr
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -39,8 +41,8 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.util.Iterators.map;
 
 public class TransientKernelNodeState implements TransientNodeState {
-    /** Editor acting upon this instance */
-    private final KernelNodeStateEditor editor;
+    /** Branch this state belongs to */
+    private final KernelBranch branch;
 
     /**
      * Underlying persistent state or {@code null} if this instance represents an
@@ -73,38 +75,37 @@ public class TransientKernelNodeState im
     private TransientNodeState parent;
 
     /**
-     * Create a new instance representing the root of a sub-tree.
+     * Create a new instance representing the root of a branch.
+     * @param branch  the branch this state belongs to
      * @param persistentState  underlying persistent state
-     * @param editor  editor acting upon the transient node state
      */
-    TransientKernelNodeState(NodeState persistentState, KernelNodeStateEditor editor) {
-        this.editor = editor;
-        this.persistentState = persistentState;
-        this.parent = null;
-        this.name = "";
+    TransientKernelNodeState(KernelBranch branch, NodeState persistentState) {
+        this(branch, persistentState, null, "");
     }
 
     /**
      * Create a new instance representing a added node state
-     * @param parentEditor  editor of the parent state
+     * @param branch  the branch the state belongs to
+     * @param parent  the parent state of the state
      * @param name  name of the state
      */
-    private TransientKernelNodeState(KernelNodeStateEditor parentEditor, String name) {
-        this(parentEditor, name, null);
+    private TransientKernelNodeState(KernelBranch branch, TransientNodeState parent, String name) {
+        this(branch, null, parent, name);
     }
 
     /**
      * Create a new instance with an underlying persistent state
-     * @param parentEditor  editor of the parent state
-     * @param name  name of the state
+     * @param branch  the branch the state belongs to
      * @param persistedState  underlying persistent state
+     * @param parent  the parent state of the state
+     * @param name  name of the state
      */
-    private TransientKernelNodeState(KernelNodeStateEditor parentEditor, String name,
-            NodeState persistedState) {
+    private TransientKernelNodeState(KernelBranch branch, NodeState persistedState,
+            TransientNodeState parent, String name) {
 
-        editor = new KernelNodeStateEditor(parentEditor, this);
+        this.branch = branch;
         this.persistentState = persistedState;
-        parent = parentEditor.getTransientState();
+        this.parent = parent;
         this.name = name;
     }
 
@@ -118,7 +119,7 @@ public class TransientKernelNodeState im
     private TransientKernelNodeState(TransientKernelNodeState state, TransientKernelNodeState parent,
             String name) {
 
-        editor = new KernelNodeStateEditor(parent.getEditor(), this);
+        branch = state.branch;
         persistentState = state.persistentState;
         this.parent = parent;
         this.name = name;
@@ -166,8 +167,8 @@ public class TransientKernelNodeState im
     }
 
     @Override
-    public KernelNodeStateEditor getEditor() {
-        return editor;
+    public KernelBranch getBranch() {
+        return branch;
     }
 
     @Override
@@ -312,24 +313,51 @@ public class TransientKernelNodeState im
         };
     }
 
-    //------------------------------------------------------------< internal >---
+    @Override
+    public TransientNodeState addNode(String name) {
+        if (!hasNode(name)) {
+            addedNodes.put(name, new TransientKernelNodeState(branch, this, name));
+            branch.addNode(this, name);
+        }
 
-    /**
-     * Add a new child node state with the given {@code name}.
-     * The behaviour of this method is not defined if a node state with that
-     * {@code name} already exists.
-     * @param name  name of the child node state
-     */
-    void addNode(String name) {
-        addedNodes.put(name, new TransientKernelNodeState(editor, name));
+        return getChildNode(name);
     }
 
-    /**
-     * Remove the child node state with the given {@code name}.
-     * Does nothing if there is no node state with the given {@code name}.
-     * @param name  name of the child node state
-     */
-    void removeNode(String name) {
+    @Override
+    public void removeNode(String name) {
+        if (hasNode(name)) {
+            markNodeRemoved(name);
+            branch.removeNode(this, name);
+        }
+    }
+
+    @Override
+    public void setProperty(String name, Scalar value) {
+        PropertyState propertyState = new KernelPropertyState(name, value);
+        setProperty(propertyState);
+        branch.setProperty(this, name, value);
+    }
+
+    @Override
+    public void setProperty(String name, List<Scalar> values) {
+        PropertyState propertyState = new KernelPropertyState(name, values);
+        setProperty(propertyState);
+        branch.setProperty(this, name, values);
+    }
+
+    @Override
+    public void removeProperty(String name) {
+        addedProperties.remove(name);
+        if (hasExistingProperty(name)) {
+            // Mark as removed if removing existing
+            removedProperties.add(name);
+        }
+        branch.removeProperty(this, name);
+    }
+
+//------------------------------------------------------------< internal >---
+
+    void markNodeRemoved(String name) {
         addedNodes.remove(name);
         if (hasExistingNode(name)) {
             // Mark as removed if removing existing
@@ -337,10 +365,6 @@ public class TransientKernelNodeState im
         }
     }
 
-    /**
-     * Set a property state.
-     * @param state  a property state
-     */
     void setProperty(PropertyState state) {
         if (hasExistingProperty(state.getName())) {
             removedProperties.add(state.getName());
@@ -348,47 +372,15 @@ public class TransientKernelNodeState im
         addedProperties.put(state.getName(), state);
     }
 
-    /**
-     * Remove the property state with the given {@code name}.
-     * Does nothing if there is no property state with the given {@code name}.
-     * @param name  a property state
-     */
-    void removeProperty(String name) {
-        addedProperties.remove(name);
-        if (hasExistingProperty(name)) {
-            // Mark as removed if removing existing
-            removedProperties.add(name);
-        }
-    }
-
-    /**
-     * Move the child node state with the given {@code name} to the new parent at
-     * The behaviour of this method is undefined if either this node state has
-     * no child node state with the given {@code name} or {@code destParent} already
-     * has a child node state of {@code destName}.
-     *
-     * @param name  name of the child node state to move
-     * @param destParent  parent of the moved node state
-     * @param destName  name of the moved node state
-     */
     void move(String name, TransientKernelNodeState destParent, String destName) {
         TransientKernelNodeState state = getChildNode(name);
-        removeNode(name);
+        markNodeRemoved(name);
 
         state.name = destName;
         state.parent = destParent;
         destParent.addedNodes.put(destName, state);
     }
 
-    /**
-     * Copy the child node state with the given {@code name} to the new parent at
-     * The behaviour of this method is undefined if {@code destParent} already
-     * has a child node state of {@code destName}.
-     *
-     * @param name  name of the child node state to move
-     * @param destParent  parent of the moved node state
-     * @param destName  name of the moved node state
-     */
     void copy(String name, TransientKernelNodeState destParent, String destName) {
         destParent.addedNodes.put(destName,
                 new TransientKernelNodeState(getChildNode(name), destParent, destName));
@@ -415,7 +407,7 @@ public class TransientKernelNodeState im
             if (state == null) {
                 return null;
             }
-            transientState = new TransientKernelNodeState(editor, name, state);
+            transientState = new TransientKernelNodeState(branch, state, this, name);
             existingChildNodes.put(name, transientState);
         }
         return transientState;

Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java (from r1325846, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorFuzzIT.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorFuzzIT.java&r1=1325846&r2=1326443&rev=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorFuzzIT.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java Sun Apr 15 23:32:29 2012
@@ -37,18 +37,18 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
 
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.AddNode;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.MoveNode;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.CopyNode;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.RemoveNode;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.RemoveProperty;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.Save;
-import static org.apache.jackrabbit.oak.kernel.KernelNodeStateEditorFuzzIT.Operation.SetProperty;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.AddNode;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.MoveNode;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.CopyNode;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.RemoveNode;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.RemoveProperty;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.Save;
+import static org.apache.jackrabbit.oak.kernel.KernelBranchFuzzIT.Operation.SetProperty;
 import static org.junit.Assert.assertEquals;
 
 @RunWith(Parameterized.class)
-public class KernelNodeStateEditorFuzzIT {
-    static final Logger log = LoggerFactory.getLogger(KernelNodeStateEditorFuzzIT.class);
+public class KernelBranchFuzzIT {
+    static final Logger log = LoggerFactory.getLogger(KernelBranchFuzzIT.class);
 
     private static final int OP_COUNT = 5000;
 
@@ -67,7 +67,7 @@ public class KernelNodeStateEditorFuzzIT
         });
     }
 
-    public KernelNodeStateEditorFuzzIT(int seed) {
+    public KernelBranchFuzzIT(int seed) {
         log.info("Seed = {}", seed);
         random = new Random(seed);
     }
@@ -81,22 +81,22 @@ public class KernelNodeStateEditorFuzzIT
     @Test
     public void fuzzTest() throws Exception {
         KernelNodeState state1 = new KernelNodeState(mk1, "/", mk1.getHeadRevision());
-        KernelNodeStateEditor editor1 = new KernelNodeStateEditor(state1);
+        KernelBranch branch1 = new KernelBranch(state1);
 
         KernelNodeState state2 = new KernelNodeState(mk2, "/", mk2.getHeadRevision());
-        KernelNodeStateEditor editor2 = new KernelNodeStateEditor(state2);
+        KernelBranch branch2 = new KernelBranch(state2);
 
         for (Operation op : operations(OP_COUNT)) {
             log.info("{}", op);
-            op.apply(editor1);
-            op.apply(editor2);
-            checkEqual(editor1.getTransientState(), editor2.getTransientState());
+            op.apply(branch1);
+            op.apply(branch2);
+            checkEqual(branch1.getNode("/"), branch2.getNode("/"));
 
-            state1 = editor1.mergeInto(mk1, state1);
-            editor1 = new KernelNodeStateEditor(state1);
+            state1 = branch1.mergeInto(mk1, state1);
+            branch1 = new KernelBranch(state1);
             if (op instanceof Save) {
-                state2 = editor2.mergeInto(mk2, state2);
-                editor2 = new KernelNodeStateEditor(state2);
+                state2 = branch2.mergeInto(mk2, state2);
+                branch2 = new KernelBranch(state2);
                 assertEquals(state1, state2);
             }
         }
@@ -129,7 +129,7 @@ public class KernelNodeStateEditorFuzzIT
     }
 
     abstract static class Operation {
-        abstract void apply(KernelNodeStateEditor editor);
+        abstract void apply(KernelBranch branch);
 
         static class AddNode extends Operation {
             private final String parentPath;
@@ -141,8 +141,8 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
-                editor.edit(parentPath).addNode(name);
+            void apply(KernelBranch branch) {
+                branch.getNode(parentPath).addNode(name);
             }
 
             @Override
@@ -159,10 +159,10 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
+            void apply(KernelBranch branch) {
                 String parentPath = PathUtils.getParentPath(path);
                 String name = PathUtils.getName(path);
-                editor.edit(parentPath).removeNode(name);
+                branch.getNode(parentPath).removeNode(name);
             }
 
             @Override
@@ -181,8 +181,8 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
-                editor.move(source.substring(1), destination.substring(1));
+            void apply(KernelBranch branch) {
+                branch.move(source.substring(1), destination.substring(1));
             }
 
             @Override
@@ -201,8 +201,8 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
-                editor.copy(source.substring(1), destination.substring(1));
+            void apply(KernelBranch branch) {
+                branch.copy(source.substring(1), destination.substring(1));
             }
 
             @Override
@@ -223,8 +223,8 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
-                editor.edit(parentPath).setProperty(propertyName, propertyValue);
+            void apply(KernelBranch branch) {
+                branch.getNode(parentPath).setProperty(propertyName, propertyValue);
             }
 
             @Override
@@ -244,8 +244,8 @@ public class KernelNodeStateEditorFuzzIT
             }
 
             @Override
-            void apply(KernelNodeStateEditor editor) {
-                editor.edit(parentPath).removeProperty(name);
+            void apply(KernelBranch branch) {
+                branch.getNode(parentPath).removeProperty(name);
             }
 
             @Override
@@ -256,7 +256,7 @@ public class KernelNodeStateEditorFuzzIT
 
         static class Save extends Operation {
             @Override
-            void apply(KernelNodeStateEditor editor) {
+            void apply(KernelBranch branch) {
                 // empty
             }
 

Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchFuzzIT.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchTest.java (from r1325846, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorTest.java&r1=1325846&r2=1326443&rev=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/kernel/KernelBranchTest.java Sun Apr 15 23:32:29 2012
@@ -23,7 +23,6 @@ import org.apache.jackrabbit.mk.simple.S
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Scalar;
 import org.apache.jackrabbit.oak.api.TransientNodeState;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -33,13 +32,13 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import static junit.framework.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-public class KernelNodeStateEditorTest {
+public class KernelBranchTest {
 
     private final MicroKernel microkernel = new SimpleKernelImpl("mem:");
 
@@ -57,8 +56,8 @@ public class KernelNodeStateEditorTest {
 
     @Test
     public void getNode() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         TransientNodeState childState = transientState.getChildNode("any");
         assertNull(childState);
 
@@ -68,22 +67,22 @@ public class KernelNodeStateEditorTest {
 
     @Test
     public void getProperty() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         PropertyState propertyState = transientState.getProperty("any");
         assertNull(propertyState);
-        
+
         propertyState = transientState.getProperty("a");
         assertNotNull(propertyState);
         assertFalse(propertyState.isArray());
         assertEquals(Scalar.Type.LONG, propertyState.getScalar().getType());
         assertEquals(1, propertyState.getScalar().getLong());
     }
-    
+
     @Test
     public void getNodes() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         Iterable<TransientNodeState> nodes = transientState.getChildNodes();
 
         Set<String> expectedPaths = new HashSet<String>();
@@ -93,14 +92,14 @@ public class KernelNodeStateEditorTest {
             assertTrue(expectedPaths.remove(node.getPath()));
         }
         assertTrue(expectedPaths.isEmpty());
-        
+
         assertEquals(3, transientState.getChildNodeCount());
     }
 
     @Test
     public void getProperties() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         Map<String, Scalar> expectedProperties = new HashMap<String, Scalar>();
         expectedProperties.put("a", ScalarImpl.longScalar(1));
@@ -116,69 +115,69 @@ public class KernelNodeStateEditorTest {
         }
 
         assertTrue(expectedProperties.isEmpty());
-        
+
         assertEquals(3, transientState.getPropertyCount());
     }
 
     @Test
     public void addNode() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertFalse(transientState.hasNode("new"));
-        TransientNodeState newNode = editor.addNode("new");
+        TransientNodeState newNode = transientState.addNode("new");
         assertNotNull(newNode);
         assertEquals("new", newNode.getName());
         assertTrue(transientState.hasNode("new"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNotNull(newState.getChildNode("new"));
     }
 
     @Test
     public void addExistingNode() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertFalse(transientState.hasNode("new"));
-        TransientNodeState newNode = editor.addNode("new");
-        NodeState newState = editor.mergeInto(microkernel, state);
+        transientState.addNode("new");
+        NodeState newState = branch.mergeInto(microkernel, state);
 
-        editor = new KernelNodeStateEditor(newState);
-        transientState = editor.getTransientState();
+        branch = new KernelBranch(newState);
+        transientState = branch.getNode("/");
         assertTrue(transientState.hasNode("new"));
-        newNode = editor.addNode("new");
+        TransientNodeState newNode = transientState.addNode("new");
         assertNotNull(newNode);
         assertEquals("new", newNode.getName());
     }
 
     @Test
     public void removeNode() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertTrue(transientState.hasNode("x"));
-        editor.removeNode("x");
+        transientState.removeNode("x");
         assertFalse(transientState.hasNode("x"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNull(newState.getChildNode("x"));
     }
 
     @Test
     public void setProperty() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertFalse(transientState.hasProperty("new"));
         Scalar value = ScalarImpl.stringScalar("value");
-        editor.setProperty("new", value);
+        transientState.setProperty("new", value);
         PropertyState property = transientState.getProperty("new");
         assertNotNull(property);
         assertEquals("new", property.getName());
         assertEquals(value, property.getScalar());
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         property = newState.getProperty("new");
         assertNotNull(property);
         assertEquals("new", property.getName());
@@ -187,29 +186,29 @@ public class KernelNodeStateEditorTest {
 
     @Test
     public void removeProperty() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertTrue(transientState.hasProperty("a"));
-        editor.removeProperty("a");
+        transientState.removeProperty("a");
         assertFalse(transientState.hasProperty("a"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
-        Assert.assertNull(newState.getProperty("a"));
+        NodeState newState = branch.mergeInto(microkernel, state);
+        assertNull(newState.getProperty("a"));
     }
 
     @Test
     public void move() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         TransientNodeState y = transientState.getChildNode("y");
 
         assertTrue(transientState.hasNode("x"));
-        editor.move("x", "y/xx");
+        branch.move("x", "y/xx");
         assertFalse(transientState.hasNode("x"));
         assertTrue(y.hasNode("xx"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNull(newState.getChildNode("x"));
         assertNotNull(newState.getChildNode("y"));
         assertNotNull(newState.getChildNode("y").getChildNode("xx"));
@@ -217,31 +216,31 @@ public class KernelNodeStateEditorTest {
 
     @Test
     public void rename() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
         assertTrue(transientState.hasNode("x"));
-        editor.move("x", "xx");
+        branch.move("x", "xx");
         assertFalse(transientState.hasNode("x"));
         assertTrue(transientState.hasNode("xx"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNull(newState.getChildNode("x"));
         assertNotNull(newState.getChildNode("xx"));
     }
 
     @Test
     public void copy() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         TransientNodeState y = transientState.getChildNode("y");
 
         assertTrue(transientState.hasNode("x"));
-        editor.copy("x", "y/xx");
+        branch.copy("x", "y/xx");
         assertTrue(transientState.hasNode("x"));
         assertTrue(y.hasNode("xx"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNotNull(newState.getChildNode("x"));
         assertNotNull(newState.getChildNode("y"));
         assertNotNull(newState.getChildNode("y").getChildNode("xx"));
@@ -249,16 +248,16 @@ public class KernelNodeStateEditorTest {
 
     @Test
     public void deepCopy() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         TransientNodeState y = transientState.getChildNode("y");
 
-        editor.edit("x").addNode("x1");
-        editor.copy("x", "y/xx");
+        branch.getNode("x").addNode("x1");
+        branch.copy("x", "y/xx");
         assertTrue(y.hasNode("xx"));
         assertTrue(y.getChildNode("xx").hasNode("x1"));
 
-        NodeState newState = editor.mergeInto(microkernel, state);
+        NodeState newState = branch.mergeInto(microkernel, state);
         assertNotNull(newState.getChildNode("x"));
         assertNotNull(newState.getChildNode("y"));
         assertNotNull(newState.getChildNode("y").getChildNode("xx"));
@@ -268,59 +267,61 @@ public class KernelNodeStateEditorTest {
         NodeState xx = newState.getChildNode("y").getChildNode("xx");
         assertEquals(x, xx);
     }
-    
+
     @Test
     public void getChildNodeCount() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         assertEquals(3, transientState.getChildNodeCount());
 
-        editor.removeNode("x");
+        transientState.removeNode("x");
         assertEquals(2, transientState.getChildNodeCount());
 
-        editor.addNode("a");
+        transientState.addNode("a");
         assertEquals(3, transientState.getChildNodeCount());
 
-        editor.addNode("x");
+        transientState.addNode("x");
         assertEquals(4, transientState.getChildNodeCount());
     }
-    
+
     @Test
     public void getPropertyCount() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
-        TransientNodeState transientState = editor.getTransientState();
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
         assertEquals(3, transientState.getPropertyCount());
 
         Scalar value = ScalarImpl.stringScalar("foo");
-        editor.setProperty("a", value);
+        transientState.setProperty("a", value);
         assertEquals(3, transientState.getPropertyCount());
 
-        editor.removeProperty("a");
+        transientState.removeProperty("a");
         assertEquals(2, transientState.getPropertyCount());
 
-        editor.setProperty("x", value);
+        transientState.setProperty("x", value);
         assertEquals(3, transientState.getPropertyCount());
 
-        editor.setProperty("a", value);
+        transientState.setProperty("a", value);
         assertEquals(4, transientState.getPropertyCount());
     }
-    
+
     @Test
     public void largeChildNodeList() {
-        KernelNodeStateEditor editor = new KernelNodeStateEditor(state);
+        KernelBranch branch = new KernelBranch(state);
+        TransientNodeState transientState = branch.getNode("/");
 
-        editor.addNode("large");
-        editor = editor.edit("large");
+        transientState.addNode("large");
+        transientState = transientState.getChildNode("large");
         for (int c = 0; c < 10000; c++) {
-            editor.addNode("n" + c);
+            transientState.addNode("n" + c);
         }
 
-        KernelNodeState newState = editor.mergeInto(microkernel, state);
-        editor = new KernelNodeStateEditor(newState);
-        editor = editor.edit("large");
+        KernelNodeState newState = branch.mergeInto(microkernel, state);
+        branch = new KernelBranch(newState);
+        transientState = branch.getNode("/");
+        transientState = transientState.getChildNode("large");
 
         int c = 0;
-        for (TransientNodeState q : editor.getTransientState().getChildNodes()) {
+        for (TransientNodeState q : transientState.getChildNodes()) {
             assertEquals("n" + c++, q.getName());
         }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Sun Apr 15 23:32:29 2012
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.oak.jcr;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.TransientNodeState;
 import org.apache.jackrabbit.oak.jcr.util.ItemNameMatcher;
@@ -154,7 +154,7 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public void remove() throws RepositoryException {
-        getTransientNodeState().getParent().getEditor().removeNode(getName());
+        getTransientNodeState().getParent().removeNode(getName());
     }
 
     /**
@@ -175,13 +175,13 @@ public class NodeImpl extends ItemImpl i
         checkStatus();
 
         String parentPath = Paths.concat(path(), Paths.getParentPath(relPath));
-        TransientNodeState parentState = getItemStateProvider().getTransientNodeState(parentPath);
+        TransientNodeState parentState = getBranch().getNode(parentPath);
         if (parentState == null) {
             throw new PathNotFoundException(relPath);
         }
 
         String name = Paths.getName(relPath);
-        parentState.getEditor().addNode(name);
+        parentState.addNode(name);
         return new NodeImpl(sessionContext, parentState.getChildNode(name));
     }
 
@@ -219,7 +219,7 @@ public class NodeImpl extends ItemImpl i
     public Property setProperty(String name, Value value, int type) throws RepositoryException {
         checkStatus();
 
-        getEditor().setProperty(name, ValueConverter.toScalar(value));
+        getState().setProperty(name, ValueConverter.toScalar(value));
         return getProperty(name);
     }
 
@@ -241,7 +241,7 @@ public class NodeImpl extends ItemImpl i
     public Property setProperty(String name, Value[] values, int type) throws RepositoryException {
         checkStatus();
 
-        getEditor().setProperty(name, ValueConverter.toScalar(values));
+        getState().setProperty(name, ValueConverter.toScalar(values));
         return getProperty(name);
     }
 
@@ -602,7 +602,7 @@ public class NodeImpl extends ItemImpl i
     public void setPrimaryType(String nodeTypeName) throws RepositoryException {
         checkStatus();
 
-        getEditor().setProperty(JcrConstants.JCR_PRIMARYTYPE, ScalarImpl.stringScalar(nodeTypeName));
+        getState().setProperty(JcrConstants.JCR_PRIMARYTYPE, ScalarImpl.stringScalar(nodeTypeName));
     }
 
     @Override
@@ -829,14 +829,14 @@ public class NodeImpl extends ItemImpl i
 
     //--------------------------------------------------------------------------
     /**
-     * Access to KernelNodeStateEditor to allow code in other packages to
+     * Access to TransientNodeState to allow code in other packages to
      * access item states.
      *
-     * @return The node state editor.
+     * @return The node state.
      * FIXME this should not be public in order to avoid clients to access internals through casting to the implementation
      */
-    public NodeStateEditor getEditor() {
-        return getTransientNodeState().getEditor();
+    public TransientNodeState getState() {
+        return getTransientNodeState();
     }
 
     //------------------------------------------------------------< private >---
@@ -862,12 +862,12 @@ public class NodeImpl extends ItemImpl i
         return getSession().getWorkspace().getLockManager();
     }
 
-    private ItemStateProvider getItemStateProvider() {
-        return sessionContext.getItemStateProvider();
+    private Branch getBranch() {
+        return sessionContext.getBranch();
     }
     
     private synchronized TransientNodeState getTransientNodeState() {
-        return transientNodeState = getItemStateProvider().getTransientNodeState(transientNodeState.getPath());
+        return transientNodeState = getBranch().getNode(transientNodeState.getPath());
     }
 
     private String path() {
@@ -894,7 +894,7 @@ public class NodeImpl extends ItemImpl i
 
     private NodeImpl getNodeOrNull(String relPath) {
         String absPath = Paths.concat(path(), relPath);
-        TransientNodeState nodeState = getItemStateProvider().getTransientNodeState(absPath);
+        TransientNodeState nodeState = getBranch().getNode(absPath);
         return nodeState == null
             ? null
             : new NodeImpl(sessionContext, nodeState);
@@ -902,7 +902,7 @@ public class NodeImpl extends ItemImpl i
     
     private PropertyImpl getPropertyOrNull(String relPath) {
         String absPath = Paths.concat(path(), Paths.getParentPath(relPath));
-        TransientNodeState parentState = getItemStateProvider().getTransientNodeState(absPath);
+        TransientNodeState parentState = getBranch().getNode(absPath);
         if (parentState == null) {
             return null;
         }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java Sun Apr 15 23:32:29 2012
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.TransientNodeState;
 import org.apache.jackrabbit.oak.jcr.util.LogUtil;
@@ -138,7 +138,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public void remove() throws RepositoryException {
-        getEditor().removeProperty(getStateName());
+        getParentState().removeProperty(getStateName());
     }
 
     /**
@@ -566,7 +566,7 @@ public class PropertyImpl extends ItemIm
             remove();
         }
         else {
-            getEditor().setProperty(getStateName(), ValueConverter.toScalar(value));
+            getParentState().setProperty(getStateName(), ValueConverter.toScalar(value));
         }
     }
 
@@ -586,7 +586,7 @@ public class PropertyImpl extends ItemIm
             remove();
         }
         else {
-            getEditor().setProperty(getStateName(), ValueConverter.toScalar(values));
+            getParentState().setProperty(getStateName(), ValueConverter.toScalar(values));
         }
     }
 
@@ -606,8 +606,8 @@ public class PropertyImpl extends ItemIm
         }
     }
 
-    private ItemStateProvider getItemStateProvider() {
-        return sessionContext.getItemStateProvider();
+    private Branch getBranch() {
+        return sessionContext.getBranch();
     }
 
     private TransientNodeState getParentState() {
@@ -615,10 +615,6 @@ public class PropertyImpl extends ItemIm
         return parentState;
     }
 
-    private NodeStateEditor getEditor() {
-        return getParentState().getEditor();
-    }
-
     private PropertyState getPropertyState() {
         resolve();
         return propertyState;
@@ -629,9 +625,15 @@ public class PropertyImpl extends ItemIm
     }
 
     private synchronized void resolve() {
-        parentState = getItemStateProvider().getTransientNodeState(parentState.getPath());
-        propertyState = getItemStateProvider().getPropertyState(
-                Paths.concat(parentState.getPath(), propertyState.getName()));
+        parentState = getBranch().getNode(parentState.getPath());
+        String path = Paths.concat(parentState.getPath(), propertyState.getName());
+
+        if (parentState == null) {
+            propertyState = null;
+        }
+        else {
+            propertyState = parentState.getProperty(Paths.getName(path));
+        }
     }
 
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java Sun Apr 15 23:32:29 2012
@@ -20,6 +20,7 @@
 package org.apache.jackrabbit.oak.jcr;
 
 import org.apache.jackrabbit.oak.api.Connection;
+import org.apache.jackrabbit.oak.api.Branch;
 
 import javax.jcr.Session;
 import javax.jcr.ValueFactory;
@@ -30,5 +31,5 @@ public interface SessionContext<T extend
     String getWorkspaceName();
     Connection getConnection();
     ValueFactory getValueFactory();
-    ItemStateProvider getItemStateProvider();
+    Branch getBranch();
 }

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=1326443&r1=1326442&r2=1326443&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 15 23:32:29 2012
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.oak.jcr;
 import org.apache.jackrabbit.commons.AbstractSession;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Connection;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
@@ -55,8 +55,7 @@ public class SessionImpl extends Abstrac
     private final SessionContext<SessionImpl> sessionContext = new Context();
     private boolean isAlive = true;
 
-    private NodeStateEditor editor;
-    private ItemStateProvider itemStateProvider;
+    private Branch branch;
 
     SessionImpl(GlobalContext globalContext, Connection connection) {
         this.globalContext = globalContext;
@@ -64,8 +63,7 @@ public class SessionImpl extends Abstrac
         this.valueFactory = new ValueFactoryImpl();
         workspace = new WorkspaceImpl(sessionContext);
 
-        this.editor = connection.getNodeStateEditor();
-        this.itemStateProvider = new ItemStateProvider(editor.getTransientState());
+        this.branch = connection.branchRoot();
     }
 
 
@@ -118,7 +116,7 @@ public class SessionImpl extends Abstrac
     @Override
     public Node getRootNode() throws RepositoryException {
         ensureIsAlive();
-        return new NodeImpl(sessionContext, itemStateProvider.getTransientNodeState("/"));
+        return new NodeImpl(sessionContext, branch.getNode("/"));
     }
 
     @Override
@@ -145,7 +143,7 @@ public class SessionImpl extends Abstrac
 
         String srcPath = Paths.relativize("/", srcAbsPath);
         String destPath = Paths.relativize("/", destAbsPath);
-        editor.move(srcPath, destPath);
+        branch.move(srcPath, destPath);
     }
 
     //------------------------------------------------------------< state >---
@@ -154,10 +152,9 @@ public class SessionImpl extends Abstrac
     public void save() throws RepositoryException {
         ensureIsAlive();
         try {
-            connection.commit(editor);
+            connection.commit(branch);
             connection.refresh();
-            editor = connection.getNodeStateEditor();
-            itemStateProvider = new ItemStateProvider(editor.getTransientState());
+            branch = connection.branchRoot();
         } catch (CommitFailedException e) {
             throw new RepositoryException(e);
         }
@@ -168,8 +165,7 @@ public class SessionImpl extends Abstrac
         ensureIsAlive();
         connection.refresh();
         if (!keepChanges) {
-            editor = connection.getNodeStateEditor();
-            itemStateProvider = new ItemStateProvider(editor.getTransientState());
+            branch = connection.branchRoot();
         }
     }
 
@@ -442,8 +438,8 @@ public class SessionImpl extends Abstrac
         }
 
         @Override
-        public ItemStateProvider getItemStateProvider() {
-            return itemStateProvider;
+        public Branch getBranch() {
+            return branch;
         }
     }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java Sun Apr 15 23:32:29 2012
@@ -18,7 +18,7 @@ package org.apache.jackrabbit.oak.jcr;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Connection;
-import org.apache.jackrabbit.oak.api.NodeStateEditor;
+import org.apache.jackrabbit.oak.api.Branch;
 import org.apache.jackrabbit.oak.jcr.query.QueryManagerImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,13 +85,13 @@ public class WorkspaceImpl implements Wo
 
         try {
             Connection connection = sessionContext.getConnection();
-            NodeStateEditor editor = connection.getNodeStateEditor();
+            Branch branch = connection.branchRoot();
 
             String srcPath = Paths.relativize("/", srcAbsPath);
             String destPath = Paths.relativize("/", destAbsPath);
-            editor.copy(srcPath, destPath);
+            branch.copy(srcPath, destPath);
 
-            connection.commit(editor);
+            connection.commit(branch);
         }
         catch (CommitFailedException e) {
             throw new RepositoryException(e);
@@ -116,13 +116,13 @@ public class WorkspaceImpl implements Wo
 
         try {
             Connection connection = sessionContext.getConnection();
-            NodeStateEditor editor = connection.getNodeStateEditor();
+            Branch branch = connection.branchRoot();
 
             String srcPath = Paths.relativize("/", srcAbsPath);
             String destPath = Paths.relativize("/", destAbsPath);
-            editor.move(srcPath, destPath);
+            branch.move(srcPath, destPath);
 
-            connection.commit(editor);
+            connection.commit(branch);
         }
         catch (CommitFailedException e) {
             throw new RepositoryException(e);

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java?rev=1326443&r1=1326442&r2=1326443&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java Sun Apr 15 23:32:29 2012
@@ -322,7 +322,7 @@ public class UserManagerImpl implements 
     void setInternalProperty(NodeImpl userNode, String name, String value, int type) throws RepositoryException {
         // TODO: check again if this really makes a transient modification with marking the property modified/new
         Scalar scalar = ValueConverter.toScalar(value, type);
-        userNode.getEditor().setProperty(name, scalar);
+        userNode.getState().setProperty(name, scalar);
     }
 
     void setInternalProperty(NodeImpl userNode, String name, String[] values, int type) throws RepositoryException {
@@ -331,12 +331,12 @@ public class UserManagerImpl implements 
         for (String value : values) {
             scalarList.add(ValueConverter.toScalar(value, PropertyType.STRING));
         }
-        userNode.getEditor().setProperty(name, scalarList);
+        userNode.getState().setProperty(name, scalarList);
     }
 
     void removeInternalProperty(NodeImpl userNode, String name) {
         // TODO: check again if this really makes a transient modification with marking the property modified
-        userNode.getEditor().removeProperty(name);
+        userNode.getState().removeProperty(name);
     }
 
     private Authorizable getAuthorizable(NodeImpl node) throws RepositoryException {