You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2012/02/16 18:01:53 UTC

svn commit: r1245082 - in /jackrabbit/sandbox/jackrabbit-microkernel/src: main/java/org/apache/jackrabbit/state/NodeState.java main/java/org/apache/jackrabbit/utils/Provider.java test/java/org/apache/jackrabbit/RepositoryTest.java

Author: mduerig
Date: Thu Feb 16 17:01:53 2012
New Revision: 1245082

URL: http://svn.apache.org/viewvc?rev=1245082&view=rev
Log:
Microkernel based prototype of JCR implementation (WIP)
- make refresh(false) work correctly  

Added:
    jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Provider.java
Modified:
    jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/NodeState.java
    jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/RepositoryTest.java

Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/NodeState.java?rev=1245082&r1=1245081&r2=1245082&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/NodeState.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/NodeState.java Thu Feb 16 17:01:53 2012
@@ -31,6 +31,7 @@ import org.apache.jackrabbit.spi.commons
 import org.apache.jackrabbit.spi.commons.iterator.Predicate;
 import org.apache.jackrabbit.spi.commons.iterator.Transformer;
 import org.apache.jackrabbit.state.ChangeTree.NodeDelta;
+import org.apache.jackrabbit.utils.Provider;
 
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
@@ -41,14 +42,23 @@ import java.util.Map.Entry;
 
 public class NodeState {
     private final Context sessionContext;
-    private final NodeDelta nodeDelta;  // fixme: re-resolve on refresh/save
+    private final Provider<NodeDelta> nodeDelta;
 
     private String revision;
     private JsonObject jsonObject;
 
-    private NodeState(Context sessionContext, NodeDelta nodeDelta) {
+    private NodeState(Context sessionContext, final NodeDelta nodeDelta) {
         this.sessionContext = sessionContext;
-        this.nodeDelta = nodeDelta;
+
+        this.nodeDelta = new Provider<NodeDelta>() {
+            private NodeDelta nd = nodeDelta;
+
+            @Override
+            public NodeDelta get() {
+                nd = getTransientSpace().getNodeDelta(nd.getPath());
+                return nd;
+            }
+        };
     }
 
     public boolean isRoot() {
@@ -56,7 +66,7 @@ public class NodeState {
     }
 
     public Path getPath() {
-        return nodeDelta.getPath();
+        return nodeDelta.get().getPath();
     }
 
     public String getName() {
@@ -64,31 +74,32 @@ public class NodeState {
     }
 
     public boolean isNew() {
-        return nodeDelta.isTransient() && !nodeDelta.isRemoved();
+        NodeDelta nd = nodeDelta.get();
+        return nd.isTransient() && !nd.isRemoved();
     }
 
     public boolean isModified() {
-        return nodeDelta.isTransient();
+        return nodeDelta.get().isTransient();
     }
 
     public NodeState addNode(String name) throws ItemExistsException {
-        NodeDelta child = nodeDelta.addNode(name);
+        NodeDelta child = nodeDelta.get().addNode(name);
         return getNodeState(sessionContext, child);
     }
 
     public void remove() throws ItemNotFoundException {
-        nodeDelta.getParent().removeNode(getName());
+        nodeDelta.get().getParent().removeNode(getName());
     }
 
     public void move(String name, Path destination) throws ItemExistsException, PathNotFoundException,
             ItemNotFoundException {
 
-        nodeDelta.moveNode(name, destination);
+        nodeDelta.get().moveNode(name, destination);
         nodeStateCache().remove(getPath().concat(name));
     }
 
     public void setProperty(String name, JsonValue value) {
-        nodeDelta.setValue(name, value);
+        nodeDelta.get().setValue(name, value);
     }
 
     public boolean hasChildNodeStates() {
@@ -100,22 +111,22 @@ public class NodeState {
 
         Iterator<Entry<String, JsonValue>> childNodeEntries =
             Iterators.filterIterator(childEntries.entrySet().iterator(),
-                new Predicate<Entry<String, JsonValue>>() {
-                    @Override
-                    public boolean evaluate(Entry<String, JsonValue> entry) {
-                        return isNode(entry.getValue()) && !nodeDelta.isNodeModified(entry.getKey());
-                    }
-                });
+                    new Predicate<Entry<String, JsonValue>>() {
+                        @Override
+                        public boolean evaluate(Entry<String, JsonValue> entry) {
+                            return isNode(entry.getValue()) && !nodeDelta.get().isNodeModified(entry.getKey());
+                        }
+                    });
 
         Iterator<NodeState> childNodeStates = Iterators.transformIterator(childNodeEntries,
             new Transformer<Entry<String, JsonValue>, NodeState>() {
                 @Override
                 public NodeState transform(Entry<String, JsonValue> entry) {
-                    return getNodeState(sessionContext, nodeDelta.getNode(entry.getKey()));
+                    return getNodeState(sessionContext, nodeDelta.get().getNode(entry.getKey()));
                 }
         });
 
-        Iterator<NodeState> modifiedNodeStates = Iterators.transformIterator(nodeDelta.getNodes(),
+        Iterator<NodeState> modifiedNodeStates = Iterators.transformIterator(nodeDelta.get().getNodes(),
             new Transformer<NodeDelta, NodeState>() {
                 @Override
                 public NodeState transform(NodeDelta delta) {
@@ -139,15 +150,15 @@ public class NodeState {
 
         Iterator<Entry<String, JsonValue>> propertyEntries =
             Iterators.filterIterator(childEntries.entrySet().iterator(),
-                new Predicate<Entry<String, JsonValue>>() {
-                    @Override
-                    public boolean evaluate(Entry<String, JsonValue> entry) {
-                        return !entry.getKey().startsWith(":") && !isNode(entry.getValue())
-                            && !nodeDelta.hasProperty(entry.getKey());
-                    }
-                });
+                    new Predicate<Entry<String, JsonValue>>() {
+                        @Override
+                        public boolean evaluate(Entry<String, JsonValue> entry) {
+                            return !entry.getKey().startsWith(":") && !isNode(entry.getValue())
+                                    && !nodeDelta.get().hasProperty(entry.getKey());
+                        }
+                    });
 
-        return Iterators.iteratorChain(propertyEntries, nodeDelta.getProperties());
+        return Iterators.iteratorChain(propertyEntries, nodeDelta.get().getProperties());
     }
 
     public Iterator<Entry<String, JsonValue>> getProperties(Predicate<Entry<String, JsonValue>> condition) {
@@ -168,16 +179,16 @@ public class NodeState {
     }
 
     public boolean isPropertyNew(String name) {
-        JsonValue value = nodeDelta.getProperty(name);
+        JsonValue value = nodeDelta.get().getProperty(name);
         return value != null && !value.isNull() && getPersistedPropertyValue(name) == null;
     }
 
     public boolean isPropertyModified(String name) {
-        return nodeDelta.hasProperty(name);
+        return nodeDelta.get().hasProperty(name);
     }
 
     public void removeProperty(String name) {
-        nodeDelta.setValue(name, null);
+        nodeDelta.get().setValue(name, null);
     }
 
     public static NodeState getNodeState(Context sessionContext, Path path) {
@@ -208,6 +219,10 @@ public class NodeState {
         return sessionContext.getRevision();
     }
     
+    private TransientSpace getTransientSpace() {
+        return sessionContext.getTransientSpace();
+    }
+    
     private static NodeState getNodeState(Context sessionContext, NodeDelta nodeDelta) {
         NodeStateCache cache = sessionContext.getNodeStateCache();
         Path path = nodeDelta.getPath();
@@ -225,7 +240,7 @@ public class NodeState {
     }
 
     private JsonValue getPropertyValueOrNull(String name) {
-        JsonValue value = nodeDelta.getProperty(name);
+        JsonValue value = nodeDelta.get().getProperty(name);
         if (value == null) {
             return getPersistedPropertyValue(name);
         }
@@ -245,7 +260,7 @@ public class NodeState {
     }
 
     private synchronized JsonObject getJsonObject() {
-        Path path = nodeDelta.getPersistentPath();
+        Path path = nodeDelta.get().getPersistentPath();
         String baseRevision = getBaseRevision();
         if (jsonObject == null || !revision.equals(baseRevision)) {
             revision =  baseRevision;

Added: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Provider.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Provider.java?rev=1245082&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Provider.java (added)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Provider.java Thu Feb 16 17:01:53 2012
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.utils;
+
+public interface Provider<T> {
+    T get();
+}

Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/RepositoryTest.java?rev=1245082&r1=1245081&r2=1245082&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/RepositoryTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/test/java/org/apache/jackrabbit/RepositoryTest.java Thu Feb 16 17:01:53 2012
@@ -1121,6 +1121,27 @@ public class RepositoryTest {
             session.logout();
         }
     }
+    
+    @Test
+    public void sessionRefreshFalse() throws RepositoryException {
+        Session session = getRepository().login();
+        try {
+            session.getNode("/").addNode("foo");
+            session.save();
+
+            Node foo = session.getNode("/foo");
+            foo.addNode("added");
+            NodeIterator it = foo.getNodes();
+            assertTrue(it.hasNext());
+
+            session.refresh(false);
+            it = foo.getNodes();
+            assertFalse(it.hasNext());
+        }
+        finally {
+            session.logout();
+        }
+    }
 
     @Test
     public void refreshConflict() throws RepositoryException {