[exo-jcr-commits] exo-jcr SVN: r4071 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/version and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Thu Mar 10 11:10:44 EST 2011
Author: sergiykarpenko
Date: 2011-03-10 11:10:43 -0500 (Thu, 10 Mar 2011)
New Revision: 4071
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/version/TestVersionRestore.java
Log:
EXOJCR-1045: WorksapceImpl.restore(..) fixed - versions history is restored if there versionable node exists. This fix allows to search new versionable nodes in changes log, and restore further version histories. testRestore and testMultipleRestore fixed.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-03-10 14:26:45 UTC (rev 4070)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-03-10 16:10:43 UTC (rev 4071)
@@ -51,7 +51,6 @@
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -571,18 +570,39 @@
// for restore operation
List<String> existedIdentifiers = new ArrayList<String>(); // InWorkspace
List<VersionImpl> notExistedVersions = new ArrayList<VersionImpl>();
- LinkedHashMap<VersionImpl, NodeData> existedVersions = new LinkedHashMap<VersionImpl, NodeData>();
TransactionableDataManager dataManager = session.getTransientNodesManager().getTransactManager();
-
+ SessionChangesLog changesLog = new SessionChangesLog(session.getId());
for (Version v : versions)
{
String versionableIdentifier = v.getContainingHistory().getVersionableUUID();
NodeData node = (NodeData)dataManager.getItemData(versionableIdentifier);
if (node != null)
{
- existedVersions.put((VersionImpl)v, node);
existedIdentifiers.add(versionableIdentifier);
+
+ // restore version at existed parent
+ try
+ {
+
+ NodeData destParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
+ NodeData vh = (NodeData)dataManager.getItemData(((VersionImpl)v).getParentIdentifier()); // version parent
+ // it's a VH
+ VersionHistoryDataHelper historyHelper = new VersionHistoryDataHelper(vh, dataManager, nodeTypeManager);
+
+ changesLog.addAll(((VersionImpl)v).restoreLog(destParent, node.getQPath().getName(), historyHelper,
+ session, removeExisting, changesLog).getAllStates());
+ }
+ catch (ItemExistsException e)
+ {
+ throw new ItemExistsException("Workspace restore. Can't restore a node. "
+ + v.getContainingHistory().getVersionableUUID() + ". " + e.getMessage(), e);
+ }
+ catch (RepositoryException e)
+ {
+ throw new RepositoryException("Workspace restore. Can't restore a node. "
+ + v.getContainingHistory().getVersionableUUID() + ". Repository error: " + e.getMessage(), e);
+ }
}
else
{
@@ -614,6 +634,18 @@
notExistedVersions.add((VersionImpl)v);
continue;
}
+
+ if (versionableParentIdentifier == null)
+ {
+ //check in changes log
+ ItemState itemState = changesLog.getItemState(versionableIdentifier);
+ if (itemState != null && !itemState.isDeleted())
+ {
+ notExistedVersions.add((VersionImpl)v);
+ continue;
+ }
+ }
+
throw new VersionException(
"No such node (for version, from the array of versions, "
+ "that corresponds to a missing node in the workspace, there must also be a parent in the array). UUID: "
@@ -622,35 +654,6 @@
}
}
- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
-
- for (VersionImpl v : existedVersions.keySet())
- {
- try
- {
- NodeData node = existedVersions.get(v);
-
- NodeData destParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
- NodeData vh = (NodeData)dataManager.getItemData(v.getParentIdentifier()); // version
- // parent
- // it's a VH
- VersionHistoryDataHelper historyHelper = new VersionHistoryDataHelper(vh, dataManager, nodeTypeManager);
-
- changesLog.addAll(v.restoreLog(destParent, node.getQPath().getName(), historyHelper, session,
- removeExisting, changesLog).getAllStates());
- }
- catch (ItemExistsException e)
- {
- throw new ItemExistsException("Workspace restore. Can't restore a node. "
- + v.getContainingHistory().getVersionableUUID() + ". " + e.getMessage(), e);
- }
- catch (RepositoryException e)
- {
- throw new RepositoryException("Workspace restore. Can't restore a node. "
- + v.getContainingHistory().getVersionableUUID() + ". Repository error: " + e.getMessage(), e);
- }
- }
-
for (VersionImpl v : notExistedVersions)
{
String versionableIdentifier = v.getContainingHistory().getVersionableUUID();
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/version/TestVersionRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/version/TestVersionRestore.java 2011-03-10 14:26:45 UTC (rev 4070)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/version/TestVersionRestore.java 2011-03-10 16:10:43 UTC (rev 4071)
@@ -94,7 +94,9 @@
Node doc1 =
checkExisted("doc1", new String[]{"jcr:content/jcr:primaryType", "jcr:content/doc1ContentProperty"});
- checkNotExisted("doc2");
+ Node doc2 =
+ checkExisted("doc2", new String[]{"jcr:content/jcr:primaryType", "jcr:content/doc2ContentProperty"});
+
checkNotExisted("doc3");
versionableNode.checkout();
@@ -106,8 +108,7 @@
versionableNode.restore(ver2, true);
doc1 = checkExisted("doc1", new String[]{"jcr:content/jcr:primaryType", "jcr:content/doc1ContentProperty"});
- Node doc2 =
- checkExisted("doc2", new String[]{"jcr:content/jcr:primaryType", "jcr:content/doc2ContentProperty"});
+ doc2 = checkExisted("doc2", new String[]{"jcr:content/jcr:primaryType", "jcr:content/doc2ContentProperty"});
checkNotExisted("doc3");
@@ -301,6 +302,19 @@
// test it
session.getWorkspace().restore(vs, true);// restore A v.3, B v.2, C v.2
+
+ // get node B and restore v1
+ nodeB = (Node)session.getItem("/versionableNodeA/Subnode B");
+ assertTrue(nodeB.isNodeType("mix:versionable"));
+ nodeB.restore("1", true);
+ // get node C and restore v1
+ nodeC = (Node)session.getItem("/versionableNodeA/Subnode C");
+ assertTrue(nodeB.isNodeType("mix:versionable"));
+ nodeC.restore("1", true);
+ // get node A and restore v2
+ nodeA = (Node)session.getItem("/versionableNodeA");
+ assertTrue(nodeB.isNodeType("mix:versionable"));
+ nodeA.restore("1", true);
}
/**
@@ -329,6 +343,7 @@
String content2 = content + " #2";
file.getNode("jcr:content").setProperty("jcr:data", content2, PropertyType.BINARY);
+ file.save();
file.checkin(); // v2
file.checkout();
More information about the exo-jcr-commits
mailing list