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 2013/04/18 12:14:28 UTC
svn commit: r1469264 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
Author: jukka
Date: Thu Apr 18 10:14:28 2013
New Revision: 1469264
URL: http://svn.apache.org/r1469264
Log:
OAK-778: Recursive wrapping of ModifiedNodeState
Unwrap ModifiedNodeState instances passed to MemoryNodeBuilder.setNode()
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java?rev=1469264&r1=1469263&r2=1469264&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java Thu Apr 18 10:14:28 2013
@@ -526,7 +526,38 @@ public class MemoryNodeBuilder implement
private final Map<String, MutableNodeState> nodes = newHashMap();
public MutableNodeState(NodeState base) {
- if (base != null) {
+ if (base instanceof ModifiedNodeState) {
+ ModifiedNodeState modified = (ModifiedNodeState) base;
+ this.base = modified.getBaseState();
+ modified.compareAgainstBaseState(new NodeStateDiff() {
+ @Override
+ public void propertyAdded(PropertyState after) {
+ properties.put(after.getName(), after);
+ }
+ @Override
+ public void propertyChanged(
+ PropertyState before, PropertyState after) {
+ properties.put(after.getName(), after);
+ }
+ @Override
+ public void propertyDeleted(PropertyState before) {
+ properties.put(before.getName(), null);
+ }
+ @Override
+ public void childNodeAdded(String name, NodeState after) {
+ nodes.put(name, new MutableNodeState(after));
+ }
+ @Override
+ public void childNodeChanged(
+ String name, NodeState before, NodeState after) {
+ nodes.put(name, new MutableNodeState(after));
+ }
+ @Override
+ public void childNodeDeleted(String name, NodeState before) {
+ nodes.put(name, null);
+ }
+ });
+ } else if (base != null) {
this.base = base;
} else {
this.base = EMPTY_NODE;
@@ -554,19 +585,77 @@ public class MemoryNodeBuilder implement
}
void reset(NodeState newBase) {
- base = newBase;
- properties.clear();
+ if (newBase instanceof ModifiedNodeState) {
+ ModifiedNodeState modified = (ModifiedNodeState) newBase;
+ base = modified.getBaseState();
+ properties.clear();
+
+ Iterator<Map.Entry<String, MutableNodeState>> iterator =
+ nodes.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<String, MutableNodeState> entry = iterator.next();
+ MutableNodeState cstate = entry.getValue();
+ NodeState cbase = newBase.getChildNode(entry.getKey());
+ if (!cbase.exists() || cstate == null) {
+ iterator.remove();
+ } else {
+ cstate.reset(cbase);
+ }
+ }
- Iterator<Map.Entry<String, MutableNodeState>> iterator =
- nodes.entrySet().iterator();
- while (iterator.hasNext()) {
- Map.Entry<String, MutableNodeState> entry = iterator.next();
- MutableNodeState cstate = entry.getValue();
- NodeState cbase = newBase.getChildNode(entry.getKey());
- if (!cbase.exists() || cstate == null) {
- iterator.remove();
- } else {
- cstate.reset(cbase);
+ modified.compareAgainstBaseState(new NodeStateDiff() {
+ @Override
+ public void propertyAdded(PropertyState after) {
+ properties.put(after.getName(), after);
+ }
+ @Override
+ public void propertyChanged(
+ PropertyState before, PropertyState after) {
+ properties.put(after.getName(), after);
+ }
+ @Override
+ public void propertyDeleted(PropertyState before) {
+ properties.put(before.getName(), null);
+ }
+ @Override
+ public void childNodeAdded(String name, NodeState after) {
+ MutableNodeState cstate = nodes.get(name);
+ if (cstate != null) {
+ cstate.reset(after);
+ } else {
+ nodes.put(name, new MutableNodeState(after));
+ }
+ }
+ @Override
+ public void childNodeChanged(
+ String name, NodeState before, NodeState after) {
+ MutableNodeState cstate = nodes.get(name);
+ if (cstate != null) {
+ cstate.reset(after);
+ } else {
+ nodes.put(name, new MutableNodeState(after));
+ }
+ }
+ @Override
+ public void childNodeDeleted(String name, NodeState before) {
+ nodes.put(name, null);
+ }
+ });
+ } else {
+ base = newBase;
+ properties.clear();
+
+ Iterator<Map.Entry<String, MutableNodeState>> iterator =
+ nodes.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<String, MutableNodeState> entry = iterator.next();
+ MutableNodeState cstate = entry.getValue();
+ NodeState cbase = newBase.getChildNode(entry.getKey());
+ if (!cbase.exists() || cstate == null) {
+ iterator.remove();
+ } else {
+ cstate.reset(cbase);
+ }
}
}
}