--- VersionManagerImplRestore.java 2011-03-25 13:08:23.000000000 +0100 +++ VersionManagerImplRestore_new.java 2011-03-25 12:27:07.000000000 +0100 @@ -16,11 +16,7 @@ */ package org.apache.jackrabbit.core.version; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import javax.jcr.ItemExistsException; import javax.jcr.PropertyType; @@ -473,6 +469,19 @@ abstract public class VersionManagerImpl // need to sync with state manager state.store(); + HashMap> entryToNodeStateExMapping = + new HashMap>(); + for (ChildNodeEntry entry : state.getState().getChildNodeEntries()) { + HashMap id2stateMap; + if (entryToNodeStateExMapping.containsKey(entry.getName())) { + id2stateMap = entryToNodeStateExMapping.get(entry.getName()); + } else { + id2stateMap = new HashMap(); + } + id2stateMap.put(entry.getIndex(), state.getNode(entry.getName(), entry.getIndex())); + entryToNodeStateExMapping.put(entry.getName(), id2stateMap); + } + // For each child node C present on F: // - F will never have a child node with an OPV of IGNORE, INITIALIZE, // COMPUTE or ABORT (see 15.2 Check-In: Creating a Version). @@ -494,7 +503,10 @@ abstract public class VersionManagerImpl InternalFrozenNode f = (InternalFrozenNode) child; // if node is present, remove it - state.removeNode(entry.getName(), entry.getIndex()); + if (entryToNodeStateExMapping.containsKey(entry.getName()) && + entryToNodeStateExMapping.get(entry.getName()).containsKey(entry.getIndex())) { + state.removeNode(entryToNodeStateExMapping.get(entry.getName()).get(entry.getIndex())); + } // check for existing if (f.getFrozenId() != null) {