/* * 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.core; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.jackrabbit.test.AbstractJCRTest; /** * Tests moving, refreshing, and saving nodes. */ public class MoveTest extends AbstractJCRTest { /** * Test case for * <a href="https://issues.apache.org/jira/browse/JCR-2720">JCR-2720</a> */ public void testMoveVisibilityAcrossSessions() throws RepositoryException { Session session1 = getHelper().getReadWriteSession(); Session session2 = getHelper().getReadWriteSession(); if (session1.itemExists("/foo")) { session1.removeItem("/foo"); session1.save(); } session1.getRootNode().addNode("libs").addNode("foo").addNode("install"); session1.save(); assertTrue(session1.itemExists("/libs/foo/install")); assertFalse(session1.itemExists("/foo")); assertTrue(session2.itemExists("/libs/foo/install")); assertFalse(session2.itemExists("/foo")); session1.move("/libs", "/foo"); session1.save(); assertFalse(session1.itemExists("/libs/foo/install")); session2.refresh(false); assertFalse("JCR-2720", session2.itemExists("/libs/foo/install")); } /** * Tests moving a node, and then refreshing or saving it. */ public void testMove() throws RepositoryException { doTestMove(true); doTestMove(false); } private void doTestMove(boolean save) throws RepositoryException { Session session = testRootNode.getSession(); for (NodeIterator it = testRootNode.getNodes(); it.hasNext();) { it.nextNode().remove(); session.save(); } Node node1 = testRootNode.addNode(nodeName1); Node node2 = node1.addNode(nodeName2); session.save(); String from = node2.getPath(); String to = node1.getParent().getPath() + "/" + nodeName2; session.move(from, to); try { if (save) { node2.save(); } else { node2.refresh(false); } fail("Refresh and Save should not work for moved nodes"); } catch (RepositoryException e) { // expected } session.save(); NodeIterator it = node2.getParent().getNodes(nodeName2); assertTrue(it.hasNext()); it.nextNode(); assertFalse(it.hasNext()); node2.getParent().getPath(); // for (it = testRootNode.getNodes(); it.hasNext();) { // System.out.println(it.nextNode().getPath()); // } String now = node2.getPath(); assertEquals(testRootNode.getPath() + "/" + nodeName2, now); } /** * Test reordering same-name-siblings using move */ public void testReorderSameNameSiblingsUsingMove() throws RepositoryException { Session session = testRootNode.getSession(); for (NodeIterator it = testRootNode.getNodes(); it.hasNext();) { it.nextNode().remove(); session.save(); } Node node1 = testRootNode.addNode(nodeName1); Node node2 = testRootNode.addNode(nodeName1); String path = node1.getPath(); // re-order the nodes using move session.move(path, path); assertEquals(path + "[2]", node1.getPath()); assertEquals(path, node2.getPath()); } /** * Verify paths of same name siblings are correct after a (reordering) move * Issue JCR-1880 */ public void testGetPathDoesNotInfluencePathsAfterMove() throws RepositoryException { doTestMoveWithGetPath(false); doTestMoveWithGetPath(true); } private void doTestMoveWithGetPath(boolean index) throws RepositoryException { Session session = testRootNode.getSession(); for (NodeIterator it = testRootNode.getNodes(); it.hasNext();) { it.nextNode().remove(); session.save(); } String testPath = testRootNode.getPath(); Node a = testRootNode.addNode("a"); Node b = a.addNode("b"); session.save(); session.move(testPath + "/a/b", testPath + "/a"); if (index) { b.getPath(); } session.move(testPath + "/a", testPath + "/a"); assertEquals(testPath + "/a[2]", a.getPath()); assertEquals(testPath + "/a", b.getPath()); } }