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 ju...@apache.org on 2012/07/22 12:43:56 UTC

svn commit: r1364252 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory: MemoryNodeStateBuilder.java MemoryNodeStore.java

Author: jukka
Date: Sun Jul 22 10:43:55 2012
New Revision: 1364252

URL: http://svn.apache.org/viewvc?rev=1364252&view=rev
Log:
OAK-167: Caching NodeStore implementation

Introduce a mechanism for MNSB subclasses to track the number of updates

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java?rev=1364252&r1=1364251&r2=1364252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java Sun Jul 22 10:43:55 2012
@@ -45,15 +45,13 @@ public class MemoryNodeStateBuilder impl
     /**
      * Set of added, modified or removed ({@code null} value) property states.
      */
-    private Map<String, PropertyState> properties =
-            new HashMap<String, PropertyState>();
+    private Map<String, PropertyState> properties = Maps.newHashMap();
 
     /**
      * Set of builders for added, modified or removed ({@code null} value)
      * child nodes.
      */
-    private final Map<String, NodeStateBuilder> builders =
-            new HashMap<String, NodeStateBuilder>();
+    private final Map<String, NodeStateBuilder> builders = Maps.newHashMap();
 
     /**
      * Flag to indicate that the current {@link #properties} map is being
@@ -63,9 +61,39 @@ public class MemoryNodeStateBuilder impl
      */
     private boolean frozen = false;
 
+    /**
+     * Creates a new in-memory node state builder.
+     *
+     * @param base base state of the new builder, or {@code null}
+     */
     public MemoryNodeStateBuilder(NodeState base) {
-        assert base != null;
-        this.base = base;
+        if (base != null) {
+            this.base = base;
+        } else {
+            this.base = MemoryNodeState.EMPTY_NODE;
+        }
+    }
+
+    /**
+     * Factory method for creating new child state builders. Subclasses may
+     * override this method to control the behavior of child state builders.
+     *
+     * @param child base state of the new builder, or {@code null}
+     * @return new builder
+     */
+    protected MemoryNodeStateBuilder createChildBuilder(NodeState child) {
+        return new MemoryNodeStateBuilder(child);
+    }
+
+    /**
+     * Called whenever <em>this</em> node is modified, i.e. a property is
+     * added, changed or removed, or a child node is added or removed. Changes
+     * inside child nodes or the subtrees below are not reported. The default
+     * implementation does nothing, but subclasses may override this method
+     * to better track changes.
+     */
+    protected void updated() {
+        // do nothing
     }
 
     /**
@@ -160,8 +188,9 @@ public class MemoryNodeStateBuilder impl
             if (nodeState.equals(base.getChildNode(name))) {
                 builders.remove(name);
             } else {
-                builders.put(name, new MemoryNodeStateBuilder(nodeState));
+                builders.put(name, createChildBuilder(nodeState));
             }
+            updated();
         }
     }
 
@@ -172,6 +201,7 @@ public class MemoryNodeStateBuilder impl
         } else {
             builders.remove(name);
         }
+        updated();
     }
 
     @Override
@@ -219,6 +249,7 @@ public class MemoryNodeStateBuilder impl
     public void setProperty(String name, CoreValue value) {
         unfreeze();
         properties.put(name, new SinglePropertyState(name, value));
+        updated();
     }
 
     @Override
@@ -229,6 +260,7 @@ public class MemoryNodeStateBuilder impl
         } else {
             properties.put(name, new MultiPropertyState(name, values));
         }
+        updated();
     }
 
     @Override
@@ -239,6 +271,7 @@ public class MemoryNodeStateBuilder impl
         } else {
             properties.remove(name);
         }
+        updated();
     }
 
     @Override
@@ -246,10 +279,7 @@ public class MemoryNodeStateBuilder impl
         NodeStateBuilder builder = builders.get(name);
         if (builder == null) {
             NodeState baseState = base.getChildNode(name);
-            if (baseState == null) {
-                baseState = MemoryNodeState.EMPTY_NODE;
-            }
-            builder = new MemoryNodeStateBuilder(baseState);
+            builder = createChildBuilder(baseState);
             builders.put(name, builder);
         }
         return builder;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java?rev=1364252&r1=1364251&r2=1364252&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java Sun Jul 22 10:43:55 2012
@@ -41,9 +41,6 @@ public class MemoryNodeStore implements 
 
     @Override
     public NodeStateBuilder getBuilder(NodeState base) {
-        if (base == null) {
-            base = MemoryNodeState.EMPTY_NODE;
-        }
         return new MemoryNodeStateBuilder(base);
     }