/*
* 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.jcr2spi;
import javax.jcr.InvalidItemStateException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.apache.jackrabbit.util.Text;
/** <code>MoveToNewTest</code>... */
public class MoveToNewTest extends AbstractJCRTest {
protected Node srcParentNode;
protected Node destParentNode;
protected Node moveNode;
protected String destinationPath;
@Override
protected void setUp() throws Exception {
super.setUp();
// create parent node
srcParentNode = testRootNode.addNode(nodeName1, testNodeType);
// create node to be moved
moveNode = srcParentNode.addNode(nodeName2, testNodeType);
// save the new nodes
testRootNode.save();
// create a NEW node that will serve as destination parent
destParentNode = testRootNode.addNode(nodeName3, testNodeType);
destinationPath = destParentNode.getPath() + "/" + nodeName2;
}
@Override
protected void tearDown() throws Exception {
srcParentNode = null;
destParentNode = null;
moveNode = null;
super.tearDown();
}
public void testMove() throws RepositoryException {
String srcPath = moveNode.getPath();
testRootNode.getSession().move(srcPath, destinationPath);
assertTrue(destParentNode.isNew());
assertTrue(moveNode.isModified());
assertTrue(testRootNode.getSession().itemExists(destinationPath));
assertFalse(testRootNode.getSession().itemExists(srcPath));
}
public void testMoveSaved() throws RepositoryException {
String srcPath = moveNode.getPath();
testRootNode.getSession().move(srcPath, destinationPath);
testRootNode.save();
assertFalse(destParentNode.isNew());
assertFalse(srcParentNode.isModified());
assertFalse(moveNode.isModified());
assertTrue(testRootNode.getSession().itemExists(destinationPath));
assertFalse(testRootNode.getSession().itemExists(srcPath));
}
public void testRevertMovedNode() throws RepositoryException {
String srcPath = moveNode.getPath();
testRootNode.getSession().move(srcPath, destinationPath);
try {
destParentNode.refresh(false);
fail("Incomplete 'changelog'");
} catch (RepositoryException e) {
// ok
}
}
public void testRemoveDestParent() throws RepositoryException {
String srcPath = moveNode.getPath();
testRootNode.getSession().move(srcPath, destinationPath);
destParentNode.remove();
assertFalse(destParentNode.isNew());
assertFalse(destParentNode.isModified());
assertFalse(moveNode.isModified());
assertTrue(srcParentNode.isModified());
assertFalse(testRootNode.getSession().itemExists(srcPath));
}
public void testRevertRemoveDestParent() throws RepositoryException {
String srcPath = moveNode.getPath();
testRootNode.getSession().move(srcPath, destinationPath);
destParentNode.remove();
testRootNode.refresh(false);
assertFalse(destParentNode.isModified());
assertFalse(destParentNode.isNew());
try {
destParentNode.hasNode(nodeName2);
fail("The new destParent must have been removed.");
} catch (InvalidItemStateException e) {
// success
}
assertTrue(srcParentNode.hasNode(nodeName2));
assertFalse(srcParentNode.isModified());
assertFalse(testRootNode.getSession().itemExists(destinationPath));
assertTrue(testRootNode.getSession().itemExists(srcPath));
}
public void testMoveTwice() throws RepositoryException {
Session s = testRootNode.getSession();
String srcPath = moveNode.getPath();
s.move(srcPath, destinationPath);
srcParentNode.remove();
// create new parent
Node newParent = testRootNode.addNode(nodeName1);
s.move(destinationPath, srcPath);
assertTrue(newParent.isNew());
assertTrue(newParent.hasNode(nodeName2));
assertTrue(destParentNode.isNew());
assertFalse(destParentNode.hasNode(nodeName2));
// remove the tmp destination parent node.
destParentNode.remove();
assertTrue(newParent.isNew());
assertTrue(newParent.hasNode(nodeName2));
assertTrue(moveNode.isModified());
testRootNode.save();
assertFalse(s.itemExists(Text.getRelativeParent(destinationPath, 1)));
assertTrue(s.itemExists(srcPath));
assertFalse(moveNode.isModified() || newParent.isNew() || srcParentNode.isModified());
try {
srcParentNode.getNode(nodeName2);
fail("src parent must be removed");
} catch (InvalidItemStateException e) {
// ok.
}
assertTrue(moveNode.isSame(newParent.getNode(nodeName2)));
}
public void testMoveTwiceWithSecondSession() throws RepositoryException {
Session s = testRootNode.getSession();
String srcPath = moveNode.getPath();
// move away the 'moveNode'
s.move(srcPath, destinationPath);
// rm the original parent
srcParentNode.remove();
// create new parent and move the 'moveNode' back
Node newParent = testRootNode.addNode(nodeName1);
newParent.setProperty(propertyName1, "marker");
s.move(destinationPath, srcPath);
// remove the tmp. destination parent
destParentNode.remove();
testRootNode.save();
Session readOnly = getHelper().getReadOnlySession();
try {
Node trn = (Node) readOnly.getItem(testRootNode.getPath());
NodeIterator it = trn.getNodes(nodeName1);
String msg = "testRootNode must have a single child node with name " + nodeName1;
if (it.hasNext()) {
Node parent = it.nextNode();
assertTrue(parent.hasProperty(propertyName1));
assertEquals("The 'newParent' must have the marker property","marker", parent.getProperty(propertyName1).getString());
assertTrue("moveNode must be present below the 'newParent'.", parent.hasNode(Text.getName(srcPath)));
assertFalse(msg, it.hasNext());
} else {
fail(msg);
}
} finally {
readOnly.logout();
}
}
}