Return-Path: Delivered-To: apmail-incubator-jackrabbit-commits-archive@www.apache.org Received: (qmail 66594 invoked from network); 10 Mar 2005 14:33:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 10 Mar 2005 14:33:26 -0000 Received: (qmail 88766 invoked by uid 500); 10 Mar 2005 14:33:24 -0000 Mailing-List: contact jackrabbit-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: jackrabbit-dev@incubator.apache.org Delivered-To: mailing list jackrabbit-commits@incubator.apache.org Received: (qmail 88752 invoked by uid 500); 10 Mar 2005 14:33:24 -0000 Delivered-To: apmail-incubator-jackrabbit-cvs@incubator.apache.org Received: (qmail 88748 invoked by uid 99); 10 Mar 2005 14:33:24 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Thu, 10 Mar 2005 06:33:21 -0800 Received: (qmail 66512 invoked by uid 65534); 10 Mar 2005 14:33:19 -0000 Message-ID: <20050310143319.66508.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Mailer: svnmailer-1.0.0-dev Date: Thu, 10 Mar 2005 14:33:19 -0000 Subject: svn commit: r156952 - in incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/version: AbstractMergeTest.java MergeCancelMergeTest.java MergeCheckedoutSubNodeTest.java MergeDoneMergeTest.java MergeNodeTest.java MergeNonVersionableSubNodeTest.java MergeSubNodeTest.java To: jackrabbit-cvs@incubator.apache.org From: mreutegg@apache.org X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: mreutegg Date: Thu Mar 10 06:33:08 2005 New Revision: 156952 URL: http://svn.apache.org/viewcvs?view=3Drev&rev=3D156952 Log: Test cases for Node.merge(). Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/AbstractMergeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCancelMergeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCheckedoutSubNodeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeDoneMergeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNodeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNonVersionableSubNodeTest.java (with props) incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeSubNodeTest.java (with props) Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/AbstractMergeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/AbstractMergeTest.java?view=3Dauto&rev= =3D156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/AbstractMergeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/AbstractMergeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,151 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.Workspace; +import javax.jcr.nodetype.NodeType; +import javax.jcr.nodetype.NodeTypeManager; + +import org.apache.jackrabbit.test.AbstractJCRTest; + +/** + * AbstractMergeTest is the abstract base class for all merge + * related test classes. + */ +public abstract class AbstractMergeTest extends AbstractJCRTest { + + private static final String PROP_VERSIONABLE_NODE_TYPE =3D "versionabl= eNodeType"; + + // global variable used in different tests + + protected String versionableNodeType; + protected String nonVersionableNodeType; + + /** + * The superuser session for the second workspace + */ + protected Session superuserW2; + + /** + * The default workspace + */ + protected Workspace workspace; + + /** + * The second workspace + */ + protected Workspace workspaceW2; + + /** + * The test root node in second workspace to test + */ + protected Node testRootNodeW2; + + /** + * The modified string to check + */ + protected static final String CHANGED_STRING =3D "changed"; + + /** + * Initialising used variables coming from the properties file.
Se= tup + * some nodes on the 2 workspaces.
+ */ + protected void setUp() throws Exception { + super.setUp(); + + NodeTypeManager ntm =3D superuser.getWorkspace().getNodeTypeManage= r(); + + // versionable node type + versionableNodeType =3D getProperty(PROP_VERSIONABLE_NODE_TYPE); + if (versionableNodeType =3D=3D null) { + fail("Property '" + PROP_VERSIONABLE_NODE_TYPE + "' is not def= ined."); + } + + NodeType vNt =3D ntm.getNodeType(versionableNodeType); + if (!vNt.isNodeType(mixVersionable)) { + fail("Property '" + PROP_VERSIONABLE_NODE_TYPE + "' does not d= efine a versionable nodetype."); + } + + // non versionable node type + // test node type defines always a non versionable node type + nonVersionableNodeType =3D testNodeType; + if (nonVersionableNodeType =3D=3D null) { + fail("Property '" + testNodeType + "' is not defined."); + } + + NodeType nvNt =3D ntm.getNodeType(nonVersionableNodeType); + if (nvNt.isNodeType(mixVersionable)) { + fail("Property '" + testNodeType + "' does define a versionabl= e nodetype."); + } + + // initialise a new session on second workspace as superuser + superuserW2 =3D helper.getSuperuserSession(workspaceName); + + workspace =3D superuser.getWorkspace(); + workspaceW2 =3D superuserW2.getWorkspace(); + + // get/create test root node on second workspace + if (testPath.length() =3D=3D 0) { + // test root is the root node + testRootNodeW2 =3D superuserW2.getRootNode(); + } else if (!superuserW2.getRootNode().hasNode(testPath)) { + testRootNodeW2 =3D superuserW2.getRootNode().addNode(testPath,= testNodeType); + } else { + testRootNodeW2 =3D superuserW2.getRootNode().getNode(testPath); + } + + // initialize test nodes + initNodes(); + } + + /** + * Tidy the testRootNodes of both workspaces, then logout sessions + * + * @throws Exception + */ + protected void tearDown() throws Exception { + // remove all test nodes in second workspace + if (superuserW2 !=3D null) { + try { + if (!isReadOnly) { + // do a 'rollback' + superuserW2.refresh(false); + Node rootW2 =3D superuserW2.getRootNode(); + if (rootW2.hasNode(testPath)) { + // clean test root + testRootNodeW2 =3D rootW2.getNode(testPath); + for (NodeIterator children =3D testRootNodeW2.getN= odes(); children.hasNext();) { + children.nextNode().remove(); + } + rootW2.save(); + } + } + } finally { + superuserW2.logout(); + } + } + + super.tearDown(); + } + + // initialize nodes + abstract void initNodes() throws RepositoryException; +} \ No newline at end of file Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/AbstractMergeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeCancelMergeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeCancelMergeTest.java?view=3Dauto&re= v=3D156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCancelMergeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCancelMergeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,111 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; +import javax.jcr.Value; +import javax.jcr.version.Version; + +/** + * MergeCancelMergeTest contains tests dealing with nodes on = which + * cancelMerge is called. + * + * @test + * @sources MergeCancelMergeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeCancelMergeTe= st + * @keywords versioning + */ +public class MergeCancelMergeTest extends AbstractMergeTest { + + /** + * node to merge + */ + Node nodeToMerge; + + protected void setUp() throws Exception { + super.setUp(); + + nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + // node has to be checked out while merging + nodeToMerge.checkout(); + } + + /** + * Merge.cancelMerge(V): has the effect of removing the reference to V= ' from + * the jcr:mergeFailed property of N.
without adding it to + * jcr:predecessors.
Branches will not be joined.
+ */ + public void testMergeNodeCancelMerge() throws RepositoryException { + // create 2 independent versions for a node and its corresponding = node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + // get predecessors + Version[] predecessors =3D nodeToMerge.getBaseVersion().getPredece= ssors(); + // get mergeFailed property + Property mergeFailedProperty =3D nodeToMerge.getProperty(jcrMergeF= ailed); + Value[] mergeFailedReferences =3D mergeFailedProperty.getValues(); + + Version bv =3D nodeToMerge.getBaseVersion(); + nodeToMerge.cancelMerge(bv); + + // check predecessors - unchanged + Version[] predecessorsAfterCancel =3D nodeToMerge.getBaseVersion()= .getPredecessors(); + assertTrue(predecessors.length =3D=3D predecessorsAfterCancel.leng= th); + + // check mergeFailed property - reference removed + Property mergeFailedPropertyAfterCancelMerge =3D nodeToMerge.getPr= operty(jcrMergeFailed); + Value[] mergeFailedReferencesAfterCancelMerge =3D mergeFailedPrope= rtyAfterCancelMerge.getValues(); + assertTrue(mergeFailedReferences.length > mergeFailedReferencesAft= erCancelMerge.length); + } + + /** + * initialize a versionable node on default and second workspace + */ + protected void initNodes() throws RepositoryException { + // create a versionable node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // save default workspace + testRootNode.save(); + topVNode.checkin(); + topVNode.checkout(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } +} \ No newline at end of file Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeCancelMergeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeCheckedoutSubNodeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeCheckedoutSubNodeTest.java?view=3Da= uto&rev=3D156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCheckedoutSubNodeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeCheckedoutSubNodeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,119 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.MergeException; +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +/** + * MergeCheckedoutSubNodeTest contains tests dealing with + * checked-out nodes in the subtree of the node on which merge is called. + * + * @test + * @sources MergeCheckedoutSubNodeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeCheckedoutSub= NodeTest + * @keywords versioning + */ +public class MergeCheckedoutSubNodeTest extends AbstractMergeTest { + + /** + * node to merge + */ + Node nodeToMerge; + + protected void setUp() throws Exception { + super.setUp(); + + nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + // node has to be checked out while merging + nodeToMerge.checkout(); + } + + /** + * Node.merge(): If V' of a versionable subnode N' in the source works= pace + * is a successor of V (the base version of a subnode N in this worksp= ace), + * calling merge must fail. + */ + public void testFailIfCorrespondingNodeIsSuccessor() throws Repository= Exception { + try { + // make V' of a subnode N' in source workspace be a successor = version of + // the base version of the corresponding subnode. + Node n =3D nodeToMerge.getNode(nodeName2); + n.checkout(); + n.checkin(); + + n.checkout(); + + // merge, besteffort set to false to stop at the first failure + nodeToMerge.merge(workspace.getName(), false); + fail("Merging a checkedout node if the version V' of the corre= sponding 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 works= pace + * 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 testLeaveIfCorrespondingNodeIsPredeccessor() throws Reposi= toryException { + // make V' of a subnode N' in source workspace be a predeccessor v= ersion of + // the base version of the corresponding subnode. + Node n =3D testRootNode.getNode(nodeName1 + "/" + nodeName2); + n.checkout(); + n.setProperty(propertyName1, CHANGED_STRING); + testRootNode.save(); + n.checkin(); + + n.checkout(); + + // merge, besteffort set to false to stop at the first failure + nodeToMerge.merge(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 { + // create a versionable parent node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // create a versionable sub node + // nodeName1/nodeName2 + Node subNvNode =3D topVNode.addNode(nodeName2, versionableNodeType= ); + subNvNode.setProperty(propertyName1, subNvNode.getName()); + + // save default workspace + testRootNode.save(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } +} \ No newline at end of file Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeCheckedoutSubNodeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeDoneMergeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeDoneMergeTest.java?view=3Dauto&rev= =3D156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeDoneMergeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeDoneMergeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,112 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; +import javax.jcr.Value; +import javax.jcr.version.Version; + +/** + * MergeDoneMergeTest contains test dealing with nodes on whi= ch + * doneMerge is called. + * + * @test + * @sources MergeDoneMergeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeDoneMergeTest + * @keywords versioning + */ +public class MergeDoneMergeTest extends AbstractMergeTest { + /** + * node to merge + */ + Node nodeToMerge; + + protected void setUp() throws Exception { + super.setUp(); + + nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + // node has to be checked out while merging + nodeToMerge.checkout(); + + } + + /** + * Node.doneMerge(V) throws VersionException if V is not among the Vs = in the + * jcr:mergeFailed prop.
with adding it to jcr:predecessors.
+ * Branches will be joined.
+ */ + public void testMergeNodeDoneMerge() throws RepositoryException { + // create 2 independent versions for a node and its corresponding = node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + // get predecessors + Version[] predecessors =3D nodeToMerge.getBaseVersion().getPredece= ssors(); + // get mergeFailed property + Property mergeFailedProperty =3D nodeToMerge.getProperty(jcrMergeF= ailed); + Value[] mergeFailedReferences =3D mergeFailedProperty.getValues(); + + Version bv =3D nodeToMerge.getBaseVersion(); + nodeToMerge.doneMerge(bv); + + // check predecessors - added new predecessor + Version[] predecessorsAfterCancel =3D nodeToMerge.getBaseVersion()= .getPredecessors(); + assertTrue(predecessors.length < predecessorsAfterCancel.length); + + // check mergeFailed property - reference moved to predecessor + Property mergeFailedPropertyAfterCancelMerge =3D nodeToMerge.getPr= operty(jcrMergeFailed); + Value[] mergeFailedReferencesAfterCancelMerge =3D mergeFailedPrope= rtyAfterCancelMerge.getValues(); + assertTrue(mergeFailedReferences.length > mergeFailedReferencesAft= erCancelMerge.length); + } + + /** + * initialize a versionable node on default and second workspace + */ + protected void initNodes() throws RepositoryException { + // create a versionable node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // save default workspace + testRootNode.save(); + topVNode.checkin(); + topVNode.checkout(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } + +} \ No newline at end of file Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeDoneMergeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeNodeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeNodeTest.java?view=3Dauto&rev=3D156= 952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNodeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNodeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,242 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.version.VersionException; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.InvalidItemStateException; +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.Property; +import javax.jcr.Value; +import javax.jcr.MergeException; + +/** + * MergeNodeTest contains tests dealing with general merge no= de + * calls. + * + * @test + * @sources MergeNodeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeNodeTest + * @keywords versioning + */ + +public class MergeNodeTest extends AbstractMergeTest { + + /** + * node to merge + */ + Node nodeToMerge; + + protected void setUp() throws Exception { + super.setUp(); + + nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + // node has to be checked out while merging + nodeToMerge.checkout(); + + } + + /** + * Node.merge(): InvalidItemStateException if unsaved changes within t= he + * current Session
+ */ + public void testMergeNodeWithUnsavedStates() throws RepositoryExceptio= n { + // set a property and do not save workspace + nodeToMerge.setProperty(propertyName1, CHANGED_STRING); + try { + nodeToMerge.merge(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= { + try { + nodeToMerge.merge(getNonExistingWorkspaceName(superuser), fals= e); + } 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.
+ */ + public void testMergeNodeNonCorrespondingNode() throws RepositoryExcep= tion { + // create new node - this node has no corresponding node in defaul= t workspace + Node subNode =3D nodeToMerge.addNode(nodeName3, versionableNodeTyp= e); + subNode.setProperty(propertyName1, CHANGED_STRING); + superuserW2.save(); + subNode.checkin(); + + subNode.merge(workspace.getName(), true); + assertTrue(subNode.getProperty(propertyName1).getString().equals(C= HANGED_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
+ */ + public void testMergeNodeVersionAmbiguous() throws RepositoryException= { + // create 2 independent versions for a node and its corresponding = node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to false to stop at the first failure + try { + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), false); + } catch (VersionException e) { + // success if the version exception thrown + } + } + + /** + * Node.merge(): bestEffort is true > any merge-failure (represented b= y the + * version in the workspace) is reported in the jcrMergeFailed propert= y
+ */ + public void testMergeNodeBestEffortTrueCheckMergeFailedProperty() thro= ws RepositoryException { + // create 2 independent versions for a node and its corresponding = node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to true to report all failures + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + // success merge exception was raised as expected + // jcrMergeFailed should contains reference to the V' as it is a d= ifferent branche + String expectedReferenceUUID =3D originalNode.getBaseVersion().get= UUID(); + Property mergeFailedProperty =3D nodeToMerge.getProperty(jcrMergeF= ailed); + Value[] references =3D mergeFailedProperty.getValues(); + boolean referenceFound =3D false; + if (references !=3D null) { + for (int i =3D 0; i < references.length; i++) { + String referenceUUID =3D references[i].getString(); + if (referenceUUID.equals(expectedReferenceUUID)) { + referenceFound =3D true; + break; // it's not necessary to loop thru all the refe= rences + } + } + + assertTrue("reference to expected version that give the failur= e wasnt found in the mergeFailed", referenceFound); + } + } + + /** + * if mergeFailedProperty is present > VersionException
+ */ + public void testMergeNodeForceFailure() throws RepositoryException { + // create 2 independent versions for a node and its corresponding = node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to true to report all failures + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + try { + nodeToMerge.merge(workspace.getName(), true); + } catch (VersionException e) { + // success version exception expected + } + } + + /** + * Node.merge(): bestEffort is false and any merge fails a MergeExcept= ion is + * thrown.
+ */ + public void testMergeNodeBestEffortFalse() throws RepositoryException { + /// create 2 independent versions for a node and its corresponding= node + // so merge fails for this node + + // default workspace + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + originalNode.checkin(); + + // second workspace + nodeToMerge.checkin(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to true to report all failures + nodeToMerge.checkout(); + + // merge, besteffort set to false + try { + nodeToMerge.merge(workspace.getName(), false); + fail("bestEffort is false and any merge should throw a MergeEx= ception."); + } catch (MergeException e) { + // successful + } + } + + + /** + * initialize a versionable node on default and second workspace + */ + protected void initNodes() throws RepositoryException { + // create a versionable node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // save default workspace + testRootNode.save(); + topVNode.checkin(); + topVNode.checkout(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } +} Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeNodeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeNonVersionableSubNodeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeNonVersionableSubNodeTest.java?view= =3Dauto&rev=3D156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNonVersionableSubNodeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeNonVersionableSubNodeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,146 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.RepositoryException; +import javax.jcr.Node; + +/** + * MergeNonVersionableSubNodeTest contains test dealing with + * nonversionable nodes in the subtree of the node on which merge is calle= d=2E + * + * @test + * @sources MergeNonVersionableSubNodeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeNonVersionabl= eSubNodeTest + * @keywords versioning + */ +public class MergeNonVersionableSubNodeTest extends AbstractMergeTest { + + protected void setUp() throws Exception { + super.setUp(); + } + + /** + * Node.merge(): nonversionable subNode N: if it has no versionable + * ancestor, then it is updated to reflect the state of its correspond= ing + * node.
+ */ + public void testMergeNodeNonVersionableSubNodeNonVersionableAncestor()= throws RepositoryException { + String nodeToMergePath =3D nodeName1 + "/" + nodeName2 + "/" + nod= eName3; + + // node to merge in second workspace + Node nodeToMerge =3D testRootNodeW2.getNode(nodeToMergePath); + // corresponding node to nodeToMerge in default workspace + Node correspondingNode =3D testRootNode.getNode(nodeToMergePath); + + // modify value for non'v node in workspace2 so we can check if no= de in workspace2 after merge is updated + // to reflect the state of its corresponding node in default works= pace.... + nodeToMerge.setProperty(propertyName1, CHANGED_STRING); + nodeToMerge.save(); + nodeToMerge.merge(workspace.getName(), true); + + // test if modification on non-v node is done according to corresp= onding node. + assertTrue(nodeToMerge.getProperty(propertyName1).getString().equa= ls(correspondingNode.getName())); + } + + /** + * Node.merge(): nonversionable subNode N: if the merge result of its + * nearest versionable ancestor is update,
then it is updated to r= eflect + * the state of its corresponding node.
+ */ + public void testMergeNodeNonVersionableSubNodeUpdate() throws Reposito= ryException { + // modify non versionable subnode so we can check if it's updated = after merge + String nvSubNodePath =3D nodeName1 + "/" + nodeName2 + "/" + nodeN= ame3; + Node nvSubNode =3D testRootNodeW2.getNode(nvSubNodePath); + nvSubNode.setProperty(propertyName1, CHANGED_STRING); + superuserW2.save(); + + // versionable ancestor to merge in second workspace + Node nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + + // make sure the ancestor will get status 'update' on merge: V is = predeccessor of V' + nodeToMerge.checkout(); + nodeToMerge.checkin(); + + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + // corresponding node to nvSubNode in default workspace + Node correspondingSubNode =3D testRootNode.getNode(nvSubNodePath); + + // test if modification on non-v node is done according to corresp= onding node. + assertTrue(nvSubNode.getProperty(propertyName1).getString().equals= (correspondingSubNode.getName())); + } + + /** + * Node.merge(): nonversionable subNode N: is left unchanged if the ne= arest + * versionable ancestor has state leave.
+ */ + public void testMergeNodeNonVersionableSubNodeLeave() throws Repositor= yException { + // modify non versionable subnode so we can check if it's updated = after merge + String nvSubNodePath =3D nodeName1 + "/" + nodeName2 + "/" + nodeN= ame3; + Node nvSubNode =3D testRootNodeW2.getNode(nvSubNodePath); + nvSubNode.setProperty(propertyName1, CHANGED_STRING); + superuserW2.save(); + + // versionable ancestor to merge in second workspace + Node nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + + // make sure the ancestor will get status 'leave' on merge: V is s= uccessor of V' + Node correspondingNodeToMerge =3D testRootNode.getNode(nodeName1); + correspondingNodeToMerge.checkout(); + correspondingNodeToMerge.checkin(); + + nodeToMerge.checkout(); + nodeToMerge.merge(workspace.getName(), true); + + // test if modification on non-v node is unchanged. + assertTrue(nvSubNode.getProperty(propertyName1).getString().equals= (CHANGED_STRING)); + } + + /** + * initialize a three-step-hierarchy on default and second workspace + */ + protected void initNodes() throws RepositoryException { + // create a versionable parent node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // create a non'versionable sub node + // nodeName1/nodeName2 + Node subNvNode =3D topVNode.addNode(nodeName2, testNodeType); + subNvNode.setProperty(propertyName1, subNvNode.getName()); + + // create a non'versionable sub node below nonversionable node + // nodeName1/nodeName2/nodeName3 + Node subSubNvNode =3D subNvNode.addNode(nodeName3, testNodeType); + subSubNvNode.setProperty(propertyName1, subSubNvNode.getName()); + + // save default workspace + testRootNode.save(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } + +} \ No newline at end of file Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeNonVersionableSubNodeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/v= ersion/MergeSubNodeTest.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/= apache/jackrabbit/test/api/version/MergeSubNodeTest.java?view=3Dauto&rev=3D= 156952 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeSubNodeTest.java (added) +++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/vers= ion/MergeSubNodeTest.java Thu Mar 10 06:33:08 2005 @@ -0,0 +1,210 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.test.api.version; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; + +/** + * MergeSubNodeTest contains tests dealing with sub nodes in = the + * subtree of the node on which merge is called. + * + * @test + * @sources MergeSubNodeTest.java + * @executeClass org.apache.jackrabbit.test.api.version.MergeSubNodeTest + * @keywords versioning + */ + +public class MergeSubNodeTest extends AbstractMergeTest { + + /** + * node to merge + */ + Node nodeToMerge; + + protected void setUp() throws Exception { + super.setUp(); + + nodeToMerge =3D testRootNodeW2.getNode(nodeName1); + // node has to be checked out while merging + nodeToMerge.checkout(); + + } + + /** + * Node.merge(): versionable subNode N: If N has status leave but pare= nt is + * update, then the subnode N is removed
retrieve the initialised = node + * to perform operations we need before for this test
+ */ + public void testRemoveNodeFromSourceWorkspaceAndMergeWithUpdate() thro= ws RepositoryException { + // status 'update' for parent + nodeToMerge.checkin(); + nodeToMerge.checkout(); + + // status 'leave' for subnode + Node originalNode =3D testRootNode.getNode(nodeName1); + Node originalSubNode =3D originalNode.getNode(nodeName2); + originalSubNode.checkout(); + originalSubNode.checkin(); + + // "merge" the nodeToMerge with the newNode from the default works= pace + // besteffort set to false to stop at the first failure + nodeToMerge.merge(workspace.getName(), false); + + // if merge passed newSubNode1 should be also removed from workspa= ce2 + assertFalse("subNode1 not removed from " + workspaceW2.getName() += " as expected", nodeToMerge.hasNode(nodeName2)); + + // return version info about the clonedNode as it must also be upd= ated + final String originalBaseVersionUUID =3D originalNode.getBaseVersi= on().getUUID(); + final String clonedBaseVersionUUID =3D nodeToMerge.getBaseVersion(= )=2EgetUUID(); + + assertTrue("clonedNode has different version UUID than expected, i= t should be updated with the newNode version UUID", originalBaseVersionUUID= .equals(clonedBaseVersionUUID)); + } + + /** + * Node.merge(): versionable subNode N checked-in: If V' is a successo= r (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 testMergeNodeFromUpdatedSourceWorkspace() throws Repositor= yException { + Node originalNode =3D testRootNode.getNode(nodeName1); + + // update nodeName1 on workspace1 + originalNode.checkout(); + originalNode.checkin(); + + testRootNode.save(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to false to stop at the first failure + nodeToMerge.merge(workspace.getName(), false); + + final String originalBaseVersionUUID =3D originalNode.getBaseVersi= on().getUUID(); + final String clonedBaseVersionUUID =3D nodeToMerge.getBaseVersion(= )=2EgetUUID(); + + assertTrue("clonedNode has different version UUID than expected, i= t should be updated with the newNode version UUID", originalBaseVersionUUID= .equals(clonedBaseVersionUUID)); + + } + + /** + * Node.merge(): versionable subNode N checked-in: If V' is a predeces= sor + * (to any degree) of V or if V and V' are identical (i.e., are actual= ly the + * same version), then the merge result for N is leave
modify a no= de on + * the workspace2 and then merge the one in workspace2 with the one in + * workspace1
the node in workspace2 should be updated
precond= ition + * is that the node in workspace2 is checked in + */ + public void testMergeNodeFromOlderSourceWorkspace() throws RepositoryE= xception { + // touch the version on workspace2 + nodeToMerge.checkin(); + nodeToMerge.checkout(); + + String baseVersionUUIDbeforeMerge =3D nodeToMerge.getBaseVersion()= .getUUID(); + + // "merge" the clonedNode with the newNode from the default worksp= ace + // besteffort set to false to stop at the first failure + nodeToMerge.merge(workspace.getName(), false); + + assertTrue("clonedNode has different UUID than expected, it should= be left unchanged", baseVersionUUIDbeforeMerge.equals(nodeToMerge.getBaseV= ersion().getUUID())); + } + + /** + * Node.merge(): bestEffort is true > (sub)node which could not be mer= ged + * are not affected.
+ */ + public void testMergeNodeBestEffortTrue() throws RepositoryException { + // create 2 new nodes with two independent versions + // so merge fails for this node + Node originalNode =3D testRootNode.getNode(nodeName1); + originalNode.checkout(); + Node subNode =3D originalNode.getNode(nodeName2); + // will be unchanged after merge + subNode.checkout(); + subNode.setProperty(propertyName1, CHANGED_STRING); + // will be updated + originalNode.setProperty(propertyName1, CHANGED_STRING); + superuser.save(); + subNode.checkin(); + originalNode.checkin(); + + Node subNodeW2 =3D nodeToMerge.getNode(nodeName2); + subNodeW2.checkout(); + subNodeW2.setProperty(propertyName1, CHANGED_STRING); + superuserW2.save(); + subNodeW2.checkin(); + + nodeToMerge.checkout(); + + // merge, besteffort set to true + nodeToMerge.merge(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().equ= als(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 correspond= ing + * node in workspace, N'.
+ */ + public void testMergeNodeSubNodesMergeTest() throws RepositoryExceptio= n { + //setCheckProperty(nodeToMerge); + nodeToMerge.checkout(); + + nodeToMerge.merge(workspace.getName(), true); + + // check subnodes if they were touched + for (NodeIterator ni =3D nodeToMerge.getNodes(); ni.hasNext();) { + Node n =3D ni.nextNode(); + if (n.getBaseVersion() !=3D null) { + assertTrue(n.getProperty(propertyName1).getString().equals= (CHANGED_STRING)); + } + } + } + + /** + * initialize a two-step-hierarchy on default and second workspace + */ + protected void initNodes() throws RepositoryException { + // create a versionable parent node + // nodeName1 + Node topVNode =3D testRootNode.addNode(nodeName1, versionableNodeT= ype); + topVNode.setProperty(propertyName1, topVNode.getName()); + + // create a versionable sub node + // nodeName1/nodeName2 + Node subNvNode =3D topVNode.addNode(nodeName2, versionableNodeType= ); + subNvNode.setProperty(propertyName1, subNvNode.getName()); + + // save default workspace + testRootNode.save(); + + log.println("test nodes created successfully on " + workspace.getN= ame()); + + // clone the newly created node from src workspace into second wor= kspace + workspaceW2.clone(workspace.getName(), topVNode.getPath(), topVNod= e=2EgetPath(), true); + log.println(topVNode.getPath() + " cloned on " + superuserW2.getWo= rkspace().getName() + " at " + topVNode.getPath()); + + testRootNodeW2 =3D (Node) superuserW2.getItem(testRoot); + } + +} Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/= api/version/MergeSubNodeTest.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native