You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2009/05/22 16:38:52 UTC
svn commit: r777548 [1/2] -
/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/
Author: reschke
Date: Fri May 22 14:38:51 2009
New Revision: 777548
URL: http://svn.apache.org/viewvc?rev=777548&view=rev
Log:
JCR-2085: add JCR2 related versioning tests
Modified:
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCancelMergeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeDoneMergeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionAbortTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionComputeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionCopyTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionIgnoreTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionHistoryTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionLabelTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/WorkspaceRestoreTest.java
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCancelMergeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCancelMergeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCancelMergeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCancelMergeTest.java Fri May 22 14:38:51 2009
@@ -21,6 +21,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>MergeCancelMergeTest</code> contains tests dealing with nodes on which
@@ -43,7 +44,8 @@
nodeToMerge = testRootNodeW2.getNode(nodeName1);
// node has to be checked out while merging
- nodeToMerge.checkout();
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ versionManager.checkout(nodeToMerge.getPath());
}
protected void tearDown() throws Exception {
@@ -99,15 +101,19 @@
* initialize a versionable node on default and second workspace
*/
protected void initNodes() throws RepositoryException {
+
+ VersionManager versionManager = testRootNode.getSession().getWorkspace().getVersionManager();
+
// create a versionable node
// nodeName1
Node topVNode = testRootNode.addNode(nodeName1, versionableNodeType);
topVNode.setProperty(propertyName1, topVNode.getName());
+ String path = topVNode.getPath();
// save default workspace
- testRootNode.save();
- topVNode.checkin();
- topVNode.checkout();
+ testRootNode.getSession().save();
+ versionManager.checkin(path);
+ versionManager.checkout(path);
log.println("test nodes created successfully on " + workspace.getName());
@@ -117,4 +123,52 @@
testRootNodeW2 = (Node) superuserW2.getItem(testRoot);
}
+
+ /**
+ * Merge.cancelMerge(V): has the effect of removing the reference to V' from
+ * the jcr:mergeFailed property of N. <br> without adding it to
+ * jcr:predecessors.<br> Branches will not be joined.<br>
+ */
+ public void testMergeNodeCancelMergeJcr2() throws RepositoryException {
+ // create 2 independent versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ vmWsp2.checkout(path);
+ vmWsp2.merge(path, workspace.getName(), true);
+
+ // get predecessors
+ Version[] predecessors = vmWsp2.getBaseVersion(path).getPredecessors();
+ // get mergeFailed property
+ Property mergeFailedProperty = nodeToMerge.getProperty(jcrMergeFailed);
+ Value[] mergeFailedReferences = mergeFailedProperty.getValues();
+
+ for (int i = 0; i < mergeFailedReferences.length; i++) {
+ String id = mergeFailedReferences[i].getString();
+ vmWsp2.cancelMerge(path, (Version) superuser.getNodeByIdentifier(id));
+ }
+
+ // check predecessors - unchanged
+ Version[] predecessorsAfterCancel = vmWsp2.getBaseVersion(path).getPredecessors();
+ assertTrue(predecessors.length == predecessorsAfterCancel.length);
+
+ // check mergeFailed property - reference removed
+ if (nodeToMerge.hasProperty(jcrMergeFailed)) {
+ Property mergeFailedPropertyAfterCancelMerge = nodeToMerge.getProperty(jcrMergeFailed);
+ Value[] mergeFailedReferencesAfterCancelMerge = mergeFailedPropertyAfterCancelMerge.getValues();
+ assertTrue(mergeFailedReferences.length > mergeFailedReferencesAfterCancelMerge.length);
+ }
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java Fri May 22 14:38:51 2009
@@ -19,6 +19,7 @@
import javax.jcr.MergeException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.version.VersionManager;
/**
* <code>MergeCheckedoutSubNodeTest</code> contains tests dealing with
@@ -41,7 +42,8 @@
nodeToMerge = testRootNodeW2.getNode(nodeName1);
// node has to be checked out while merging
- nodeToMerge.checkout();
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ versionManager.checkout(nodeToMerge.getPath());
}
protected void tearDown() throws Exception {
@@ -74,6 +76,31 @@
}
/**
+ * VersionManager.merge(): If V' of a versionable subnode N' in the source workspace
+ * is a successor of V (the base version of a subnode N in this workspace),
+ * calling merge must fail.
+ */
+ public void testFailIfCorrespondingNodeIsSuccessorJcr2() throws RepositoryException {
+ // make V' of a subnode N' in source workspace be a successor version of
+ // the base version of the corresponding subnode.
+ Node n = testRootNode.getNode(nodeName1 + "/" + nodeName2);
+ VersionManager versionManager = n.getSession().getWorkspace().getVersionManager();
+ String path = n.getPath();
+ versionManager.checkout(path);
+ versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ try {
+ // merge, besteffort set to false to stop at the first failure
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(nodeToMerge.getPath(), workspace.getName(), false);
+ fail("Merging a checkedout node if the version V' of the corresponding node is a successor of this node's base version must fail.");
+
+ } catch (MergeException e) {
+ // success
+ }
+ }
+
+ /**
* Node.merge(): If V' of a versionable subnode N' in the source workspace
* is a predeccessor of V or V' identical to V (the base version of a
* subnode N in this workspace), calling merge must be leave.
@@ -97,6 +124,30 @@
}
/**
+ * VersionManager.merge(): If V' of a versionable subnode N' in the source workspace
+ * is a predeccessor of V or V' identical to V (the base version of a
+ * subnode N in this workspace), calling merge must be leave.
+ */
+ public void testLeaveIfCorrespondingNodeIsPredeccessorJcr2() throws RepositoryException {
+ // make V' of a subnode N' in source workspace be a predeccessor version of
+ // the base version of the corresponding subnode.
+ Node n = testRootNodeW2.getNode(nodeName1 + "/" + nodeName2);
+ VersionManager versionManager = n.getSession().getWorkspace().getVersionManager();
+ String path = n.getPath();
+ versionManager.checkout(path);
+ n.setProperty(propertyName1, CHANGED_STRING);
+ testRootNodeW2.getSession().save();
+ versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ // merge, besteffort set to false to stop at the first failure
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(nodeToMerge.getPath(), workspace.getName(), false);
+
+ // check if subnode has status "leave"
+ assertTrue(n.getProperty(propertyName1).getString().equals(CHANGED_STRING));
+ }
+
+ /**
* initialize a two-step-hierarchy on default and second workspace
*/
protected void initNodes() throws RepositoryException {
@@ -111,7 +162,7 @@
subNvNode.setProperty(propertyName1, subNvNode.getName());
// save default workspace
- testRootNode.save();
+ testRootNode.getSession().save();
log.println("test nodes created successfully on " + workspace.getName());
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeDoneMergeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeDoneMergeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeDoneMergeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeDoneMergeTest.java Fri May 22 14:38:51 2009
@@ -21,6 +21,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>MergeDoneMergeTest</code> contains test dealing with nodes on which
@@ -42,7 +43,8 @@
nodeToMerge = testRootNodeW2.getNode(nodeName1);
// node has to be checked out while merging
- nodeToMerge.checkout();
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ versionManager.checkout(nodeToMerge.getPath());
}
@@ -92,18 +94,66 @@
}
/**
+ * VersionManager.doneMerge(V) throws VersionException if V is not among the Vs in the
+ * jcr:mergeFailed prop. <br> with adding it to jcr:predecessors.<br>
+ * Branches will be joined.<br>
+ */
+ public void testMergeNodeDoneMergeJcr2() throws RepositoryException {
+ // create 2 independent versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ vmWsp2.checkout(path);
+ vmWsp2.merge(path, workspace.getName(), true);
+
+ // get predecessors
+ Version[] predecessors = nodeToMerge.getBaseVersion().getPredecessors();
+ // get mergeFailed property
+ Property mergeFailedProperty = nodeToMerge.getProperty(jcrMergeFailed);
+ Value[] mergeFailedReferences = mergeFailedProperty.getValues();
+
+ for (int i = 0; i < mergeFailedReferences.length; i++) {
+ String id = mergeFailedReferences[i].getString();
+ vmWsp2.doneMerge(path, (Version) superuser.getNodeByIdentifier(id));
+ }
+
+ // check mergeFailed property - reference moved to predecessor
+ if (nodeToMerge.hasProperty(jcrMergeFailed)) {
+ Property mergeFailedPropertyAfterCancelMerge = nodeToMerge.getProperty(jcrMergeFailed);
+ Value[] mergeFailedReferencesAfterCancelMerge = mergeFailedPropertyAfterCancelMerge.getValues();
+ assertTrue(mergeFailedReferences.length > mergeFailedReferencesAfterCancelMerge.length);
+ }
+ }
+
+ /**
* initialize a versionable node on default and second workspace
*/
protected void initNodes() throws RepositoryException {
+
+ VersionManager versionManager = testRootNode.getSession().getWorkspace().getVersionManager();
+
// create a versionable node
// nodeName1
Node topVNode = testRootNode.addNode(nodeName1, versionableNodeType);
topVNode.setProperty(propertyName1, topVNode.getName());
+ String path = topVNode.getPath();
// save default workspace
- testRootNode.save();
- topVNode.checkin();
- topVNode.checkout();
+ testRootNode.getSession().save();
+ versionManager.checkin(path);
+ versionManager.checkout(path);
log.println("test nodes created successfully on " + workspace.getName());
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java Fri May 22 14:38:51 2009
@@ -18,6 +18,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.Node;
+import javax.jcr.version.VersionManager;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
@@ -86,12 +87,56 @@
}
/**
+ * Tests if VersionManager.merge() when bestEffort is true returns a NodeIterator
+ * containing all nodes that received a fail.
+ */
+ public void testNodeIteratorJcr2() throws RepositoryException {
+
+ Node nodeToMerge = testRootNodeW2.getNode(nodeName1);
+
+ Iterator failedNodes = nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), workspace.getName(), true);
+
+ List nodeList = new ArrayList();
+ while (failedNodes.hasNext()) {
+ nodeList.add(failedNodes.next());
+ }
+
+ assertEquals("Node.merge() does not return a NodeIterator with " +
+ "expected number of elements.",
+ expectedFailedNodes.length,
+ nodeList.size());
+
+ // re-aquire iterator, has been consumed to get size
+ failedNodes = nodeList.iterator();
+ compareReturnedWithExpected:
+ while (failedNodes.hasNext()) {
+ String path = ((Node) failedNodes.next()).getPath();
+ for (int i = 0; i < expectedFailedNodes.length; i++) {
+ if (expectedFailedNodes[i] != null) {
+ String expectedPath = expectedFailedNodes[i].getPath();
+ if (path.equals(expectedPath)) {
+ // to assure every failed node appears only once in the
+ // NodeIterator, set each found expected node to null
+ expectedFailedNodes[i] = null;
+ continue compareReturnedWithExpected;
+ }
+ }
+ }
+ fail("Node.merge() must return a NodeIterator over all " +
+ "nodes that did receive a result of fail.");
+ }
+ }
+
+ /**
* initialize some versionable nodes on default and second workspace
*/
protected void initNodes() throws RepositoryException {
// create some versionable node in default workspace (WS1)
+ VersionManager versionManager = testRootNode.getSession().getWorkspace().getVersionManager();
+
Node mergeRootNode = testRootNode.addNode(nodeName1, versionableNodeType);
Node nodeWS1_1 = mergeRootNode.addNode(nodeName1, versionableNodeType);
@@ -100,23 +145,22 @@
Node nodeWS1_2Sub1 = nodeWS1_2.addNode(nodeName1, versionableNodeType);
Node nodeWS1_3 = mergeRootNode.addNode(nodeName3, versionableNodeType);
- testRootNode.save();
-
- nodeWS1_1.checkin(); // create version 1.0
- nodeWS1_1.checkout();
+ testRootNode.getSession().save();
- nodeWS1_1Sub1.checkin(); // create version 1.0
- nodeWS1_1Sub1.checkout();
+ versionManager.checkin(nodeWS1_1.getPath()); // create version 1.0
+ versionManager.checkout(nodeWS1_1.getPath());
- nodeWS1_2.checkin(); // create version 1.0
- nodeWS1_2.checkout();
+ versionManager.checkin(nodeWS1_1Sub1.getPath()); // create version 1.0
+ versionManager.checkout(nodeWS1_1Sub1.getPath());
- nodeWS1_2Sub1.checkin(); // create version 1.0
- nodeWS1_2Sub1.checkout();
+ versionManager.checkin(nodeWS1_2.getPath()); // create version 1.0
+ versionManager.checkout(nodeWS1_2.getPath());
- nodeWS1_3.checkin(); // create version 1.0
- nodeWS1_3.checkout();
+ versionManager.checkin(nodeWS1_2Sub1.getPath()); // create version 1.0
+ versionManager.checkout(nodeWS1_2Sub1.getPath());
+ versionManager.checkin(nodeWS1_3.getPath()); // create version 1.0
+ versionManager.checkout(nodeWS1_3.getPath());
workspaceW2.clone(workspace.getName(), mergeRootNode.getPath(), mergeRootNode.getPath(), true);
@@ -127,14 +171,14 @@
// create version branches for some of the nodes
- nodeWS2_1.checkin(); // create version 1.1
- nodeWS1_1.checkin(); // create version 1.0.1
+ versionManager.checkin(nodeWS2_1.getPath()); // create version 1.1
+ versionManager.checkin(nodeWS1_1.getPath()); // create version 1.0.1
- nodeWS2_2.checkin(); // create version 1.1
- nodeWS1_2.checkin(); // create version 1.0.1
+ versionManager.checkin(nodeWS2_2.getPath()); // create version 1.1
+ versionManager.checkin(nodeWS1_2.getPath()); // create version 1.0.1
- nodeWS2_2Sub1.checkin(); // create version 1.1
- nodeWS1_2Sub1.checkin(); // create version 1.0.1
+ versionManager.checkin(nodeWS2_2Sub1.getPath()); // create version 1.1
+ versionManager.checkin(nodeWS1_2Sub1.getPath()); // create version 1.0.1
// set the nodes with version branches in expectedFailedNodes
expectedFailedNodes[0] = nodeWS1_1;
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java Fri May 22 14:38:51 2009
@@ -19,6 +19,7 @@
import org.apache.jackrabbit.test.NotExecutableException;
import javax.jcr.version.VersionException;
+import javax.jcr.version.VersionManager;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.InvalidItemStateException;
@@ -52,7 +53,8 @@
nodeToMerge = testRootNodeW2.getNode(nodeName1);
// node has to be checked out while merging
- nodeToMerge.checkout();
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ versionManager.checkout(nodeToMerge.getPath());
}
@@ -77,6 +79,22 @@
}
/**
+ * VersionManager.merge(): InvalidItemStateException if unsaved changes within the
+ * current Session<br>
+ */
+ public void testMergeNodeWithUnsavedStatesJcr2() throws RepositoryException {
+ // set a property and do not save workspace
+ nodeToMerge.setProperty(propertyName1, CHANGED_STRING);
+ try {
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), workspace.getName(), false);
+ fail("InvalidItemStateException if unsaved changes within the current Session was expected.");
+ } catch (InvalidItemStateException e) {
+ // success
+ }
+ }
+
+ /**
* Perform a merge on a node with a unkwnown workspacename
*/
public void testMergeUnknownWorkspaceName() throws RepositoryException {
@@ -88,6 +106,18 @@
}
/**
+ * Perform a merge on a node with a unkwnown workspacename
+ */
+ public void testMergeUnknownWorkspaceNameJcr2() throws RepositoryException {
+ try {
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), getNonExistingWorkspaceName(superuser), false);
+ } catch (NoSuchWorkspaceException e) {
+ // success expected exception
+ }
+ }
+
+ /**
* Node.merge(): If this node does not have a corresponding node in the
* indicated workspace <br> then the merge method returns quietly and no
* changes are made.<br>
@@ -104,6 +134,24 @@
}
/**
+ * VersionManager.merge(): If this node does not have a corresponding node in the
+ * indicated workspace <br> then the merge method returns quietly and no
+ * changes are made.<br>
+ */
+ public void testMergeNodeNonCorrespondingNodeJcr2() throws RepositoryException {
+ // create new node - this node has no corresponding node in default workspace
+ Node subNode = nodeToMerge.addNode(nodeName3, versionableNodeType);
+ subNode.setProperty(propertyName1, CHANGED_STRING);
+ superuserW2.save();
+ VersionManager versionManager = subNode.getSession().getWorkspace().getVersionManager();
+ String path = subNode.getPath();
+ versionManager.checkin(path);
+
+ versionManager.merge(path, workspace.getName(), true);
+ assertTrue(subNode.getProperty(propertyName1).getString().equals(CHANGED_STRING));
+ }
+
+ /**
* Node.merge(): versionable subNode N checked-in: If V is neither a
* successor of, predecessor of, nor identical with V', then the merge
* result for N is failed<br>
@@ -132,6 +180,38 @@
}
/**
+ * VersionManager.merge(): versionable subNode N checked-in: If V is neither a
+ * successor of, predecessor of, nor identical with V', then the merge
+ * result for N is failed<br>
+ */
+ public void testMergeNodeVersionAmbiguousJcr2() throws RepositoryException {
+ // create 2 independent versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // besteffort set to false to stop at the first failure
+ try {
+ vmWsp2.checkout(path);
+ vmWsp2.merge(path, workspace.getName(), false);
+ fail("Node has ambigous versions. Merge must throw a MergeException");
+ } catch (MergeException e) {
+ // success if the merge exception thrown
+ }
+ }
+
+ /**
* Node.merge(): bestEffort is true > any merge-failure (represented by the
* version in the workspace) is reported in the jcrMergeFailed property<br>
*/
@@ -172,6 +252,50 @@
}
/**
+ * VersionManager.merge(): bestEffort is true > any merge-failure (represented by the
+ * version in the workspace) is reported in the jcrMergeFailed property<br>
+ */
+ public void testMergeNodeBestEffortTrueCheckMergeFailedPropertyJcr2() throws RepositoryException {
+ // create 2 independent versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // besteffort set to true to report all failures
+ vmWsp2.checkout(path);
+ vmWsp2.merge(path, workspace.getName(), true);
+
+ // success merge exception was raised as expected
+ // jcrMergeFailed should contains reference to the V' as it is a different branche
+ String expectedReferenceUUID = originalNode.getBaseVersion().getUUID();
+ Property mergeFailedProperty = nodeToMerge.getProperty(jcrMergeFailed);
+ Value[] references = mergeFailedProperty.getValues();
+ boolean referenceFound = false;
+ if (references != null) {
+ for (int i = 0; i < references.length; i++) {
+ String referenceUUID = references[i].getString();
+ if (referenceUUID.equals(expectedReferenceUUID)) {
+ referenceFound = true;
+ break; // it's not necessary to loop thru all the references
+ }
+ }
+
+ assertTrue("reference to expected version that give the failure wasnt found in the mergeFailed", referenceFound);
+ }
+ }
+
+ /**
* if mergeFailedProperty is present > VersionException<br>
*/
public void disable_testMergeNodeForceFailure() throws RepositoryException {
@@ -200,6 +324,38 @@
}
/**
+ * if mergeFailedProperty is present > VersionException<br>
+ */
+ public void disable_testMergeNodeForceFailureJcr2() throws RepositoryException {
+ // create 2 independent versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // besteffort set to true to report all failures
+ vmWsp2.checkout(path);
+ vmWsp2.merge(path, workspace.getName(), true);
+
+ try {
+ vmWsp2.merge(path, workspace.getName(), true);
+ fail("Merge failed for node in earlier merge operations. Because the mergeFailedProperty is present, merge must throw a VersionException");
+ } catch (VersionException e) {
+ // success version exception expected
+ }
+ }
+
+ /**
* Node.merge(): bestEffort is false and any merge fails a MergeException is
* thrown.<br>
*/
@@ -223,6 +379,32 @@
}
/**
+ * VersionManager.merge(): bestEffort is false and any merge fails a MergeException is
+ * thrown.<br>
+ */
+ public void testMergeNodeBestEffortFalseJcr2() throws RepositoryException {
+ /// create successor versions for a node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // merge, besteffort set to false
+ try {
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), workspace.getName(), false);
+ fail("bestEffort is false and any merge should throw a MergeException.");
+ } catch (MergeException e) {
+ // successful
+ }
+ }
+
+ /**
* A MergeVersionException is thrown if bestEffort is false and a
* versionable node is encountered whose corresponding node's base version
* is on a divergent branch from this node's base version.
@@ -252,6 +434,39 @@
}
/**
+ * A MergeVersionException is thrown if bestEffort is false and a
+ * versionable node is encountered whose corresponding node's base version
+ * is on a divergent branch from this node's base version.
+ */
+ public void testMergeNodeBestEffortFalseAmbiguousVersionsJcr2() throws RepositoryException {
+ /// create 2 independent base versions for a node and its corresponding node
+ // so merge fails for this node
+
+ // default workspace
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager vmWsp1 = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ vmWsp1.checkout(originalPath);
+ vmWsp1.checkin(originalPath);
+
+ // second workspace
+ VersionManager vmWsp2 = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ vmWsp2.checkin(path);
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ vmWsp2.checkout(path);
+
+ // merge, besteffort set to false
+ try {
+ vmWsp2.merge(path, workspace.getName(), false);
+ fail("BestEffort is false and corresponding node's version is ambiguous. Merge should throw a MergeException.");
+ } catch (MergeException e) {
+ // successful
+ }
+ }
+
+ /**
* Tests if a {@link LockException} is thrown when merge is called on a
* locked node.
* @throws NotExecutableException if repository does not support locking.
@@ -259,8 +474,6 @@
public void disable_testMergeLocked()
throws NotExecutableException, RepositoryException {
- Session session = testRootNode.getSession();
-
if (!isSupported(Repository.OPTION_LOCKING_SUPPORTED)) {
throw new NotExecutableException("Locking is not supported.");
}
@@ -300,18 +513,69 @@
}
/**
+ * Tests if a {@link LockException} is thrown when merge is called on a
+ * locked node.
+ * @throws NotExecutableException if repository does not support locking.
+ */
+ public void disable_testMergeLockedJcr2()
+ throws NotExecutableException, RepositoryException {
+
+ if (!isSupported(Repository.OPTION_LOCKING_SUPPORTED)) {
+ throw new NotExecutableException("Locking is not supported.");
+ }
+
+ // try to make nodeToMerge lockable if it is not
+ if (!nodeToMerge.isNodeType(mixLockable)) {
+ if (nodeToMerge.canAddMixin(mixLockable)) {
+ nodeToMerge.addMixin(mixLockable);
+ } else {
+ throw new NotExecutableException("Node " + nodeToMerge.getName() + " is not lockable and " +
+ "does not allow to add mix:lockable");
+ }
+ }
+ nodeToMerge.getParent().getSession().save();
+
+ // lock the node
+ // remove first slash of path to get rel path to root
+ String pathRelToRoot = nodeToMerge.getPath().substring(1);
+ // access node through another session to lock it
+ Session session2 = helper.getSuperuserSession();
+ try {
+ Node node2 = session2.getRootNode().getNode(pathRelToRoot);
+ node2.getSession().getWorkspace().getLockManager().lock(node2.getPath(), false, false, 60, "");
+
+ try {
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), workspace.getName(), false);
+ fail("merge must throw a LockException if applied on a " +
+ "locked node");
+ } catch (LockException e) {
+ // success
+ }
+
+ node2.getSession().getWorkspace().getLockManager().unlock(node2.getPath());
+ } finally {
+ session2.logout();
+ }
+ }
+
+ /**
* initialize a versionable node on default and second workspace
*/
protected void initNodes() throws RepositoryException {
+
+ VersionManager versionManager = testRootNode.getSession().getWorkspace().getVersionManager();
+
// create a versionable node
// nodeName1
Node topVNode = testRootNode.addNode(nodeName1, versionableNodeType);
topVNode.setProperty(propertyName1, topVNode.getName());
+ String path = topVNode.getPath();
// save default workspace
- testRootNode.save();
- topVNode.checkin();
- topVNode.checkout();
+ testRootNode.getSession().save();
+ versionManager.checkin(path);
+ versionManager.checkout(path);
log.println("test nodes created successfully on " + workspace.getName());
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java Fri May 22 14:38:51 2009
@@ -58,6 +58,30 @@
}
/**
+ * VersionManager.merge(): nonversionable subNode N: if it has no versionable
+ * ancestor, then it is updated to reflect the state of its corresponding
+ * node.<br>
+ */
+ public void testMergeNodeNonVersionableSubNodeNonVersionableAncestorJcr2() throws RepositoryException {
+ String nodeToMergePath = nodeName1 + "/" + nodeName2 + "/" + nodeName3;
+
+ // node to merge in second workspace
+ Node nodeToMerge = testRootNodeW2.getNode(nodeToMergePath);
+ // corresponding node to nodeToMerge in default workspace
+ Node correspondingNode = testRootNode.getNode(nodeToMergePath);
+
+ // modify value for non'v node in workspace2 so we can check if node in workspace2 after merge is updated
+ // to reflect the state of its corresponding node in default workspace....
+ nodeToMerge.setProperty(propertyName1, CHANGED_STRING);
+ nodeToMerge.getSession().save();
+ nodeToMerge.getSession().getWorkspace().getVersionManager().merge(
+ nodeToMerge.getPath(), workspace.getName(), true);
+
+ // test if modification on non-v node is done according to corresponding node.
+ assertTrue(nodeToMerge.getProperty(propertyName1).getString().equals(correspondingNode.getName()));
+ }
+
+ /**
* Node.merge(): nonversionable subNode N: if the merge result of its
* nearest versionable ancestor is update,<br> then it is updated to reflect
* the state of its corresponding node.<br>
@@ -91,6 +115,39 @@
}
/**
+ * VersionManager.merge(): nonversionable subNode N: if the merge result of its
+ * nearest versionable ancestor is update,<br> then it is updated to reflect
+ * the state of its corresponding node.<br>
+ */
+ public void testMergeNodeNonVersionableSubNodeUpdateJcr2() throws RepositoryException {
+ // modify non versionable subnode so we can check if it's updated after merge
+ String changedString = CHANGED_STRING + System.currentTimeMillis();
+ String nvSubNodePath = nodeName2 + "/" + nodeName3;
+
+ // versionable ancestor to merge in first workspace (N)
+ Node n = testRootNodeW2.getNode(nodeName1);
+
+ // versionable ancestor to merge in second workspace (N')
+ Node np = testRootNodeW2.getNode(nodeName1);
+
+ // checkout N and make change
+ n.getSession().getWorkspace().getVersionManager().checkout(n.getPath());
+ Node nvSubNode = n.getNode(nvSubNodePath);
+ nvSubNode.setProperty(propertyName1, changedString);
+ n.getSession().save();
+ n.getSession().getWorkspace().getVersionManager().checkin(n.getPath());
+
+ // merge change into N'
+ np.getSession().getWorkspace().getVersionManager().merge(np.getPath(), workspaceW2.getName(), true);
+
+ // corresponding node to nvSubNode in 2nd workspace
+ Node nvSubNodeP = np.getNode(nvSubNodePath);
+
+ // test if modification on N was merged into N' subnode
+ assertTrue(nvSubNodeP.getProperty(propertyName1).getString().equals(changedString));
+ }
+
+ /**
* Node.merge(): nonversionable subNode N: is left unchanged if the nearest
* versionable ancestor has state leave.<br>
*/
@@ -123,6 +180,38 @@
}
/**
+ * VersionManager.merge(): nonversionable subNode N: is left unchanged if the nearest
+ * versionable ancestor has state leave.<br>
+ */
+ public void testMergeNodeNonVersionableSubNodeLeaveJcr2() throws RepositoryException {
+ // modify non versionable subnode so we can check if it's updated after merge
+ String changedString = CHANGED_STRING + System.currentTimeMillis();
+ String nvSubNodePath = nodeName2 + "/" + nodeName3;
+
+ // versionable ancestor to merge in first workspace (N)
+ Node n = testRootNodeW2.getNode(nodeName1);
+
+ // versionable ancestor to merge in second workspace (N')
+ Node np = testRootNodeW2.getNode(nodeName1);
+
+ // checkout N' and make change
+ np.getSession().getWorkspace().getVersionManager().checkout(np.getPath());
+ Node nvSubNodeP = np.getNode(nvSubNodePath);
+ nvSubNodeP.setProperty(propertyName1, changedString);
+ np.getSession().save();
+ np.getSession().getWorkspace().getVersionManager().checkin(np.getPath());
+
+ // merge into N'
+ np.getSession().getWorkspace().getVersionManager().merge(np.getPath(), workspaceW2.getName(), true);
+
+ // corresponding node to nvSubNode in 2nd workspace
+ Node nvSubNode = np.getNode(nvSubNodePath);
+
+ // test if modification on N' was not modified
+ assertTrue(nvSubNode.getProperty(propertyName1).getString().equals(changedString));
+ }
+
+ /**
* initialize a three-step-hierarchy on default and second workspace
*/
protected void initNodes() throws RepositoryException {
@@ -142,7 +231,7 @@
subSubNvNode.setProperty(propertyName1, subSubNvNode.getName());
// save default workspace
- testRootNode.save();
+ testRootNode.getSession().save();
log.println("test nodes created successfully on " + workspace.getName());
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java Fri May 22 14:38:51 2009
@@ -19,6 +19,7 @@
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
+import javax.jcr.version.VersionManager;
/**
* <code>MergeSubNodeTest</code> contains tests dealing with sub nodes in the
@@ -42,7 +43,8 @@
nodeToMerge = testRootNodeW2.getNode(nodeName1);
// node has to be checked out while merging
- nodeToMerge.checkout();
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ versionManager.checkout(nodeToMerge.getPath());
}
@@ -82,6 +84,40 @@
}
/**
+ * VersionManager.merge(): versionable subNode N: If N has status leave but parent is
+ * update, then the subnode N is removed<br> retrieve the initialised node
+ * to perform operations we need before for this test<br>
+ */
+ public void disable_testRemoveNodeFromSourceWorkspaceAndMergeWithUpdateJcr2() throws RepositoryException {
+ // status 'update' for parent
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ // status 'leave' for subnode
+ Node originalNode = testRootNode.getNode(nodeName1);
+ Node originalSubNode = originalNode.getNode(nodeName2);
+ VersionManager originalVersionManager = originalSubNode.getSession().getWorkspace().getVersionManager();
+ String originalSubPath = originalSubNode.getPath();
+ originalVersionManager.checkout(originalSubPath);
+ originalVersionManager.checkin(originalSubPath);
+
+ // "merge" the nodeToMerge with the newNode from the default workspace
+ // besteffort set to false to stop at the first failure
+ versionManager.merge(path, workspace.getName(), false);
+
+ // if merge passed newSubNode1 should be also removed from workspace2
+ assertFalse("subNode1 not removed from " + workspaceW2.getName() + " as expected", nodeToMerge.hasNode(nodeName2));
+
+ // return version info about the clonedNode as it must also be updated
+ final String originalBaseVersionId = originalVersionManager.getBaseVersion(originalNode.getPath()).getIdentifier();
+ final String clonedBaseVersionId = versionManager.getBaseVersion(path).getIdentifier();
+
+ assertTrue("clonedNode has different version UUID than expected, it should be updated with the newNode version UUID", originalBaseVersionId.equals(clonedBaseVersionId));
+ }
+
+ /**
* Node.merge(): versionable subNode N checked-in: If V' is a successor (to
* any degree) of V, then the merge result for N is update<br> modify a node
* on the workspace1 and then merge the one in workspace2 with the one in
@@ -104,7 +140,35 @@
final String clonedBaseVersionUUID = nodeToMerge.getBaseVersion().getUUID();
assertTrue("clonedNode has different version UUID than expected, it should be updated with the newNode version UUID", originalBaseVersionUUID.equals(clonedBaseVersionUUID));
+ }
+
+ /**
+ * VersionManager.merge(): versionable subNode N checked-in: If V' is a successor (to
+ * any degree) of V, then the merge result for N is update<br> modify a node
+ * on the workspace1 and then merge the one in workspace2 with the one in
+ * workspace1 precondition is that the node in workspace2 is checked in
+ */
+ public void disable_testMergeNodeFromUpdatedSourceWorkspaceJcr2() throws RepositoryException {
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager originalVersionManager = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+
+ // update nodeName1 on workspace1
+ originalVersionManager.checkout(originalPath);
+ originalVersionManager.checkin(originalPath);
+
+ testRootNode.getSession().save();
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // besteffort set to false to stop at the first failure
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ versionManager.merge(path, workspace.getName(), false);
+
+ final String originalBaseVersionId = originalVersionManager.getBaseVersion(originalPath).getIdentifier();
+ final String clonedBaseVersionId = versionManager.getBaseVersion(path).getIdentifier();
+ assertTrue("clonedNode has different version UUID than expected, it should be updated with the newNode version UUID", originalBaseVersionId.equals(clonedBaseVersionId));
}
/**
@@ -130,6 +194,32 @@
}
/**
+ * VersionManager.merge(): versionable subNode N checked-in: If V' is a predecessor
+ * (to any degree) of V or if V and V' are identical (i.e., are actually the
+ * same version), then the merge result for N is leave<br> modify a node on
+ * the workspace2 and then merge the one in workspace2 with the one in
+ * workspace1<br> the node in workspace2 should be updated<br> precondition
+ * is that the node in workspace2 is checked in
+ */
+ public void testMergeNodeFromOlderSourceWorkspaceJcr2() throws RepositoryException {
+
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+
+ // touch the version on workspace2
+ versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ String baseVersionIdbeforeMerge = versionManager.getBaseVersion(path).getIdentifier();
+
+ // "merge" the clonedNode with the newNode from the default workspace
+ // besteffort set to false to stop at the first failure
+ versionManager.merge(path, workspace.getName(), false);
+
+ assertTrue("clonedNode has different UUID than expected, it should be left unchanged", baseVersionIdbeforeMerge .equals(versionManager.getBaseVersion(path).getIdentifier()));
+ }
+
+ /**
* Node.merge(): bestEffort is true > (sub)node which could not be merged
* are not affected.<br>
*/
@@ -167,6 +257,46 @@
}
/**
+ * VersionManager.merge(): bestEffort is true > (sub)node which could not be merged
+ * are not affected.<br>
+ */
+ public void disable_testMergeNodeBestEffortTrueJcr2() throws RepositoryException {
+ // create 2 new nodes with two independent versions
+ // so merge fails for this node
+ Node originalNode = testRootNode.getNode(nodeName1);
+ VersionManager originalVersionManager = originalNode.getSession().getWorkspace().getVersionManager();
+ String originalPath = originalNode.getPath();
+ originalVersionManager.checkout(originalPath);
+ Node subNode = originalNode.getNode(nodeName2);
+ // will be unchanged after merge
+ originalVersionManager.checkout(subNode.getPath());
+ subNode.setProperty(propertyName1, CHANGED_STRING);
+ // will be updated
+ originalNode.setProperty(propertyName1, CHANGED_STRING);
+ superuser.save();
+ originalVersionManager.checkin(subNode.getPath());
+ originalVersionManager.checkin(originalPath);
+
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ Node subNodeW2 = nodeToMerge.getNode(nodeName2);
+ versionManager.checkout(subNodeW2.getPath());
+ subNodeW2.setProperty(propertyName1, CHANGED_STRING);
+ superuserW2.save();
+ versionManager.checkin(subNodeW2.getPath());
+
+ versionManager.checkout(nodeToMerge.getPath());
+
+ // merge, besteffort set to true
+ versionManager.merge(nodeToMerge.getPath(), workspace.getName(), true);
+
+ // sub node should not be touched because merging failed
+ assertTrue(subNodeW2.getProperty(propertyName1).getString().equals(""));
+
+ // test root node should be touched because update
+ assertFalse(nodeToMerge.getProperty(propertyName1).getString().equals(nodeToMerge.getName()));
+ }
+
+ /**
* Node.merge(): For each versionable node N in the subtree rooted at this
* node,<br> a merge test is performed comparing N with its corresponding
* node in workspace, N'.<br>
@@ -187,6 +317,28 @@
}
/**
+ * VersionManager.merge(): For each versionable node N in the subtree rooted at this
+ * node,<br> a merge test is performed comparing N with its corresponding
+ * node in workspace, N'.<br>
+ */
+ public void disable_testMergeNodeSubNodesMergeTestJcr2() throws RepositoryException {
+ //setCheckProperty(nodeToMerge);
+ VersionManager versionManager = nodeToMerge.getSession().getWorkspace().getVersionManager();
+ String path = nodeToMerge.getPath();
+ versionManager.checkout(path);
+
+ versionManager.merge(path, workspace.getName(), true);
+
+ // check subnodes if they were touched
+ for (NodeIterator ni = nodeToMerge.getNodes(); ni.hasNext();) {
+ Node n = ni.nextNode();
+ if (versionManager.getBaseVersion(n.getPath()) != null) {
+ assertTrue(n.getProperty(propertyName1).getString().equals(CHANGED_STRING));
+ }
+ }
+ }
+
+ /**
* initialize a two-step-hierarchy on default and second workspace
*/
protected void initNodes() throws RepositoryException {
@@ -201,7 +353,7 @@
subNvNode.setProperty(propertyName1, subNvNode.getName());
// save default workspace
- testRootNode.save();
+ testRootNode.getSession().save();
log.println("test nodes created successfully on " + workspace.getName());
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionAbortTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionAbortTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionAbortTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionAbortTest.java Fri May 22 14:38:51 2009
@@ -21,6 +21,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.VersionException;
+import javax.jcr.version.VersionManager;
/**
* <code>OnParentVersionAbortTest</code> tests the OnParentVersion {@link OnParentVersionAction#ABORT ABORT}
@@ -54,6 +55,23 @@
}
/**
+ * Test the restore of a OnParentVersion-ABORT property
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestorePropJcr2() throws RepositoryException {
+ try {
+ VersionManager versionManager = p.getSession().getWorkspace().getVersionManager();
+ String path = p.getParent().getPath();
+ versionManager.checkout(path);
+ versionManager.checkin(path);
+ fail("On checkin of N which has a property with OnParentVersion ABORT defined, an UnsupportedRepositoryOperationException must be thrown.");
+ } catch (VersionException e) {
+ // success
+ }
+ }
+
+ /**
* Test the restore of a OnParentVersion-ABORT node
*
* @throws RepositoryException
@@ -70,4 +88,22 @@
// success
}
}
+
+ /**
+ * Test the restore of a OnParentVersion-ABORT node
+ *
+ * @throws RepositoryException
+ * @throws NotExecutableException
+ */
+ public void testRestoreNodeJcr2() throws RepositoryException, NotExecutableException {
+ // create child node with OPV-ABORT behaviour
+ addChildNode(OPVAction);
+ testRootNode.getSession().save();
+ try {
+ versionableNode.getSession().getWorkspace().getVersionManager().checkin(versionableNode.getPath());
+ fail("On checkin of N which has a child node with OnParentVersion ABORT defined, an UnsupportedRepositoryOperationException must be thrown.");
+ } catch (VersionException e) {
+ // success
+ }
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionComputeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionComputeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionComputeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionComputeTest.java Fri May 22 14:38:51 2009
@@ -20,6 +20,7 @@
import javax.jcr.Node;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>OnParentVersionComputeTest</code> tests the OnParentVersion {@link OnParentVersionAction#COMPUTE COMPUTE}
@@ -56,4 +57,26 @@
assertEquals("On restore of a OnParentVersion-COMPUTE property P, the current P in the workspace will be left unchanged.", p.getString(), newPropValue);
}
+
+ /**
+ * Test the restore of a OnParentVersion-COMPUTE property
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestorePropJcr2() throws RepositoryException {
+
+ Node propParent = p.getParent();
+ VersionManager versionManager = propParent.getSession().getWorkspace().getVersionManager();
+ String path = propParent.getPath();
+ versionManager.checkout(path);
+ Version v = versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ p.setValue(newPropValue);
+ p.getSession().save();
+
+ versionManager.restore(v, false);
+
+ assertEquals("On restore of a OnParentVersion-COMPUTE property P, the current P in the workspace will be left unchanged.", p.getString(), newPropValue);
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionCopyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionCopyTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionCopyTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionCopyTest.java Fri May 22 14:38:51 2009
@@ -20,6 +20,7 @@
import javax.jcr.Node;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>OnParentVersionCopyTest</code> tests the OnParentVersion {@link OnParentVersionAction#COPY COPY}
@@ -76,4 +77,35 @@
// todo: add proper comparison of restored node. equals does not work
// assertEquals("On restore of a OnParentVersion-COPY child node, the node needs to be restored, replacing the current node in the workspace.", childNode, superuser.getItem(initialNodePath));
}
+
+ /**
+ * Test the restore of a OnParentVersion-COPY node
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestoreNodeJcr2() throws RepositoryException {
+ // prepare for node test
+ Node childNode = addChildNode(OPVAction);
+ Node nodeParent = childNode.getParent();
+ // todo: added next line. correct? -> angela
+ nodeParent.getSession().save();
+
+ VersionManager versionManager = nodeParent.getSession().getWorkspace().getVersionManager();
+ String path = nodeParent.getPath();
+ versionManager.checkout(path);
+ Version v = versionManager.checkin(path);
+
+ initialNodePath = childNode.getPath();
+ versionManager.checkout(path);
+ childNode.remove();
+ nodeParent.getSession().save();
+
+ versionManager.restore(v, false);
+
+ if (!superuser.itemExists(initialNodePath)) {
+ fail("On restore of a OnParentVersion-COPY child node, the node needs to be restored, replacing the current node in the workspace.");
+ }
+ // todo: add proper comparison of restored node. equals does not work
+ // assertEquals("On restore of a OnParentVersion-COPY child node, the node needs to be restored, replacing the current node in the workspace.", childNode, superuser.getItem(initialNodePath));
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionIgnoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionIgnoreTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionIgnoreTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionIgnoreTest.java Fri May 22 14:38:51 2009
@@ -20,6 +20,7 @@
import javax.jcr.Node;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>OnParentVersionIgnoreTest</code> tests the OnParentVersion {@link OnParentVersionAction#IGNORE IGNORE}
@@ -58,6 +59,28 @@
}
/**
+ * Test the restore of a OnParentVersion-IGNORE property
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestorePropJcr2() throws RepositoryException {
+
+ Node propParent = p.getParent();
+ VersionManager versionManager = propParent.getSession().getWorkspace().getVersionManager();
+ String path = propParent.getPath();
+ versionManager.checkout(path);
+ Version v = versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ p.setValue(newPropValue);
+ p.getSession().save();
+
+ versionManager.restore(v, false);
+
+ assertEquals("On restore of a OnParentVersion-IGNORE property P, the current value of P must be left unchanged.", p.getString(), newPropValue);
+ }
+
+ /**
* Test the restore of a OnParentVersion-Ignore node
*
* @throws javax.jcr.RepositoryException
@@ -79,4 +102,27 @@
}
}
+ /**
+ * Test the restore of a OnParentVersion-Ignore node
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestoreNodeJcr2() throws RepositoryException {
+
+ VersionManager versionManager = versionableNode.getSession().getWorkspace().getVersionManager();
+ String path = versionableNode.getPath();
+ versionManager.checkout(path);
+ Version v = versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ // add 'ignore' child
+ String childName = addChildNode(OPVAction).getName();
+ versionableNode.getSession().save();
+
+ versionManager.restore(v, false);
+
+ if (!versionableNode.hasNode(childName)) {
+ fail("On restore of a OnParentVersion-Ignore child node, the node needs to be untouched.");
+ }
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java Fri May 22 14:38:51 2009
@@ -20,6 +20,7 @@
import javax.jcr.Node;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
/**
* <code>OnParentVersionInitializeTest</code> tests the {@link OnParentVersionAction#INITIALIZE INITIALIZE}
@@ -56,4 +57,26 @@
assertEquals("On restore of a OnParentVersion-INITIALIZE property P, the current value of P must be left unchanged.", p.getString(), newPropValue);
}
+
+ /**
+ * Test the restore of a OnParentVersion-INITIALIZE property
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testRestorePropJcr2() throws RepositoryException {
+
+ Node propParent = p.getParent();
+ VersionManager versionManager = propParent.getSession().getWorkspace().getVersionManager();
+ String path = propParent.getPath();
+ versionManager.checkout(path);
+ Version v = versionManager.checkin(path);
+ versionManager.checkout(path);
+
+ p.setValue(newPropValue);
+ p.getSession().save();
+
+ versionManager.restore(v, false);
+
+ assertEquals("On restore of a OnParentVersion-INITIALIZE property P, the current value of P must be left unchanged.", p.getString(), newPropValue);
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java?rev=777548&r1=777547&r2=777548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java Fri May 22 14:38:51 2009
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.test.api.version;
import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
import javax.jcr.RepositoryException;
import javax.jcr.Property;
import javax.jcr.Value;
@@ -48,6 +49,22 @@
}
/**
+ * Test that the initial base version after creation of a versionable node
+ * points to the root version.
+ *
+ * @throws javax.jcr.RepositoryException
+ */
+ public void testInitialBaseVersionPointsToRootVersionJcr2() throws RepositoryException {
+
+ VersionManager versionManager = versionableNode.getSession().getWorkspace().getVersionManager();
+ String path = versionableNode.getPath();
+ Version rV = versionManager.getVersionHistory(path).getRootVersion();
+ Version bV = versionManager.getBaseVersion(path);
+
+ assertTrue("After creation of a versionable node the node's baseVersion must point to the rootVersion in the version history.", rV.isSame(bV));
+ }
+
+ /**
* Test if after creation of a versionable node N the multi-value
* REFERENCE property jcr:predecessors of N is initialized to contain a
* single UUID, that of the root version (the same as jcr:baseVersion).
@@ -69,6 +86,27 @@
}
/**
+ * Test if after creation of a versionable node N the multi-value
+ * REFERENCE property jcr:predecessors of N is initialized to contain a
+ * single UUID, that of the root version (the same as jcr:baseVersion).
+ *
+ * @throws RepositoryException
+ */
+ public void testInitialNodePredecessorsJcr2() throws RepositoryException {
+
+ Property predecessors = versionableNode.getProperty(jcrPredecessors);
+ Value[] values = predecessors.getValues();
+ Version rV = versionableNode.getSession().getWorkspace().getVersionManager().getVersionHistory(versionableNode.getPath()).getRootVersion();
+ if (values.length != 1) {
+ fail("The jcr:predecessors property of a versionable node must be initialized to contain a single value");
+ }
+
+ Value initialVal = values[0];
+
+ assertTrue("The jcr:predecessors property of a versionable node is initialized to contain a single UUID, that of the root version", initialVal.equals(superuser.getValueFactory().createValue(rV)));
+ }
+
+ /**
* Test if the root version does not have any predecessor versions.
*
* @throws RepositoryException
@@ -79,6 +117,16 @@
}
/**
+ * Test if the root version does not have any predecessor versions.
+ *
+ * @throws RepositoryException
+ */
+ public void testRootVersionHasNoPredecessorJcr2() throws RepositoryException {
+ Version[] predec = versionableNode.getSession().getWorkspace().getVersionManager().getVersionHistory(versionableNode.getPath()).getRootVersion().getPredecessors();
+ assertTrue("The root version may not have any predecessors.", predec.length == 0);
+ }
+
+ /**
* Test if UnsupportedRepositoryOperationException is thrown when calling
* Node.getVersionHistory() on a non-versionable node.
*
@@ -92,4 +140,19 @@
//success
}
}
+
+ /**
+ * Test if UnsupportedRepositoryOperationException is thrown when calling
+ * Node.getVersionHistory() on a non-versionable node.
+ *
+ * @throws RepositoryException
+ */
+ public void testGetBaseVersionOnNonVersionableNodeJcr2() throws RepositoryException {
+ try {
+ nonVersionableNode.getSession().getWorkspace().getVersionManager().getBaseVersion(nonVersionableNode.getPath());
+ fail("Node.getBaseVersion() must throw UnsupportedRepositoryOperationException if the node is not versionable.");
+ } catch (UnsupportedRepositoryOperationException e) {
+ //success
+ }
+ }
}
\ No newline at end of file