[exo-jcr-commits] exo-jcr SVN: r2050 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/importing and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Mar 10 10:39:07 EST 2010
Author: tolusha
Date: 2010-03-10 10:39:06 -0500 (Wed, 10 Mar 2010)
New Revision: 2050
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/util/VersionHistoryImporter.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java
Log:
EXOJCR-548: remove VersionHistory node before importing
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/util/VersionHistoryImporter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/util/VersionHistoryImporter.java 2010-03-10 15:04:14 UTC (rev 2049)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/util/VersionHistoryImporter.java 2010-03-10 15:39:06 UTC (rev 2050)
@@ -132,12 +132,6 @@
{
String path = versionableNode.getVersionHistory().getParent().getPath();
- if (versionableNode.getVersionHistory().getParent().hasNode(versionHistory))
- {
- throw new RepositoryException("Can't import version history for node with identifier '" + versionHistory
- + "', because it already exists in version storage.");
- }
-
NodeData versionable = (NodeData)versionableNode.getData();
// ----- VERSIONABLE properties -----
// jcr:versionHistory
@@ -177,9 +171,9 @@
changesLogDeltete.add(ItemState
.createDeletedState(((PropertyImpl)versionableNode.getProperty("jcr:predecessors")).getData()));
dataKeeper.save(changesLogDeltete);
- userSession.save();
// remove version history
dataKeeper.save(changesLog);
+ userSession.save();
// import new version history
userSession.getWorkspace().importXML(path, versionHistoryStream, 0);
userSession.save();
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java 2010-03-10 15:04:14 UTC (rev 2049)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java 2010-03-10 15:39:06 UTC (rev 2050)
@@ -34,21 +34,29 @@
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
+import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Random;
import javax.jcr.ImportUUIDBehavior;
import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
import javax.jcr.util.TraversingItemVisitor;
+import javax.jcr.version.Version;
/**
* Created by The eXo Platform SAS.
@@ -65,6 +73,8 @@
private final Random random;
+ private List<String> versionList = new ArrayList<String>();
+
// private List<String> versionList = new ArrayList<String>();
public TestImport()
@@ -738,6 +748,106 @@
session1.save();
}
+ public void testImportAndExport() throws Exception
+ {
+ Node aaa = root.addNode("AAA");
+ Node bbb = root.addNode("BBB");
+ Node ccc = root.addNode("CCC");
+ session.save();
+
+ // Export Action
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ aaa.getSession().exportDocumentView(aaa.getPath(), bos, false, false);
+ ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
+ bbb.getSession().importXML(bbb.getPath(), is, 1);
+ session.save();
+
+ String[] paths = new String[]{"AAA", "BBB", "BBB/AAA"};
+ for (String path : paths)
+ {
+ if (bbb.hasNode(path))
+ {
+ }
+ }
+
+ Node hello = aaa.addNode("hello", "exo:article");
+ hello.setProperty("exo:title", "hello");
+ hello.addMixin("mix:versionable");
+ session.save();
+
+ Version version = hello.checkin();
+ hello.checkout();
+
+ session.save();
+
+ /**
+ * Before import this node has one version
+ */
+ Version rootVersion = hello.getVersionHistory().getRootVersion();
+ getListVersion(rootVersion);
+ assertEquals(1, versionList.size());
+
+ // Export VersionHistory
+ InputStream inputVersion = null;
+ if (hello.isNodeType("mix:versionable"))
+ {
+ ByteArrayOutputStream bosVersion = new ByteArrayOutputStream();
+ hello.getSession().exportDocumentView(hello.getVersionHistory().getPath(), bosVersion, false, false);
+ inputVersion = new ByteArrayInputStream(bosVersion.toByteArray());
+ }
+ String versionHistory = hello.getProperty("jcr:versionHistory").getValue().getString();
+ String baseVersion = hello.getProperty("jcr:baseVersion").getValue().getString();
+ Value[] jcrPredecessors = hello.getProperty("jcr:predecessors").getValues();
+ String[] predecessorsHistory;
+ StringBuilder jcrPredecessorsBuilder = new StringBuilder();
+ for (Value value : jcrPredecessors)
+ {
+ if (jcrPredecessorsBuilder.length() > 0)
+ jcrPredecessorsBuilder.append(",");
+ jcrPredecessorsBuilder.append(value.getString());
+ }
+ if (jcrPredecessorsBuilder.toString().indexOf(",") > -1)
+ {
+ predecessorsHistory = jcrPredecessorsBuilder.toString().split(",");
+ }
+ else
+ {
+ predecessorsHistory = new String[]{jcrPredecessorsBuilder.toString()};
+ }
+
+ // Export Action
+ ByteArrayOutputStream bosHello = new ByteArrayOutputStream();
+ hello.getSession().exportDocumentView(hello.getPath(), bosHello, false, false);
+ ByteArrayInputStream isHello = new ByteArrayInputStream(bosHello.toByteArray());
+ // Remove node "/aaa/hello" and it's version history, before importing it
+ // again!
+ // hello.remove();
+ session.save();
+ ccc.getSession().importXML(ccc.getPath(), isHello, 1);
+ session.save();
+
+ /**
+ * Import VersionHistory After import version history, the node has no
+ * version Errors: Lose version when import version history
+ */
+ Node helloImport = (Node)session.getItem("/CCC/hello");
+ importHistory((NodeImpl)helloImport, inputVersion, baseVersion, predecessorsHistory, versionHistory);
+ // versionList.clear();
+ // Version rootVersionImport =
+ // helloImport.getVersionHistory().getRootVersion();
+ // getListVersion(rootVersionImport);
+ // assertEquals(1, versionList.size());
+
+ aaa = root.getNode("AAA");
+ bbb = root.getNode("BBB");
+ ccc = root.getNode("CCC");
+
+ aaa.remove();
+ bbb.remove();
+ ccc.remove();
+ session.save();
+ }
+
private String dumpVersionable(Node versionableNode) throws RepositoryException
{
String result;
@@ -859,4 +969,35 @@
}
}
+
+ private void importHistory(NodeImpl versionableNode, InputStream versionHistoryStream, String baseVersionUuid,
+ String[] predecessors, String versionHistory) throws RepositoryException, IOException
+ {
+ VersionHistoryImporter versionHistoryImporter =
+ new VersionHistoryImporter(versionableNode, versionHistoryStream, baseVersionUuid, predecessors,
+ versionHistory);
+ versionHistoryImporter.doImport();
+ }
+
+ public void getListVersion(Version version)
+ {
+ try
+ {
+ String uuid = version.getUUID();
+ QueryManager queryManager = session.getWorkspace().getQueryManager();
+ Query query =
+ queryManager.createQuery("//element(*, nt:version)[@jcr:predecessors='" + uuid + "']", Query.XPATH);
+ QueryResult queryResult = query.execute();
+ NodeIterator iterate = queryResult.getNodes();
+ while (iterate.hasNext())
+ {
+ Version version1 = (Version)iterate.nextNode();
+ versionList.add(version1.getUUID());
+ getListVersion(version1);
+ }
+ }
+ catch (Exception e)
+ {
+ }
+ }
}
More information about the exo-jcr-commits
mailing list