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/04 11:35:55 UTC
svn commit: r1309300 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel:
KernelNodeStateEditor.java TransientNodeState.java
Author: mduerig
Date: Wed Apr 4 09:35:54 2012
New Revision: 1309300
URL: http://svn.apache.org/viewvc?rev=1309300&view=rev
Log:
OAK-9: Internal tree builder
Make TransientNodeState not inherit from NodeState
Modified:
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/TransientNodeState.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=1309300&r1=1309299&r2=1309300&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 Wed Apr 4 09:35:54 2012
@@ -48,14 +48,6 @@ public class KernelNodeStateEditor imple
jsop = new StringBuilder();
}
- private KernelNodeStateEditor(KernelNodeStateEditor parentEditor,
- NodeState state, String name) {
-
- base = parentEditor.base;
- transientState = new TransientNodeState(state, this, parentEditor.getNodeState(), name);
- jsop = parentEditor.jsop;
- }
-
KernelNodeStateEditor(KernelNodeStateEditor parentEditor, TransientNodeState state) {
base = parentEditor.base;
transientState = state;
@@ -131,21 +123,16 @@ public class KernelNodeStateEditor imple
@Override
public KernelNodeStateEditor edit(String name) {
- NodeState childState = transientState.getChildNode(name);
- if (childState == null) {
- return null;
- }
- else if (childState instanceof TransientNodeState) {
- return ((TransientNodeState) childState).getEditor();
- }
- else {
- return new KernelNodeStateEditor(this, childState, name);
- }
+ TransientNodeState childState = transientState.getChildNode(name);
+ return childState == null
+ ? null
+ : childState.getEditor();
}
@Override
- public TransientNodeState getNodeState() {
- return transientState;
+ public NodeState getNodeState() {
+ // todo implement getNodeState
+ return null;
}
@Override
@@ -162,16 +149,19 @@ public class KernelNodeStateEditor imple
return new KernelNodeState(microkernel, targetPath, rev);
}
+ TransientNodeState getTransientState() {
+ return transientState;
+ }
+
private TransientNodeState getTransientState(String path) {
- KernelNodeStateEditor editor = this;
- for(String name : PathUtils.elements(path)) {
- editor = editor.edit(name);
- if (editor == null) {
+ TransientNodeState state = transientState;
+ for (String name : PathUtils.elements(path)) {
+ state = state.getChildNode(name);
+ if (state == null) {
return null;
}
}
-
- return editor.transientState;
+ return state;
}
private String path(String name) {
@@ -179,8 +169,8 @@ public class KernelNodeStateEditor imple
return path.isEmpty() ? name : path + '/' + name;
}
- private static boolean hasNode(NodeState nodeState, String name) {
- return nodeState.getChildNode(name) != null;
+ private static boolean hasNode(TransientNodeState state, String name) {
+ return state.getChildNode(name) != null;
}
}
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=1309300&r1=1309299&r2=1309300&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 Wed Apr 4 09:35:54 2012
@@ -1,7 +1,5 @@
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;
@@ -14,13 +12,14 @@ import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
-// fixme: this should be immutable as mandated by the NodeState interface
-public class TransientNodeState extends AbstractNodeState {
+public class TransientNodeState {
private final KernelNodeStateEditor editor;
private final NodeState persistentState;
- private final Map<String, TransientNodeState>
- addedNodes = new HashMap<String, TransientNodeState>();
+ private final Map<NodeState, TransientNodeState> existingChildNodes =
+ new HashMap<NodeState, TransientNodeState>();
+ private final Map<String, TransientNodeState> addedNodes =
+ new HashMap<String, TransientNodeState>();
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>();
@@ -38,9 +37,15 @@ public class TransientNodeState extends
}
private TransientNodeState(KernelNodeStateEditor parentEditor, String name) {
+ this(parentEditor, name, null);
+ }
+
+ private TransientNodeState(KernelNodeStateEditor parentEditor, String name,
+ NodeState persistedState) {
+
editor = new KernelNodeStateEditor(parentEditor, this);
- persistentState = null;
- parent = parentEditor.getNodeState();
+ this.persistentState = persistedState;
+ parent = parentEditor.getTransientState();
this.name = name;
}
@@ -63,7 +68,6 @@ public class TransientNodeState extends
this.removedProperties.addAll(state.removedProperties);
}
- @Override
public PropertyState getProperty(String name) {
PropertyState state = addedProperties.get(name);
if (state != null) {
@@ -75,36 +79,18 @@ public class TransientNodeState extends
: 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);
+ public TransientNodeState getChildNode(String name) {
+ TransientNodeState 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();
+ : getExistingChildNode(name);
}
- @Override
- public Iterable<? extends PropertyState> getProperties() {
+ public Iterable<PropertyState> getProperties() {
final Set<String> removed = new HashSet<String>();
removed.addAll(removedProperties);
@@ -159,46 +145,35 @@ public class TransientNodeState extends
};
}
- @Override
- public Iterable<? extends ChildNodeEntry> getChildNodeEntries(long offset, int count) {
+ public Iterable<TransientNodeState> getChildNodes(long offset, int count) {
final Set<String> removed = new HashSet<String>();
removed.addAll(removedNodes);
- final Map<String, NodeState> added = new HashMap<String, NodeState>();
+ final Map<String, TransientNodeState> added = new HashMap<String, TransientNodeState>();
added.putAll(addedNodes);
final Iterable<? extends ChildNodeEntry>
- baseNodes = persistentState.getChildNodeEntries(offset, count);
+ persistedNodes = persistentState.getChildNodeEntries(offset, count);
- return new Iterable<ChildNodeEntry>() {
+ return new Iterable<TransientNodeState>() {
@Override
- public Iterator<ChildNodeEntry> iterator() {
- return new Iterator<ChildNodeEntry>() {
+ public Iterator<TransientNodeState> iterator() {
+ return new Iterator<TransientNodeState>() {
private final Iterator<? extends ChildNodeEntry>
- properties = baseNodes.iterator();
- private ChildNodeEntry next;
+ nodes = persistedNodes.iterator();
+ private TransientNodeState next;
@Override
public boolean hasNext() {
if (next == null) {
- while (properties.hasNext()) {
- final ChildNodeEntry entry = properties.next();
+ while (nodes.hasNext()) {
+ final ChildNodeEntry entry = nodes.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());
- }
- };
+ next = added.get(entry.getName());
break;
}
if (!removed.contains(entry.getName())) {
- next = entry;
+ next = getExistingChildNode(entry.getName());
break;
}
}
@@ -207,11 +182,11 @@ public class TransientNodeState extends
}
@Override
- public ChildNodeEntry next() {
+ public TransientNodeState next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
- ChildNodeEntry e = next;
+ TransientNodeState e = next;
next = null;
return e;
}
@@ -262,7 +237,7 @@ public class TransientNodeState extends
}
void move(String name, TransientNodeState destParent, String destName) {
- TransientNodeState state = editor.edit(name).getNodeState();
+ TransientNodeState state = getChildNode(name);
removeNode(name);
state.name = destName;
@@ -271,9 +246,19 @@ public class TransientNodeState extends
}
void copy(String name, TransientNodeState destParent, String destName) {
- TransientNodeState state = editor.edit(name).getNodeState();
destParent.addedNodes.put(destName,
- new TransientNodeState(state, destParent, destName));
+ new TransientNodeState(getChildNode(name), destParent, destName));
+ }
+
+ private TransientNodeState getExistingChildNode(String name) {
+ NodeState state = persistentState.getChildNode(name);
+
+ TransientNodeState transientState = existingChildNodes.get(state);
+ if (transientState == null) {
+ transientState = new TransientNodeState(editor, name, state);
+ existingChildNodes.put(state, transientState);
+ }
+ return transientState;
}
}