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);
+ }
+ }
+ }
}