Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/SessionMoveVersionExceptionTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/SessionMoveVersionExceptionTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/SessionMoveVersionExceptionTest.java (working copy) @@ -39,9 +39,9 @@ public void testSessionMoveSourceCheckedInVersionException() throws RepositoryException { // add a node under a versionable node Node movingNode = versionableNode.addNode(nodeName1, nonVersionableNodeType.getName()); - versionableNode.save(); + versionableNode.getSession().save(); // check the parent node in - versionableNode.checkin(); + versionableNode.getSession().getWorkspace().getVersionManager().checkin(versionableNode.getPath()); try { // try to move the sub node this should throw an VersionException // either instantly or upon save() @@ -61,7 +61,7 @@ */ public void testSessionMoveDestCheckedInVersionException() throws RepositoryException { // make sure versionable node is checked in - versionableNode.checkin(); + versionableNode.getSession().getWorkspace().getVersionManager().checkin(versionableNode.getPath()); try { // try to move the sub node this should throw an VersionException either instantly or upon save() Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetPredecessorsTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetPredecessorsTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetPredecessorsTest.java (working copy) @@ -40,8 +40,10 @@ */ public void testGetPredecessors() throws RepositoryException { // create a new version - versionableNode.checkout(); - Version version = versionableNode.checkin(); + VersionManager versionManager = versionableNode.getSession().getWorkspace().getVersionManager(); + String path = versionableNode.getPath(); + versionManager.checkout(path); + Version version = versionManager.checkin(path); assertTrue("Version should have at minimum one predecessor version.", version.getPredecessors().length > 0); } Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeTest.java (working copy) @@ -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
+ */ + 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
then the merge method returns quietly and no * changes are made.
@@ -104,6 +134,24 @@ } /** + * VersionManager.merge(): If this node does not have a corresponding node in the + * indicated workspace
then the merge method returns quietly and no + * changes are made.
+ */ + 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
@@ -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
+ */ + 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
*/ @@ -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
+ */ + 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
*/ public void disable_testMergeNodeForceFailure() throws RepositoryException { @@ -200,6 +324,38 @@ } /** + * if mergeFailedProperty is present > VersionException
+ */ + 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.
*/ @@ -223,6 +379,32 @@ } /** + * VersionManager.merge(): bestEffort is false and any merge fails a MergeException is + * thrown.
+ */ + 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()); Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionGraphTest.java (working copy) @@ -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 Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetCreatedTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetCreatedTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/GetCreatedTest.java (working copy) @@ -20,6 +20,7 @@ import java.util.GregorianCalendar; import javax.jcr.RepositoryException; import javax.jcr.version.Version; +import javax.jcr.version.VersionManager; /** * GetCreatedTest provides test methods covering {@link @@ -38,8 +39,10 @@ public void testGetCreated() throws RepositoryException { // create version - versionableNode.checkout(); - Version version = versionableNode.checkin(); + VersionManager versionManager = versionableNode.getSession().getWorkspace().getVersionManager(); + String path = versionableNode.getPath(); + versionManager.checkout(path); + Version version = versionManager.checkin(path); Calendar now = GregorianCalendar.getInstance(); now.add(Calendar.SECOND, 1); @@ -47,7 +50,6 @@ assertTrue("Method getCreated() should return a creation date before current date.", version.getCreated().before(now)); } - /** * Returns the date this version was created. This corresponds to the value * of the jcr:created property in the nt:version node that represents this @@ -56,8 +58,10 @@ public void testGetCreatedCheckAgainstProperty() throws RepositoryException { // create version - versionableNode.checkout(); - Version version = versionableNode.checkin(); + VersionManager versionManager = versionableNode.getSession().getWorkspace().getVersionManager(); + String path = versionableNode.getPath(); + versionManager.checkout(path); + Version version = versionManager.checkin(path); Calendar calGetCreated = version.getCreated(); Calendar calCreatedProp = version.getProperty(jcrCreated).getValue().getDate(); Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/OnParentVersionInitializeTest.java (working copy) @@ -20,6 +20,7 @@ import javax.jcr.Node; import javax.jcr.version.OnParentVersionAction; import javax.jcr.version.Version; +import javax.jcr.version.VersionManager; /** * OnParentVersionInitializeTest 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 Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java (working copy) @@ -19,6 +19,7 @@ import javax.jcr.MergeException; import javax.jcr.Node; import javax.jcr.RepositoryException; +import javax.jcr.version.VersionManager; /** * MergeCheckedoutSubNodeTest 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()); Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeSubNodeTest.java (working copy) @@ -19,6 +19,7 @@ import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; +import javax.jcr.version.VersionManager; /** * MergeSubNodeTest 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
retrieve the initialised node + * to perform operations we need before for this test
+ */ + 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
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
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
modify a node on + * the workspace2 and then merge the one in workspace2 with the one in + * workspace1
the node in workspace2 should be updated
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.
*/ @@ -167,6 +257,46 @@ } /** + * VersionManager.merge(): bestEffort is true > (sub)node which could not be merged + * are not affected.
+ */ + 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,
a merge test is performed comparing N with its corresponding * node in workspace, N'.
@@ -187,6 +317,28 @@ } /** + * VersionManager.merge(): For each versionable node N in the subtree rooted at this + * node,
a merge test is performed comparing N with its corresponding + * node in workspace, N'.
+ */ + 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()); Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/MergeNodeIteratorTest.java (working copy) @@ -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,24 +145,23 @@ Node nodeWS1_2Sub1 = nodeWS1_2.addNode(nodeName1, versionableNodeType); Node nodeWS1_3 = mergeRootNode.addNode(nodeName3, versionableNodeType); - testRootNode.save(); + testRootNode.getSession().save(); - nodeWS1_1.checkin(); // create version 1.0 - nodeWS1_1.checkout(); + versionManager.checkin(nodeWS1_1.getPath()); // create version 1.0 + versionManager.checkout(nodeWS1_1.getPath()); - nodeWS1_1Sub1.checkin(); // create version 1.0 - nodeWS1_1Sub1.checkout(); + versionManager.checkin(nodeWS1_1Sub1.getPath()); // create version 1.0 + versionManager.checkout(nodeWS1_1Sub1.getPath()); - nodeWS1_2.checkin(); // create version 1.0 - nodeWS1_2.checkout(); + versionManager.checkin(nodeWS1_2.getPath()); // create version 1.0 + versionManager.checkout(nodeWS1_2.getPath()); - nodeWS1_2Sub1.checkin(); // create version 1.0 - nodeWS1_2Sub1.checkout(); + versionManager.checkin(nodeWS1_2Sub1.getPath()); // create version 1.0 + versionManager.checkout(nodeWS1_2Sub1.getPath()); - nodeWS1_3.checkin(); // create version 1.0 - nodeWS1_3.checkout(); + versionManager.checkin(nodeWS1_3.getPath()); // create version 1.0 + versionManager.checkout(nodeWS1_3.getPath()); - workspaceW2.clone(workspace.getName(), mergeRootNode.getPath(), mergeRootNode.getPath(), true); // get nodes in workspace 2 @@ -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; Index: jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionTest.java =================================================================== --- jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionTest.java (revision 776807) +++ jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/version/VersionTest.java (working copy) @@ -19,6 +19,7 @@ import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.version.Version; +import javax.jcr.version.VersionManager; import javax.jcr.ItemVisitor; import javax.jcr.Node; import javax.jcr.RepositoryException; @@ -29,6 +30,7 @@ import javax.jcr.Value; import javax.jcr.PropertyType; import javax.jcr.lock.LockException; +import javax.jcr.lock.LockManager; import java.util.GregorianCalendar; import java.util.Calendar; @@ -48,6 +50,7 @@ */ public class VersionTest extends AbstractVersionTest { + private VersionManager versionManager; private Version version; private Version version2; @@ -73,15 +76,17 @@ protected void setUp() throws Exception { super.setUp(); + versionManager = versionableNode.getSession().getWorkspace().getVersionManager(); + // create two versions - version = versionableNode.checkin(); - versionableNode.checkout(); - version2 = versionableNode.checkin(); + version = versionManager.checkin(versionableNode.getPath()); + versionManager.checkout(versionableNode.getPath()); + version2 = versionManager.checkin(versionableNode.getPath()); } protected void tearDown() throws Exception { // check the node out, so that it can be removed - versionableNode.checkout(); + versionManager.checkout(versionableNode.getPath()); version = null; version2 = null; super.tearDown(); @@ -116,13 +121,13 @@ public void testAddNode() throws Exception { try { version.addNode(nodeName4); - version.save(); + version.getSession().save(); fail("Version should be read-only: Version.addNode(String) did not throw a ConstraintViolationException"); } catch (ConstraintViolationException success) { } try { version.addNode(nodeName4, ntBase); - version.save(); + version.getSession().save(); fail("Version should be read-only: Version.addNode(String,String) did not throw a ConstraintViolationException"); } catch (ConstraintViolationException success) { } @@ -149,6 +154,18 @@ } /** + * Tests if Version.cancelMerge(Version) throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testCancelMergeJcr2() throws Exception { + try { + versionManager.cancelMerge(version.getPath(), version2); + fail("Version.cancelMerge(Version) did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.checkin() throws an {@link * javax.jcr.UnsupportedRepositoryOperationException} */ @@ -161,6 +178,18 @@ } /** + * Tests if Version.checkin() throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testCheckinJcr2() throws Exception { + try { + versionManager.checkin(version.getPath()); + fail("Version.checkin() did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.checkout() throws an {@link * javax.jcr.UnsupportedRepositoryOperationException} */ @@ -173,6 +202,18 @@ } /** + * Tests if Version.checkout() throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testCheckoutJcr2() throws Exception { + try { + versionManager.checkout(version.getPath()); + fail("Version.checkout() did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.doneMerge(Version) throws an {@link * javax.jcr.UnsupportedRepositoryOperationException} */ @@ -185,6 +226,18 @@ } /** + * Tests if Version.doneMerge(Version) throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testDoneMergeJcr2() throws Exception { + try { + versionManager.doneMerge(version.getPath(), version2); + fail("Version should not be versionable: Version.doneMerge(Version) did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.getAncestor(int) returns the right * ancestor */ @@ -205,6 +258,18 @@ } /** + * Tests if Version.getBaseVersion() throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testGetBaseVersionJcr2() throws Exception { + try { + versionManager.getBaseVersion(version.getPath()); + fail("Version.getBaseVersion() did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.getCorrespondingNodePath(String) returns * the right path */ @@ -239,6 +304,18 @@ } /** + * Tests if Version.getLock() throws a {@link + * javax.jcr.lock.LockException} + */ + public void testGetLockJcr2() throws Exception { + try { + version.getSession().getWorkspace().getLockManager().getLock(version.getPath()); + fail("Version should not be lockable: Version.getLock() did not throw a LockException"); + } catch (LockException success) { + } + } + + /** * Tests if Version.getMixinNodeTypes() does not return null. */ public void testGetMixinNodeTypes() throws Exception { @@ -356,6 +433,18 @@ } /** + * Tests if Version.getVersionHistory() throws an {@link + * javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testGetVersionHistoryJcr2() throws Exception { + try { + versionManager.getVersionHistory(version.getPath()); + fail("Version.getVersionHistory() did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.getUUID() returns the right UUID */ public void testGetUUID() throws Exception { @@ -401,6 +490,13 @@ } /** + * Tests if Version.holdsLock() returns false + */ + public void testHoldsLockJcr2() throws Exception { + assertFalse("Version.holdsLock() did not return false", version.getSession().getWorkspace().getLockManager().holdsLock(version.getPath())); + } + + /** * Tests if Version.isCheckedOut() returns true */ public void testIsCheckedOut() throws Exception { @@ -408,6 +504,13 @@ } /** + * Tests if Version.isCheckedOut() returns true + */ + public void testIsCheckedOutJcr2() throws Exception { + assertTrue("Version.isCheckedOut() did not return true", versionManager.isCheckedOut(version.getPath())); + } + + /** * Tests if Version.isLocked() returns false */ public void testIsLocked() throws Exception { @@ -415,6 +518,13 @@ } /** + * Tests if Version.isLocked() returns false + */ + public void testIsLockedJcr2() throws Exception { + assertFalse("Version.isLocked() did not return false", version.getSession().getWorkspace().getLockManager().isLocked(version.getPath())); + } + + /** * Tests if Version.isModified() returns false */ public void testIsModified() throws Exception { @@ -452,6 +562,14 @@ } /** + * Tests if Version.isSame() returns the right + * boolean value + */ + public void testIsSameJcr2() throws Exception { + assertTrue("Version.isSame(Item) did not return true", version2.isSame(versionManager.getBaseVersion(versionableNode.getPath()))); + } + + /** * Tests if Version.lock(boolean, boolean) throws a {@link * LockException} */ @@ -479,6 +597,35 @@ } /** + * Tests if Version.lock(boolean, boolean) throws a {@link + * LockException} + */ + public void testLockJcr2() throws Exception { + LockManager lockManager = version.getSession().getWorkspace().getLockManager(); + String path = version.getPath(); + try { + lockManager.lock(path, true, true, 60, ""); + fail("Version should not be lockable: Version.lock(true,true) did not throw a LockException"); + } catch (LockException success) { + } + try { + lockManager.lock(path, true, false, 60, ""); + fail("Version should not be lockable: Version.lock(true,false) did not throw a LockException"); + } catch (LockException success) { + } + try { + lockManager.lock(path, false, true, 60, ""); + fail("Version should not be lockable: Version.lock(false,true) did not throw a LockException"); + } catch (LockException success) { + } + try { + lockManager.lock(path, false, false, 60, ""); + fail("Version should not be lockable: Version.lock(false,false) did not throw a LockException"); + } catch (LockException success) { + } + } + + /** * Tests if Version.merge(String) throws an * {@link javax.jcr.nodetype.ConstraintViolationException} */ @@ -496,6 +643,25 @@ } /** + * Tests if Version.merge(String) throws an + * {@link javax.jcr.nodetype.ConstraintViolationException} + */ +/* + TODO: check why this fails + public void testMergeJcr2() throws Exception { + try { + versionManager.merge(version.getPath(), workspaceName, true); + fail("Version.merge(String, true) did not throw an ConstraintViolationException"); + } catch (ConstraintViolationException success) { + } + try { + versionManager.merge(version.getPath(),workspaceName, false); + fail("Version.merge(String, false) did not throw an ConstraintViolationException"); + } catch (ConstraintViolationException success) { + } + } +*/ + /** * Tests if Version.orderBefore(String, String) throws an * {@link javax.jcr.UnsupportedRepositoryOperationException} */ @@ -525,7 +691,7 @@ public void testRemove() throws Exception { try { version.remove(); - versionableNode.getVersionHistory().save(); + versionableNode.getSession().save(); fail("Version should be read-only: Version.remove() did not throw a ConstraintViolationException"); } catch (ConstraintViolationException success) { } @@ -569,6 +735,26 @@ } /** + * Tests if Version.restore(String, boolean) and + * Version.restore(Version, boolean) throw an + * {@link UnsupportedRepositoryOperationException} and + * Version.restore(Version, String, boolean) throws a + * {@link ConstraintViolationException}. + */ + public void testRestoreJcr2() throws Exception { + try { + versionManager.restore(version.getPath(), "abc", true); + fail("Version.restore(String,boolean) did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + try { + versionManager.restore(version.getPath(), version2, true); + fail("Version.restore(Version,boolean) did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if Version.restoreByLabel(String, boolean) throws an * {@link javax.jcr.UnsupportedRepositoryOperationException} */ @@ -581,6 +767,18 @@ } /** + * Tests if Version.restoreByLabel(String, boolean) throws an + * {@link javax.jcr.UnsupportedRepositoryOperationException} + */ + public void testRestoreByLabelJcr2() throws Exception { + try { + versionManager.restoreByLabel(version.getPath(), "abc", true); + fail("Version.restoreByLabel(String,boolean) did not throw an UnsupportedRepositoryOperationException"); + } catch (UnsupportedRepositoryOperationException success) { + } + } + + /** * Tests if *