Index: /home/ntoper/workspace/jackrabbit current/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java =================================================================== --- /home/ntoper/workspace/jackrabbit current/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java (revision 465271) +++ /home/ntoper/workspace/jackrabbit current/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java (working copy) @@ -46,6 +46,7 @@ import org.apache.jackrabbit.core.state.ItemState; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.core.state.PropertyState; +import org.apache.jackrabbit.core.state.NodeState.ChildNodeEntry; import org.apache.jackrabbit.core.util.ReferenceChangeTracker; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.core.version.VersionManager; @@ -514,16 +515,46 @@ return; } - NodeState myNode; - if (existing == null) { - myNode = createNode(parent, nodeInfo); + //Handling of JCR 535: importation of Root node + // with Replace Existing UUID. Should be handled before the importation happen since the logic + // is quite different of the rest of the importer. + if (nodeInfo.getName().equals(QName.JCR_ROOT) + && this.uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING) { + //conflicting = itemOps.getNodeState(Path.ROOT); + NodeState root = itemOps.getNodeState(Path.ROOT); + List rootChildren = root.getChildNodeEntries(); + Iterator it = rootChildren.iterator(); + while (it.hasNext()) { + ChildNodeEntry child = (ChildNodeEntry) it.next(); + //Check not jcr:system + if (!child.getName().equals(QName.JCR_SYSTEM)) { + NodeId id = child.getId(); + NodeState toDelete = itemOps.getNodeState(id); + // remove conflicting: + // check if conflicting can be removed + // (access rights, node type constraints, locking & versioning status) + itemOps.checkRemoveNode(toDelete, + BatchedItemOperations.CHECK_ACCESS + | BatchedItemOperations.CHECK_LOCK + | BatchedItemOperations.CHECK_VERSIONING + | BatchedItemOperations.CHECK_CONSTRAINTS); + // do remove conflicting (recursive) + itemOps.removeNodeState(toDelete); + } + } } else { - myNode = existing; - existing = null; + NodeState myNode; + if (existing == null) { + myNode = createNode(parent, nodeInfo); + } + else { + myNode = existing; + existing = null; + } + createProperties(myNode, propInfos); + parents.push(myNode); } - createProperties(myNode, propInfos); - parents.push(myNode); } /** @@ -537,7 +568,8 @@ return; } - if (aborted || skip) { + if (aborted || skip ||(nodeInfo.getName().equals(QName.ROOT) && + uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING )) { return; }