Index: /home/ntoper/workspace/jackrabbit/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java =================================================================== --- /home/ntoper/workspace/jackrabbit/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (revision 431959) +++ /home/ntoper/workspace/jackrabbit/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (working copy) @@ -17,9 +17,14 @@ package org.apache.jackrabbit.core.version; import org.apache.commons.collections.map.ReferenceMap; +import org.apache.jackrabbit.core.xml.SysViewImporter; +import org.apache.jackrabbit.core.BatchedItemOperations; +import org.apache.jackrabbit.core.HierarchyManager; +import org.apache.jackrabbit.core.NamespaceRegistryImpl; import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.RestoreBatchedItemOperations; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.fs.FileSystem; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; @@ -32,12 +37,17 @@ import org.apache.jackrabbit.core.state.NodeReferences; import org.apache.jackrabbit.core.state.NodeReferencesId; import org.apache.jackrabbit.core.state.NodeState; +import org.apache.jackrabbit.core.state.NodeVersionHistoriesUpdatableStateManager; import org.apache.jackrabbit.core.state.PersistenceManager; import org.apache.jackrabbit.core.state.PropertyState; import org.apache.jackrabbit.core.state.SharedItemStateManager; +import org.apache.jackrabbit.core.state.UpdatableItemStateManager; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; +import org.apache.jackrabbit.core.xml.ImportHandler; +import org.apache.jackrabbit.core.xml.Importer; import org.apache.jackrabbit.name.MalformedPathException; +import org.apache.jackrabbit.name.NamespaceResolver; import org.apache.jackrabbit.name.Path; import org.apache.jackrabbit.name.QName; import org.slf4j.Logger; @@ -42,7 +52,13 @@ import org.apache.jackrabbit.name.QName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.InvalidSerializedDataException; import javax.jcr.PropertyType; import javax.jcr.ReferentialIntegrityException; import javax.jcr.RepositoryException; @@ -50,6 +66,9 @@ import javax.jcr.version.Version; import javax.jcr.version.VersionException; import javax.jcr.version.VersionHistory; + +import java.io.IOException; +import java.io.InputStream; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -126,6 +145,7 @@ NodeTypeRegistry ntReg, DelegatingObservationDispatcher obsMgr, NodeId rootId, NodeId rootParentId) throws RepositoryException { + //TODO check if is not empty => throw exception try { this.pMgr = pMgr; this.fs = fs; @@ -548,4 +568,51 @@ private abstract class SourcedTarget { public abstract Object run() throws RepositoryException; } + + /** + * importVersions allows you to import a version history + * in the system view format. + * You need to restart the repository after the importation is over + * + * @param in InputStream of the system view XML. + * @param hierMgr HierarchyManager of the repository + * @param nsResolver NamespaceResolver + * @param nsRegistry NameSpaceRegistryImpl + * + * @throws IOException in case of an IO error with the XML file + * @throws RepositoryException in any other case. + */ + public void importVersions(InputStream in, + HierarchyManager hierMgr, + NamespaceResolver nsResolver, + NamespaceRegistryImpl nsRegistry + ) throws IOException, RepositoryException { + + UpdatableItemStateManager upMgr = new NodeVersionHistoriesUpdatableStateManager(sharedStateMgr, pMgr); + BatchedItemOperations itemOps = new RestoreBatchedItemOperations(upMgr, ntReg, hierMgr, nsResolver); + Importer importer = new SysViewImporter(VERSION_STORAGE_PATH, hierMgr, ntReg, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING, itemOps); + ImportHandler handler = new ImportHandler(importer, nsResolver, nsRegistry); + + try { + + XMLReader parser = + XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); + parser.setContentHandler(handler); + parser.setErrorHandler(handler); + parser.setFeature("http://xml.org/sax/features/namespaces", true); + parser.setFeature("http://xml.org/sax/features/namespace-prefixes", + false); + parser.parse(new InputSource(in)); + } catch (SAXException se) { + // check for wrapped repository exception + Exception e = se.getException(); + if (e != null && e instanceof RepositoryException) { + throw (RepositoryException) e; + } else { + String msg = "failed to parse XML stream"; + throw new InvalidSerializedDataException(msg, se); + } + } + } }