Index: src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java (Revision 818135) +++ src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java (Arbeitskopie) @@ -16,6 +16,8 @@ */ package org.apache.jackrabbit.core; +import java.util.Iterator; + import org.apache.jackrabbit.core.state.ItemState; import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.ItemStateManager; @@ -23,8 +25,6 @@ import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.spi.Name; -import java.util.Iterator; - /** * HierarchyManager implementation that is also able to * build/resolve paths of those items that have been moved or removed @@ -98,19 +98,22 @@ protected NodeState.ChildNodeEntry getChildNodeEntry(NodeState parent, Name name, int index) { - // check removed child node entries first - Iterator iter = parent.getRemovedChildNodeEntries().iterator(); - while (iter.hasNext()) { - NodeState.ChildNodeEntry entry = - (NodeState.ChildNodeEntry) iter.next(); - if (entry.getName().equals(name) - && entry.getIndex() == index) { - return entry; + // first look for the entry in the current child node entry list + NodeState.ChildNodeEntry entry = super.getChildNodeEntry(parent, name, index); + if (entry == null) { + // if not found, we need to look for a removed child node entry + Iterator iter = parent.getRemovedChildNodeEntries().iterator(); + while (iter.hasNext()) { + NodeState.ChildNodeEntry candidate = + (NodeState.ChildNodeEntry) iter.next(); + if (candidate.getName().equals(name) + && candidate.getIndex() == index) { + entry = candidate; + break; + } } } - // no matching removed child node entry found in parent, - // delegate to base class - return super.getChildNodeEntry(parent, name, index); + return entry; } /** @@ -120,17 +123,20 @@ */ protected NodeState.ChildNodeEntry getChildNodeEntry(NodeState parent, NodeId id) { - // check removed child node entries first - Iterator iter = parent.getRemovedChildNodeEntries().iterator(); - while (iter.hasNext()) { - NodeState.ChildNodeEntry entry = - (NodeState.ChildNodeEntry) iter.next(); - if (entry.getId().equals(id)) { - return entry; + // first look for the entry in the current child node entry list + NodeState.ChildNodeEntry entry = super.getChildNodeEntry(parent, id); + if (entry == null) { + // if not found, we need to look for a removed child node entry + Iterator iter = parent.getRemovedChildNodeEntries().iterator(); + while (iter.hasNext()) { + NodeState.ChildNodeEntry candidate = + (NodeState.ChildNodeEntry) iter.next(); + if (candidate.getId().equals(id)) { + entry = candidate; + break; + } } } - // no matching removed child node entry found in parent, - // delegate to base class - return super.getChildNodeEntry(parent, id); + return entry; } }