/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.NodeIterator; 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; /** * <code>MergeNodeIteratorTest</code> tests if Node.merge(String, boolean) if * bestEffort is true returns a NodeIterator over all versionalbe nodes in the * subtree that received a merge result of fail. * */ public class MergeNodeIteratorTest extends AbstractMergeTest { Node expectedFailedNodes[] = new Node[3]; protected void tearDown() throws Exception { for (int i = 0; i < expectedFailedNodes.length; i++) { expectedFailedNodes[i] = null; } super.tearDown(); } /** * Tests if Node.merge() when bestEffort is true returns a NodeIterator * containing all nodes that received a fail. */ public void testNodeIterator() throws RepositoryException { Node nodeToMerge = testRootNodeW2.getNode(nodeName1); NodeIterator failedNodes1 = nodeToMerge.merge(workspace.getName(), true); List<Node> nodeList = new ArrayList<Node>(); while (failedNodes1.hasNext()) { nodeList.add(failedNodes1.nextNode()); } 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 Iterator<Node> failedNodes2 = nodeList.iterator(); compareReturnedWithExpected: while (failedNodes2.hasNext()) { String path = failedNodes2.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."); } } /** * 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); NodeIterator failedNodes1 = nodeToMerge.getSession().getWorkspace().getVersionManager().merge( nodeToMerge.getPath(), workspace.getName(), true); List<Node> nodeList = new ArrayList<Node>(); while (failedNodes1.hasNext()) { nodeList.add(failedNodes1.nextNode()); } 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 Iterator<Node> failedNodes2 = nodeList.iterator(); compareReturnedWithExpected: while (failedNodes2.hasNext()) { String path = failedNodes2.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); Node nodeWS1_1Sub1 = nodeWS1_1.addNode(nodeName1, versionableNodeType); Node nodeWS1_2 = mergeRootNode.addNode(nodeName2, versionableNodeType); Node nodeWS1_2Sub1 = nodeWS1_2.addNode(nodeName1, versionableNodeType); Node nodeWS1_3 = mergeRootNode.addNode(nodeName3, versionableNodeType); testRootNode.getSession().save(); versionManager.checkin(nodeWS1_1.getPath()); // create version 1.0 versionManager.checkout(nodeWS1_1.getPath()); versionManager.checkin(nodeWS1_1Sub1.getPath()); // create version 1.0 versionManager.checkout(nodeWS1_1Sub1.getPath()); versionManager.checkin(nodeWS1_2.getPath()); // create version 1.0 versionManager.checkout(nodeWS1_2.getPath()); versionManager.checkin(nodeWS1_2Sub1.getPath()); // create version 1.0 versionManager.checkout(nodeWS1_2Sub1.getPath()); versionManager.checkin(nodeWS1_3.getPath()); // create version 1.0 versionManager.checkout(nodeWS1_3.getPath()); workspaceW2.clone(workspace.getName(), mergeRootNode.getPath(), mergeRootNode.getPath(), true); // get nodes in workspace 2 Node nodeWS2_1 = (Node) superuserW2.getItem(nodeWS1_1.getPath()); Node nodeWS2_2 = (Node) superuserW2.getItem(nodeWS1_2.getPath()); Node nodeWS2_2Sub1 = (Node) superuserW2.getItem(nodeWS1_2Sub1.getPath()); // create version branches for some of the nodes versionManager.checkin(nodeWS2_1.getPath()); // create version 1.1 versionManager.checkin(nodeWS1_1.getPath()); // create version 1.0.1 versionManager.checkin(nodeWS2_2.getPath()); // create version 1.1 versionManager.checkin(nodeWS1_2.getPath()); // 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; expectedFailedNodes[1] = nodeWS1_2; expectedFailedNodes[2] = nodeWS1_2Sub1; } }