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/03 19:51:52 UTC
svn commit: r1309072 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel:
KernelNodeStateEditor.java TransientNodeState.java
Author: mduerig
Date: Tue Apr 3 17:51:52 2012
New Revision: 1309072
URL: http://svn.apache.org/viewvc?rev=1309072&view=rev
Log:
OAK-9: Internal tree builder
move TransientNodeState to top level class
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java
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=1309072&r1=1309071&r2=1309072&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 3 17:51:52 2012
@@ -19,21 +19,11 @@
package org.apache.jackrabbit.oak.kernel;
import org.apache.jackrabbit.mk.api.MicroKernel;
-import org.apache.jackrabbit.mk.model.AbstractChildNodeEntry;
-import org.apache.jackrabbit.mk.model.AbstractNodeState;
-import org.apache.jackrabbit.mk.model.ChildNodeEntry;
import org.apache.jackrabbit.mk.model.NodeState;
import org.apache.jackrabbit.mk.model.NodeStateEditor;
import org.apache.jackrabbit.mk.model.PropertyState;
import org.apache.jackrabbit.mk.util.PathUtils;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
/**
* This {@code NodeStateEditor} implementation accumulates all changes into a json diff
* and applies them to the microkernel on
@@ -66,9 +56,7 @@ public class KernelNodeStateEditor imple
jsop = parentEditor.jsop;
}
- private KernelNodeStateEditor(KernelNodeStateEditor parentEditor,
- TransientNodeState state) {
-
+ KernelNodeStateEditor(KernelNodeStateEditor parentEditor, TransientNodeState state) {
base = parentEditor.base;
transientState = state;
jsop = parentEditor.jsop;
@@ -148,7 +136,7 @@ public class KernelNodeStateEditor imple
return null;
}
else if (childState instanceof TransientNodeState) {
- return ((TransientNodeState) childState).editor;
+ return ((TransientNodeState) childState).getEditor();
}
else {
return new KernelNodeStateEditor(this, childState, name);
@@ -195,241 +183,4 @@ public class KernelNodeStateEditor imple
return nodeState.getChildNode(name) != null;
}
- private class TransientNodeState extends AbstractNodeState {
- private final KernelNodeStateEditor editor;
- private final NodeState persistentState;
-
- private final Map<String, NodeState> addedNodes = new HashMap<String, NodeState>();
- private final Set<String> removedNodes = new HashSet<String>();
- private final Map<String, PropertyState> addedProperties = new HashMap<String, PropertyState>();
- private final Set<String> removedProperties = new HashSet<String>();
-
- private String name;
- private TransientNodeState parent;
-
- public TransientNodeState(NodeState persistentState, KernelNodeStateEditor editor,
- TransientNodeState parent, String name) {
-
- this.editor = editor;
- this.persistentState = persistentState;
- this.parent = parent;
- this.name = name;
- }
-
- public TransientNodeState(KernelNodeStateEditor parentEditor, String name) {
- editor = new KernelNodeStateEditor(parentEditor, this);
- persistentState = null;
- parent = parentEditor.getNodeState();
- this.name = name;
- }
-
- @Override
- public PropertyState getProperty(String name) {
- PropertyState state = addedProperties.get(name);
- if (state != null) {
- return state;
- }
-
- return removedProperties.contains(name)
- ? null
- : persistentState.getProperty(name);
- }
-
- @Override
- public long getPropertyCount() {
- // todo optimise getPropertyCount
- // persistentCount - removedCount + addedCount won't work however since
- // persisted properties might be overlaid
- return super.getPropertyCount();
- }
-
- @Override
- public NodeState getChildNode(String name) {
- NodeState state = addedNodes.get(name);
- if (state != null) {
- return state;
- }
-
- return removedNodes.contains(name)
- ? null
- : persistentState.getChildNode(name);
- }
-
- @Override
- public long getChildNodeCount() {
- // todo optimise getChildNodeCount
- // persistentCount - removedCount + addedCount won't work however since
- // persisted nodes might be overlaid
- return super.getChildNodeCount();
- }
-
- @Override
- public Iterable<? extends PropertyState> getProperties() {
- final Set<String> removed = new HashSet<String>();
- removed.addAll(removedProperties);
-
- final Map<String, PropertyState> added = new HashMap<String, PropertyState>();
- added.putAll(addedProperties);
-
- final Iterable<? extends PropertyState>
- persistedProperties = persistentState.getProperties();
-
- return new Iterable<PropertyState>() {
- @Override
- public Iterator<PropertyState> iterator() {
- return new Iterator<PropertyState>() {
- private final Iterator<? extends PropertyState>
- properties = persistedProperties.iterator();
- private PropertyState next;
-
- @Override
- public boolean hasNext() {
- if (next == null) {
- while (properties.hasNext()) {
- PropertyState prop = properties.next();
- if (added.containsKey(prop.getName())) {
- next = added.get(prop.getName());
- break;
- }
- if (!removed.contains(prop.getName())) {
- next = prop;
- break;
- }
- }
- }
- return next != null;
- }
-
- @Override
- public PropertyState next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- PropertyState e = next;
- next = null;
- return e;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("remove");
- }
- };
- }
- };
- }
-
- @Override
- public Iterable<? extends ChildNodeEntry> getChildNodeEntries(long offset, int count) {
- final Set<String> removed = new HashSet<String>();
- removed.addAll(removedNodes);
-
- final Map<String, NodeState> added = new HashMap<String, NodeState>();
- added.putAll(addedNodes);
-
- final Iterable<? extends ChildNodeEntry>
- baseNodes = persistentState.getChildNodeEntries(offset, count);
-
- return new Iterable<ChildNodeEntry>() {
- @Override
- public Iterator<ChildNodeEntry> iterator() {
- return new Iterator<ChildNodeEntry>() {
- private final Iterator<? extends ChildNodeEntry>
- properties = baseNodes.iterator();
- private ChildNodeEntry next;
-
- @Override
- public boolean hasNext() {
- if (next == null) {
- while (properties.hasNext()) {
- final ChildNodeEntry entry = properties.next();
- if (added.containsKey(entry.getName())) {
- next = new AbstractChildNodeEntry() {
- @Override
- public String getName() {
- return entry.getName();
- }
-
- @Override
- public NodeState getNode() {
- return added.get(entry.getName());
- }
- };
- break;
- }
- if (!removed.contains(entry.getName())) {
- next = entry;
- break;
- }
- }
- }
- return next != null;
- }
-
- @Override
- public ChildNodeEntry next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- ChildNodeEntry e = next;
- next = null;
- return e;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("remove");
- }
- };
- }
- };
- }
-
- //------------------------------------------------------------< internal >---
-
- String getPath() {
- if (parent == null) {
- return name;
- }
- else {
- String path = parent.getPath();
- return path.isEmpty()
- ? name
- : path + '/' + name;
- }
- }
-
- void addNode(String name) {
- addedNodes.put(name, new TransientNodeState(editor, name));
- }
-
- void removeNode(String name) {
- addedNodes.remove(name);
- removedNodes.add(name);
- }
-
- void setProperty(PropertyState state) {
- addedProperties.put(state.getName(), state);
- }
-
- void removeProperty(String name) {
- addedProperties.remove(name);
- removedProperties.add(name);
- }
-
- void move(String name, TransientNodeState destParent, String destName) {
- NodeState state = getChildNode(name);
- removeNode(name);
- destParent.addNode(destName, state);
- }
-
- void copy(String name, TransientNodeState destParent, String destName) {
- NodeState state = getChildNode(name);
- destParent.addNode(destName, state);
- }
-
- private void addNode(String name, NodeState state) {
- addedNodes.put(name, state);
- }
- }
}
Added: 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=1309072&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java Tue Apr 3 17:51:52 2012
@@ -0,0 +1,256 @@
+package org.apache.jackrabbit.oak.kernel;
+
+import org.apache.jackrabbit.mk.model.AbstractChildNodeEntry;
+import org.apache.jackrabbit.mk.model.AbstractNodeState;
+import org.apache.jackrabbit.mk.model.ChildNodeEntry;
+import org.apache.jackrabbit.mk.model.NodeState;
+import org.apache.jackrabbit.mk.model.PropertyState;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+public class TransientNodeState extends AbstractNodeState {
+ private final KernelNodeStateEditor editor;
+ private final NodeState persistentState;
+
+ private final Map<String, NodeState> addedNodes = new HashMap<String, NodeState>();
+ private final Set<String> removedNodes = new HashSet<String>();
+ private final Map<String, PropertyState> addedProperties = new HashMap<String, PropertyState>();
+ private final Set<String> removedProperties = new HashSet<String>();
+
+ private String name;
+ private TransientNodeState parent;
+
+ TransientNodeState(NodeState persistentState, KernelNodeStateEditor editor,
+ TransientNodeState parent, String name) {
+
+ this.editor = editor;
+ this.persistentState = persistentState;
+ this.parent = parent;
+ this.name = name;
+ }
+
+ TransientNodeState(KernelNodeStateEditor parentEditor, String name) {
+ editor = new KernelNodeStateEditor(parentEditor, this);
+ persistentState = null;
+ parent = parentEditor.getNodeState();
+ this.name = name;
+ }
+
+ @Override
+ public PropertyState getProperty(String name) {
+ PropertyState state = addedProperties.get(name);
+ if (state != null) {
+ return state;
+ }
+
+ return removedProperties.contains(name)
+ ? null
+ : persistentState.getProperty(name);
+ }
+
+ @Override
+ public long getPropertyCount() {
+ // todo optimise getPropertyCount
+ // persistentCount - removedCount + addedCount won't work however since
+ // persisted properties might be overlaid
+ return super.getPropertyCount();
+ }
+
+ @Override
+ public NodeState getChildNode(String name) {
+ NodeState state = addedNodes.get(name);
+ if (state != null) {
+ return state;
+ }
+
+ return removedNodes.contains(name)
+ ? null
+ : persistentState.getChildNode(name);
+ }
+
+ @Override
+ public long getChildNodeCount() {
+ // todo optimise getChildNodeCount
+ // persistentCount - removedCount + addedCount won't work however since
+ // persisted nodes might be overlaid
+ return super.getChildNodeCount();
+ }
+
+ @Override
+ public Iterable<? extends PropertyState> getProperties() {
+ final Set<String> removed = new HashSet<String>();
+ removed.addAll(removedProperties);
+
+ final Map<String, PropertyState> added = new HashMap<String, PropertyState>();
+ added.putAll(addedProperties);
+
+ final Iterable<? extends PropertyState>
+ persistedProperties = persistentState.getProperties();
+
+ return new Iterable<PropertyState>() {
+ @Override
+ public Iterator<PropertyState> iterator() {
+ return new Iterator<PropertyState>() {
+ private final Iterator<? extends PropertyState>
+ properties = persistedProperties.iterator();
+ private PropertyState next;
+
+ @Override
+ public boolean hasNext() {
+ if (next == null) {
+ while (properties.hasNext()) {
+ PropertyState prop = properties.next();
+ if (added.containsKey(prop.getName())) {
+ next = added.get(prop.getName());
+ break;
+ }
+ if (!removed.contains(prop.getName())) {
+ next = prop;
+ break;
+ }
+ }
+ }
+ return next != null;
+ }
+
+ @Override
+ public PropertyState next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ PropertyState e = next;
+ next = null;
+ return e;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("remove");
+ }
+ };
+ }
+ };
+ }
+
+ @Override
+ public Iterable<? extends ChildNodeEntry> getChildNodeEntries(long offset, int count) {
+ final Set<String> removed = new HashSet<String>();
+ removed.addAll(removedNodes);
+
+ final Map<String, NodeState> added = new HashMap<String, NodeState>();
+ added.putAll(addedNodes);
+
+ final Iterable<? extends ChildNodeEntry>
+ baseNodes = persistentState.getChildNodeEntries(offset, count);
+
+ return new Iterable<ChildNodeEntry>() {
+ @Override
+ public Iterator<ChildNodeEntry> iterator() {
+ return new Iterator<ChildNodeEntry>() {
+ private final Iterator<? extends ChildNodeEntry>
+ properties = baseNodes.iterator();
+ private ChildNodeEntry next;
+
+ @Override
+ public boolean hasNext() {
+ if (next == null) {
+ while (properties.hasNext()) {
+ final ChildNodeEntry entry = properties.next();
+ if (added.containsKey(entry.getName())) {
+ next = new AbstractChildNodeEntry() {
+ @Override
+ public String getName() {
+ return entry.getName();
+ }
+
+ @Override
+ public NodeState getNode() {
+ return added.get(entry.getName());
+ }
+ };
+ break;
+ }
+ if (!removed.contains(entry.getName())) {
+ next = entry;
+ break;
+ }
+ }
+ }
+ return next != null;
+ }
+
+ @Override
+ public ChildNodeEntry next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ ChildNodeEntry e = next;
+ next = null;
+ return e;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("remove");
+ }
+ };
+ }
+ };
+ }
+
+ //------------------------------------------------------------< internal >---
+
+ KernelNodeStateEditor getEditor() {
+ return editor;
+ }
+
+ String getPath() {
+ if (parent == null) {
+ return name;
+ }
+ else {
+ String path = parent.getPath();
+ return path.isEmpty()
+ ? name
+ : path + '/' + name;
+ }
+ }
+
+ void addNode(String name) {
+ addedNodes.put(name, new TransientNodeState(editor, name));
+ }
+
+ void removeNode(String name) {
+ addedNodes.remove(name);
+ removedNodes.add(name);
+ }
+
+ void setProperty(PropertyState state) {
+ addedProperties.put(state.getName(), state);
+ }
+
+ void removeProperty(String name) {
+ addedProperties.remove(name);
+ removedProperties.add(name);
+ }
+
+ void move(String name, TransientNodeState destParent, String destName) {
+ NodeState state = getChildNode(name);
+ removeNode(name);
+ destParent.addNode(destName, state);
+ }
+
+ void copy(String name, TransientNodeState destParent, String destName) {
+ NodeState state = getChildNode(name);
+ destParent.addNode(destName, state);
+ }
+
+ private void addNode(String name, NodeState state) {
+ addedNodes.put(name, state);
+ }
+}