[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