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/10 13:42:04 UTC

svn commit: r1311685 - in /jackrabbit/oak/trunk: 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/jackrabbit/oak/jcr/ oak-jcr/src/main/java/org/apache/jackr...

Author: mduerig
Date: Tue Apr 10 11:42:04 2012
New Revision: 1311685

URL: http://svn.apache.org/viewvc?rev=1311685&view=rev
Log:
OAK-15: Clean up oak-jcr
use tree builder from OAK-9 instead direct access to Microkernel (WIP)

Removed:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeLog.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/EmptyNodeState.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/NodeStateProvider.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientSpace.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/state/ChangeLogTest.java
Modified:
    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/KernelNodeStateEditor.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/TransientNodeState.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/GlobalContext.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.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/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java

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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -100,14 +100,7 @@ public class ConnectionImpl implements C
 
     @Override
     public NodeState commit(NodeStateEditor editor) throws CommitFailedException {
-        if (workspaceName == null) {
-            return root = store.getRoot();
-        }
-        else {
-            return root = store.getRoot().getChildNode(workspaceName);
-        }
-
-        // todo return store.merge(editor, editor.getBaseNodeState());
+        return store.merge(editor, editor.getBaseNodeState());
     }
 
     @Override

Modified: 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/KernelNodeStateEditor.java?rev=1311685&r1=1311684&r2=1311685&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/KernelNodeStateEditor.java Tue Apr 10 11:42:04 2012
@@ -153,6 +153,14 @@ public class KernelNodeStateEditor imple
         return base;
     }
 
+    /**
+     * @return the {@link TransientNodeState} instance this editor is
+     *         acting upon.
+     */
+    public TransientNodeState getTransientState() {
+        return transientState;
+    }
+
     //------------------------------------------------------------< internal >---
 
     /**
@@ -171,14 +179,6 @@ public class KernelNodeStateEditor imple
     }
 
     /**
-     * @return the {@link TransientNodeState} instance this editor is
-     *         acting upon.
-     */
-    TransientNodeState getTransientState() {
-        return transientState;
-    }
-
-    /**
      * Get a transient node state for the node identified by
      * {@code path}
      * @param path  the path to the node state

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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -50,7 +50,7 @@ public class KernelNodeStore implements 
         if (!(branch instanceof KernelNodeStateEditor)) {
             throw new IllegalArgumentException("Branch does not belong to this store");
         }
-        if (!(target instanceof KernelNodeStore)) {
+        if (!(target instanceof KernelNodeState)) {
             throw new IllegalArgumentException("Target does not belong to this store");
         }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java?rev=1311685&r1=1311684&r2=1311685&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java Tue Apr 10 11:42:04 2012
@@ -157,6 +157,39 @@ public class TransientNodeState {
     }
 
     /**
+     * @return  the name of this transient node state
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return  relative path of this transient node state
+     */
+    public String getPath() {
+        if (parent == null) {
+            return name;
+        }
+        else {
+            String path = parent.getPath();
+            return path.isEmpty()
+                    ? name
+                    : path + '/' + name;
+        }
+    }
+
+    public TransientNodeState getParent() {
+        return parent;
+    }
+
+    /**
+     * @return  editor acting upon this instance
+     */
+    public KernelNodeStateEditor getEditor() {
+        return editor;
+    }
+
+    /**
      * Get a property state
      * @param name name of the property state
      * @return  the property state with the given {@code name} or {@code null}
@@ -339,35 +372,6 @@ public class TransientNodeState {
     //------------------------------------------------------------< internal >---
 
     /**
-     * @return  editor acting upon this instance
-     */
-    KernelNodeStateEditor getEditor() {
-        return editor;
-    }
-
-    /**
-     * @return  the name of this transient node state
-     */
-    String getName() {
-        return name;
-    }
-
-    /**
-     * @return  relative path of this transient node state
-     */
-    String getPath() {
-        if (parent == null) {
-            return name;
-        }
-        else {
-            String path = parent.getPath();
-            return path.isEmpty()
-                ? name
-                : path + '/' + 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.

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/GlobalContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/GlobalContext.java?rev=1311685&r1=1311684&r2=1311685&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/GlobalContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/GlobalContext.java Tue Apr 10 11:42:04 2012
@@ -52,7 +52,6 @@ public class GlobalContext {
     public GlobalContext(MicroKernel mk) {
         RepositoryService repositoryService = new TmpRepositoryService(mk);
         put(RepositoryService.class, repositoryService);
-        put(MicroKernel.class, mk);
         put(Repository.class, new RepositoryImpl(this));
     }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java?rev=1311685&r1=1311684&r2=1311685&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java Tue Apr 10 11:42:04 2012
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
-import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
-import org.apache.jackrabbit.oak.jcr.util.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -132,8 +130,4 @@ abstract class ItemImpl implements Item 
         return sessionContext.getValueFactory();
     }
 
-    protected static TransientNodeState getNodeState(SessionContext<SessionImpl> sessionContext, Path path) {
-        return sessionContext.getNodeStateProvider().getNodeState(path);
-    }
-
 }
\ No newline at end of file

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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -17,18 +17,21 @@
 package org.apache.jackrabbit.oak.jcr;
 
 import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.mk.model.ScalarImpl;
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
 import org.apache.jackrabbit.mk.model.PropertyState;
-import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
+import org.apache.jackrabbit.mk.model.ScalarImpl;
+import org.apache.jackrabbit.mk.util.PathUtils;
 import org.apache.jackrabbit.oak.jcr.util.Function1;
 import org.apache.jackrabbit.oak.jcr.util.ItemNameMatcher;
 import org.apache.jackrabbit.oak.jcr.util.Iterators;
 import org.apache.jackrabbit.oak.jcr.util.LogUtil;
-import org.apache.jackrabbit.oak.jcr.util.Path;
 import org.apache.jackrabbit.oak.jcr.util.Predicate;
 import org.apache.jackrabbit.oak.jcr.util.ValueConverter;
+import org.apache.jackrabbit.oak.kernel.KernelNodeStateEditor;
+import org.apache.jackrabbit.oak.kernel.KernelPropertyState;
+import org.apache.jackrabbit.oak.kernel.TransientNodeState;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,28 +73,11 @@ public class NodeImpl extends ItemImpl i
      */
     private static final Logger log = LoggerFactory.getLogger(NodeImpl.class);
 
-    private final TransientNodeState state;
-
-    static boolean exist(SessionContext<SessionImpl> sessionContext, Path path) {
-        return getNodeState(sessionContext, path) != null;
-    }
-
-    static Node create(SessionContext<SessionImpl> sessionContext, Path path) throws PathNotFoundException {
-        TransientNodeState state = getNodeState(sessionContext, path);
-        if (state == null) {
-            throw new PathNotFoundException(path.toJcrPath());
-        }
-
-        return new NodeImpl(sessionContext, state);
-    }
-
-    static Node create(SessionContext<SessionImpl> sessionContext, TransientNodeState state) {
-        return new NodeImpl(sessionContext, state);
-    }
+    private final NodeStateEditor editor;
 
-    private NodeImpl(SessionContext<SessionImpl> sessionContext, TransientNodeState state) {
+    NodeImpl(SessionContext<SessionImpl> sessionContext, NodeStateEditor editor) {
         super(sessionContext);
-        this.state = state;
+        this.editor = editor;
     }
 
     //---------------------------------------------------------------< Item >---
@@ -108,7 +94,7 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public String getName() throws RepositoryException {
-        return state.getName();
+        return state().getName();
     }
 
     /**
@@ -116,7 +102,7 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public String getPath() throws RepositoryException {
-        return path().toJcrPath();
+        return '/' + path();
     }
 
     /**
@@ -124,11 +110,11 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public Node getParent() throws RepositoryException {
-        if (state.isRoot()) {
+        if (state().getParent() == null) {
             throw new ItemNotFoundException("Root has no parent");
         }
 
-        return create(sessionContext, path().getParent());
+        return new NodeImpl(sessionContext, state().getParent().getEditor());
     }
 
     /**
@@ -136,12 +122,8 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public Item getAncestor(int depth) throws RepositoryException {
-        Path parent = path().getAncestor(depth);
-        if (parent == null) {
-            throw new ItemNotFoundException(path().toJcrPath() + "has no ancestor of depth " + depth);
-        }
-
-        return create(sessionContext, parent);
+        // todo implement getAncestor
+        return null;
     }
 
     /**
@@ -149,7 +131,7 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public int getDepth() throws RepositoryException {
-        return path().getDepth();
+        return PathUtils.getDepth(path());
     }
 
     /**
@@ -157,7 +139,8 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public boolean isNew() {
-        return state.isNew();
+        // todo implement isNew
+        return false;
     }
 
     /**
@@ -165,7 +148,8 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public boolean isModified() {
-        return state.isModified();
+        // todo implement isModified
+        return false;
     }
 
     /**
@@ -173,7 +157,7 @@ public class NodeImpl extends ItemImpl i
      */
     @Override
     public void remove() throws RepositoryException {
-        state.remove();
+        state().getParent().getEditor().removeNode(getName());
     }
 
     /**
@@ -192,10 +176,18 @@ public class NodeImpl extends ItemImpl i
     @Override
     public Node addNode(String relPath) throws RepositoryException {
         checkStatus();
-        Path newPath = path().concat(relPath);
-        TransientNodeState parentState = getNodeState(sessionContext, newPath.getParent());
-        TransientNodeState childState = parentState.addNode(newPath.getName());
-        return create(sessionContext, childState);
+
+        NodeStateEditor editor = this.editor;
+        for (String name : PathUtils.elements(PathUtils.getParentPath(relPath))) {
+            editor = editor.edit(name);
+            if (editor == null) {
+                throw new PathNotFoundException();
+            }
+        }
+
+        String name = PathUtils.getName(relPath);
+        editor.addNode(name);
+        return new NodeImpl(sessionContext, editor.edit(name));
     }
 
     @Override
@@ -232,7 +224,7 @@ public class NodeImpl extends ItemImpl i
     public Property setProperty(String name, Value value, int type) throws RepositoryException {
         checkStatus();
 
-        state.setProperty(name, ValueConverter.toScalar(value));
+        editor.setProperty(new KernelPropertyState(name, ValueConverter.toScalar(value)));
         return getProperty(name);
     }
 
@@ -254,7 +246,7 @@ public class NodeImpl extends ItemImpl i
     public Property setProperty(String name, Value[] values, int type) throws RepositoryException {
         checkStatus();
 
-        state.setProperty(name, ValueConverter.toScalar(values));
+        editor.setProperty(new KernelPropertyState(name, ValueConverter.toScalar(values)));
         return getProperty(name);
     }
 
@@ -370,22 +362,30 @@ public class NodeImpl extends ItemImpl i
 
     @Override
     public Node getNode(String relPath) throws RepositoryException {
-        return create(sessionContext, path().concat(relPath));
+        checkStatus();
+
+        NodeImpl node = getNodeOrNull(relPath);
+        if (node == null) {
+            throw new PathNotFoundException(relPath);
+        }
+        else {
+            return node;
+        }
     }
 
     @Override
     public NodeIterator getNodes() throws RepositoryException {
         checkStatus();
 
-        Iterator<TransientNodeState> childNodeStates = state.getNodes();
-        return new NodeIteratorAdapter(nodeIterator(childNodeStates));
+        Iterable<TransientNodeState> childNodeStates = state().getChildNodes();
+        return new NodeIteratorAdapter(nodeIterator(childNodeStates.iterator()));
     }
 
     @Override
     public NodeIterator getNodes(final String namePattern) throws RepositoryException {
         checkStatus();
 
-        Iterator<TransientNodeState> childNodeStates = filter(state.getNodes(),
+        Iterator<TransientNodeState> childNodeStates = filter(state().getChildNodes().iterator(),
                 new Predicate<TransientNodeState>() {
                     @Override
                     public boolean evaluate(TransientNodeState state) {
@@ -400,7 +400,7 @@ public class NodeImpl extends ItemImpl i
     public NodeIterator getNodes(final String[] nameGlobs) throws RepositoryException {
         checkStatus();
 
-        Iterator<TransientNodeState> childNodeStates = filter(state.getNodes(),
+        Iterator<TransientNodeState> childNodeStates = filter(state().getChildNodes().iterator(),
                 new Predicate<TransientNodeState>() {
                     @Override
                     public boolean evaluate(TransientNodeState state) {
@@ -415,22 +415,28 @@ public class NodeImpl extends ItemImpl i
     public Property getProperty(String relPath) throws RepositoryException {
         checkStatus();
 
-        return PropertyImpl.create(sessionContext, path().concat(relPath));
+        Property property = getPropertyOrNull(relPath);
+        if (property == null) {
+            throw new PathNotFoundException(relPath);
+        }
+        else {
+            return property;
+        }
     }
 
     @Override
     public PropertyIterator getProperties() throws RepositoryException {
         checkStatus();
 
-        Iterator<PropertyState> properties = state.getProperties();
-        return new PropertyIteratorAdapter(propertyIterator(properties));
+        Iterable<PropertyState> properties = state().getProperties();
+        return new PropertyIteratorAdapter(propertyIterator(properties.iterator()));
     }
 
     @Override
     public PropertyIterator getProperties(final String namePattern) throws RepositoryException {
         checkStatus();
 
-        Iterator<PropertyState> properties = filter(state.getProperties(),
+        Iterator<PropertyState> properties = filter(state().getProperties().iterator(),
                 new Predicate<PropertyState>() {
                     @Override
                     public boolean evaluate(PropertyState entry) {
@@ -443,7 +449,7 @@ public class NodeImpl extends ItemImpl i
 
     @Override
     public PropertyIterator getProperties(final String[] nameGlobs) throws RepositoryException {
-        Iterator<PropertyState> propertyNames = filter(state.getProperties(),
+        Iterator<PropertyState> propertyNames = filter(state().getProperties().iterator(),
                 new Predicate<PropertyState>() {
                     @Override
                     public boolean evaluate(PropertyState entry) {
@@ -492,7 +498,7 @@ public class NodeImpl extends ItemImpl i
         checkStatus();
 
         // TODO
-        return path().toMkPath();
+        return path();
     }
 
     @Override
@@ -537,28 +543,28 @@ public class NodeImpl extends ItemImpl i
     public boolean hasNode(String relPath) throws RepositoryException {
         checkStatus();
 
-        return exist(sessionContext, path().concat(relPath));
+        return getNodeOrNull(relPath) != null;
     }
 
     @Override
     public boolean hasProperty(String relPath) throws RepositoryException {
         checkStatus();
 
-        return PropertyImpl.exist(sessionContext, path().concat(relPath));
+        return getPropertyOrNull(relPath) != null;
     }
 
     @Override
     public boolean hasNodes() throws RepositoryException {
         checkStatus();
 
-        return state.hasNodes();
+        return state().getChildNodeCount() != 0;
     }
 
     @Override
     public boolean hasProperties() throws RepositoryException {
         checkStatus();
 
-        return state.hasProperties();
+        return state().getPropertyCount() != 0;
     }
 
     @Override
@@ -589,7 +595,8 @@ public class NodeImpl extends ItemImpl i
     public void setPrimaryType(String nodeTypeName) throws RepositoryException {
         checkStatus();
 
-        state.setProperty(JcrConstants.JCR_PRIMARYTYPE, ScalarImpl.stringScalar(nodeTypeName));
+        editor.setProperty(new KernelPropertyState(
+                JcrConstants.JCR_PRIMARYTYPE, ScalarImpl.stringScalar(nodeTypeName)));
     }
 
     @Override
@@ -837,15 +844,20 @@ public class NodeImpl extends ItemImpl i
         return getSession().getWorkspace().getLockManager();
     }
 
-    private Path path() {
-        return state.getPath();
+    private TransientNodeState state() {
+        // fixme: need to resolve state in case a refresh occurred
+        return ((KernelNodeStateEditor) editor).getTransientState();
+    }
+
+    private String path() {
+        return state().getPath();
     }
 
     private Iterator<Node> nodeIterator(Iterator<TransientNodeState> childNodeStates) {
         return Iterators.map(childNodeStates, new Function1<TransientNodeState, Node>() {
             @Override
             public Node apply(TransientNodeState state) {
-                return NodeImpl.create(sessionContext, state);
+                return new NodeImpl(sessionContext, state.getEditor());
             }
         });
     }
@@ -854,8 +866,39 @@ public class NodeImpl extends ItemImpl i
         return Iterators.map(properties, new Function1<PropertyState, Property>() {
             @Override
             public Property apply(PropertyState propertyState) {
-                return PropertyImpl.create(sessionContext, state, propertyState);
+                return new PropertyImpl(sessionContext, editor, propertyState);
             }
         });
     }
+
+    private NodeImpl getNodeOrNull(String relPath) {
+        NodeStateEditor editor = this.editor;
+
+        for (String name : PathUtils.elements(relPath)) {
+            editor = editor.edit(name);
+            if (editor == null) {
+                return null;
+            }
+        }
+
+        return new NodeImpl(sessionContext, editor);
+    }
+    
+    private PropertyImpl getPropertyOrNull(String relPath) {
+        String parentPath = PathUtils.getParentPath(relPath);
+        NodeStateEditor editor = this.editor;
+        for (String name : PathUtils.elements(parentPath)) {
+            editor = editor.edit(name);
+            if (editor == null) {
+                return null;
+            }
+        }
+
+        String name = PathUtils.getName(relPath);
+        // fixme: don't cast to implementation
+        PropertyState state = ((KernelNodeStateEditor) editor).getTransientState().getProperty(name);
+        return state == null
+            ? null
+            : new PropertyImpl(sessionContext, editor, state);
+    }
 }
\ No newline at end of file

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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -16,11 +16,14 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
 import org.apache.jackrabbit.mk.model.PropertyState;
-import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
+import org.apache.jackrabbit.mk.util.PathUtils;
 import org.apache.jackrabbit.oak.jcr.util.LogUtil;
-import org.apache.jackrabbit.oak.jcr.util.Path;
 import org.apache.jackrabbit.oak.jcr.util.ValueConverter;
+import org.apache.jackrabbit.oak.kernel.KernelNodeStateEditor;
+import org.apache.jackrabbit.oak.kernel.KernelPropertyState;
+import org.apache.jackrabbit.oak.kernel.TransientNodeState;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,35 +54,13 @@ public class PropertyImpl extends ItemIm
      */
     private static final Logger log = LoggerFactory.getLogger(PropertyImpl.class);
 
-    private final TransientNodeState parentState;
-    private final PropertyState state;
+    private final NodeStateEditor parentEditor;
+    private final PropertyState propertyState;
 
-    static Property create(SessionContext<SessionImpl> sessionContext, Path path) throws PathNotFoundException,
-            ItemNotFoundException {
-
-        TransientNodeState parentState = getNodeState(sessionContext, path.getParent());
-        if (parentState == null) {
-            throw new PathNotFoundException(path.toJcrPath());
-        }
-
-        String name = path.getName();
-        PropertyState state = parentState.getPropertyState(name);
-        return new PropertyImpl(sessionContext, parentState, state);
-    }
-
-    static Property create(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, PropertyState state) {
-        return new PropertyImpl(sessionContext, parentState, state);
-    }
-
-    public static boolean exist(SessionContext<SessionImpl> sessionContext, Path path) {
-        TransientNodeState parentState = getNodeState(sessionContext, path.getParent());
-        return parentState != null && parentState.hasProperty(path.getName());
-    }
-
-    private PropertyImpl(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, PropertyState state) {
+    PropertyImpl(SessionContext<SessionImpl> sessionContext, NodeStateEditor parentEditor, PropertyState propertyState) {
         super(sessionContext);
-        this.parentState = parentState;
-        this.state = state;
+        this.parentEditor = parentEditor;
+        this.propertyState = propertyState;
     }
 
     //---------------------------------------------------------------< Item >---
@@ -96,7 +77,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public String getName() throws RepositoryException {
-        return state.getName();
+        return propertyState.getName();
     }
 
     /**
@@ -104,7 +85,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public String getPath() throws RepositoryException {
-        return parentState.getPath().concat(state.getName()).toJcrPath();
+        return '/' + parentState().getPath() + '/' + propertyState.getName();
     }
 
     /**
@@ -112,7 +93,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public Node getParent() throws RepositoryException {
-        return NodeImpl.create(sessionContext, parentState);
+        return new NodeImpl(sessionContext, parentEditor);
     }
 
     /**
@@ -132,7 +113,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public int getDepth() throws RepositoryException {
-        return parentState.getPath().getDepth() + 1;
+        return PathUtils.getDepth(getPath());
     }
 
     /**
@@ -140,7 +121,8 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public boolean isNew() {
-        return parentState.isPropertyNew(state.getName());
+        // todo implement isNew
+        return false;
     }
 
     /**
@@ -148,7 +130,8 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public boolean isModified() {
-        return parentState.isPropertyModified(state.getName());
+        // todo implement isModified
+        return false;
     }
 
     /**
@@ -156,7 +139,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public void remove() throws RepositoryException {
-        parentState.removeProperty(state.getName());
+        parentEditor.removeProperty(propertyState.getName());
     }
 
     /**
@@ -357,7 +340,7 @@ public class PropertyImpl extends ItemIm
             throw new ValueFormatException(LogUtil.safeGetJCRPath(this) + " is multi-valued.");
         }
 
-        return ValueConverter.toValue(getValueFactory(), state.getScalar());
+        return ValueConverter.toValue(getValueFactory(), propertyState.getScalar());
     }
 
     @Override
@@ -367,7 +350,7 @@ public class PropertyImpl extends ItemIm
             throw new ValueFormatException(LogUtil.safeGetJCRPath(this) + " is not multi-valued.");
         }
 
-        return ValueConverter.toValues(getValueFactory(), state.getArray());
+        return ValueConverter.toValues(getValueFactory(), propertyState.getArray());
     }
 
     /**
@@ -542,7 +525,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public boolean isMultiple() throws RepositoryException {
-        return state.isArray();
+        return propertyState.isArray();
     }
 
     //------------------------------------------------------------< private >---
@@ -582,7 +565,8 @@ public class PropertyImpl extends ItemIm
             remove();
         }
         else {
-            parentState.setProperty(state.getName(), ValueConverter.toScalar(value));
+            parentEditor.setProperty(new KernelPropertyState(
+                    propertyState.getName(), ValueConverter.toScalar(value)));
         }
     }
 
@@ -602,7 +586,8 @@ public class PropertyImpl extends ItemIm
             remove();
         }
         else {
-            parentState.setProperty(state.getName(), ValueConverter.toScalar(values));
+            parentEditor.setProperty(new KernelPropertyState(
+                    propertyState.getName(), ValueConverter.toScalar(values)));
         }
     }
 
@@ -622,4 +607,9 @@ public class PropertyImpl extends ItemIm
         }
     }
 
+    private TransientNodeState parentState() {
+        // fixme: resolve parent state in case a refresh has occurred
+        return ((KernelNodeStateEditor) parentEditor).getTransientState();
+    }
+
 }
\ 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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -19,9 +19,7 @@
 
 package org.apache.jackrabbit.oak.jcr;
 
-import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.api.Connection;
-import org.apache.jackrabbit.oak.jcr.state.NodeStateProvider;
 
 import javax.jcr.Session;
 import javax.jcr.ValueFactory;
@@ -31,7 +29,5 @@ public interface SessionContext<T extend
     GlobalContext getGlobalContext();
     String getWorkspaceName();
     Connection getConnection();
-    MicroKernel getMicrokernel(); // TODO: this should be superfluous when Connection is used for communication
     ValueFactory getValueFactory();
-    NodeStateProvider getNodeStateProvider();
 }

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=1311685&r1=1311684&r2=1311685&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 Tue Apr 10 11:42:04 2012
@@ -17,24 +17,17 @@
 package org.apache.jackrabbit.oak.jcr;
 
 import org.apache.jackrabbit.commons.AbstractSession;
-import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.model.NodeState;
+import org.apache.jackrabbit.mk.model.NodeStateEditor;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Connection;
-import org.apache.jackrabbit.oak.jcr.state.NodeStateProvider;
-import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
-import org.apache.jackrabbit.oak.jcr.state.TransientSpace;
-import org.apache.jackrabbit.oak.jcr.util.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
 
 import javax.jcr.Credentials;
 import javax.jcr.InvalidItemStateException;
-import javax.jcr.Item;
-import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.Property;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -62,9 +55,8 @@ public class SessionImpl extends Abstrac
     private final ValueFactory valueFactory;
 
     private final GlobalContext globalContext;
-    private final TransientSpace transientSpace;
-    private final NodeStateProvider nodeStateProvider;
 
+    private NodeStateEditor editor;
     private boolean isAlive = true;
 
     private final SessionContext<SessionImpl> sessionContext = new Context();
@@ -75,11 +67,9 @@ public class SessionImpl extends Abstrac
         this.repository = repository;
         this.connection = connection;
 
+        editor = connection.getNodeStateEditor(connection.getCurrentRoot());
         valueFactory = new ValueFactoryImpl();
         workspace = new WorkspaceImpl(sessionContext);
-
-        transientSpace = new TransientSpace(sessionContext.getWorkspaceName(), sessionContext.getMicrokernel());
-        nodeStateProvider = new NodeStateProvider(sessionContext, transientSpace);
     }
 
 
@@ -132,48 +122,7 @@ public class SessionImpl extends Abstrac
     @Override
     public Node getRootNode() throws RepositoryException {
         checkIsAlive();
-        return NodeImpl.create(sessionContext, Path.create(sessionContext.getWorkspaceName()));
-    }
-
-    @Override
-    public Item getItem(String absPath) throws RepositoryException {
-        if (nodeExists(absPath)) {
-            return getNode(absPath);
-        }
-        else {
-            return getProperty(absPath);
-        }
-    }
-
-    @Override
-    public boolean itemExists(String absPath) throws RepositoryException {
-        return nodeExists(absPath) || propertyExists(absPath);
-    }
-
-    @Override
-    public Node getNode(String absPath) throws RepositoryException {
-        return NodeImpl.create(sessionContext, Path.create(sessionContext.getWorkspaceName(), absPath));
-    }
-
-    @Override
-    public boolean nodeExists(String absPath) throws RepositoryException {
-        Path path = Path.create(sessionContext.getWorkspaceName(), absPath);
-        return path.isRoot() || NodeImpl.exist(sessionContext, path);
-    }
-
-    @Override
-    public Property getProperty(String absPath) throws RepositoryException {
-        if ("/".equals(absPath)) {
-            throw new ItemNotFoundException(absPath);
-        }
-
-        return PropertyImpl.create(sessionContext, Path.create(sessionContext.getWorkspaceName(), absPath));
-    }
-
-    @Override
-    public boolean propertyExists(String absPath) throws RepositoryException {
-        Path path = Path.create(sessionContext.getWorkspaceName(), absPath);
-        return !path.isRoot() && PropertyImpl.exist(sessionContext, path);
+        return new NodeImpl(sessionContext, editor);
     }
 
     @Override
@@ -197,13 +146,7 @@ public class SessionImpl extends Abstrac
     @Override
     public void move(String srcAbsPath, String destAbsPath) throws RepositoryException {
         checkIsAlive();
-        Path sourcePath = Path.create(sessionContext.getWorkspaceName(), srcAbsPath);
-        TransientNodeState sourceParent = nodeStateProvider.getNodeState(sourcePath.getParent());
-        if (sourceParent == null) {
-            throw new PathNotFoundException(srcAbsPath);
-        }
-
-        sourceParent.move(sourcePath.getName(), Path.create(sessionContext.getWorkspaceName(), destAbsPath));
+        // todo implement move
     }
 
     //------------------------------------------------------------< state >---
@@ -212,9 +155,8 @@ public class SessionImpl extends Abstrac
     public void save() throws RepositoryException {
         checkIsAlive();
         try {
-            transientSpace.save();
-            connection.commit(connection.getNodeStateEditor(connection.getCurrentRoot()));  // todo: need a better way to update a connection to head
-            nodeStateProvider.clear();
+            NodeState newState = connection.commit(editor);
+            editor = connection.getNodeStateEditor(newState);
         }
         catch (CommitFailedException e) {
             throw new RepositoryException(e);
@@ -225,9 +167,7 @@ public class SessionImpl extends Abstrac
     public void refresh(boolean keepChanges) throws RepositoryException {
         checkIsAlive();
         try {
-            transientSpace.refresh(keepChanges);
             connection.commit(connection.getNodeStateEditor(connection.getCurrentRoot()));  // todo: need a better way to update a connection to head
-            nodeStateProvider.clear();
         }
         catch (CommitFailedException e) {
             throw new RepositoryException(e);
@@ -237,7 +177,9 @@ public class SessionImpl extends Abstrac
     @Override
     public boolean hasPendingChanges() throws RepositoryException {
         checkIsAlive();
-        return transientSpace.isDirty();
+
+        // todo implement hasPendingChanges
+        return false;
     }
 
     //----------------------------------------------------------< Lifecycle >---
@@ -495,18 +437,9 @@ public class SessionImpl extends Abstrac
         }
 
         @Override
-        public MicroKernel getMicrokernel() {
-            return globalContext.getInstance(MicroKernel.class);
-        }
-
-        @Override
         public ValueFactory getValueFactory() {
             return valueFactory;
         }
 
-        @Override
-        public NodeStateProvider getNodeStateProvider() {
-            return nodeStateProvider;
-        }
     }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1311685&r1=1311684&r2=1311685&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Tue Apr 10 11:42:04 2012
@@ -878,6 +878,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void setStringProperty() throws RepositoryException, IOException {
         Node parentNode = getNode(TEST_PATH);
         addProperty(parentNode, "string", getSession().getValueFactory().createValue("string \" value"));
@@ -913,6 +914,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP") // fixme
     public void setMultiValuedProperty() throws RepositoryException {
         Node parentNode = getNode(TEST_PATH);
         Value[] values = new Value[2];
@@ -1014,6 +1016,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void sessionSave() throws RepositoryException {
         Session session1 = getRepository().login();
         Session session2 = getRepository().login();
@@ -1064,6 +1067,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void sessionRefresh() throws RepositoryException {
         Session session = getRepository().login();
         try {
@@ -1106,6 +1110,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void sessionRefreshFalse() throws RepositoryException {
         Session session = getRepository().login();
         try {
@@ -1124,6 +1129,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void refreshConflict() throws RepositoryException {
         Session session1 = getRepository().login();
         Session session2 = getRepository().login();
@@ -1148,6 +1154,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")  // fixme
     public void refreshConflict2() throws RepositoryException {
         getSession().getRootNode().addNode("node");
         getSession().save();
@@ -1205,6 +1212,7 @@ public class RepositoryTest extends Abst
     }
 
     @Test
+    @Ignore("WIP")
     public void move() throws RepositoryException {
         Session session = getSession();