/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.api.writing;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import javax.jcr.ItemExistsException;
import javax.jcr.LoginException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS.
*
* Date: 31.03.2008
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: TestSameNameSiblingsMove.java 12992 2008-04-09 14:52:34Z pnedonosko $
*/
public abstract class AbstractSameNameSiblingsMoveTest extends JcrAPIBaseTest
{
private Node testRoot;
/**
* Abstract SNS move test
*
* @param srcAbsPath
* @param destAbsPath
*/
abstract void move(Node testRoot, String srcAbsPath, String destAbsPath) throws ItemExistsException,
PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException;
@Override
public void setUp() throws Exception
{
super.setUp();
testRoot = root.addNode("snsMoveTest");
root.save();
}
@Override
protected void tearDown() throws Exception
{
root.refresh(false);
testRoot.remove();
root.save();
super.tearDown();
}
/**
* Move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveSameParentSameNameFirst() throws LoginException, NoSuchWorkspaceException, RepositoryException
{
final Node testRootS1 = testRoot;
testRootS1.addMixin("exo:owneable");
testRootS1.addMixin("exo:privilegeable");
testRootS1.save();
Node nS1_1 = testRootS1.addNode("node"); // node[1]
testRootS1.save();
nS1_1.addMixin("mix:referenceable");
nS1_1.addMixin("exo:owneable");
// nS1_1.setProperty("exo:owner", "root");
String s1_1_id = nS1_1.getUUID();
testRootS1.save();
Node nS1_2 = testRootS1.addNode("node"); // node[2]
Node nS1_3 = testRootS1.addNode("node"); // node[3]
testRootS1.save();
try
{
// move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1]
move(testRootS1, testRootS1.getPath() + "/node", testRootS1.getPath() + "/node");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
int index = 0;
for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
// log.info("Node: " + n.getPath());
assertEquals("Wrong index found ", index, n.getIndex());
}
// check pool updated
assertEquals(1, nS1_2.getIndex());
assertEquals(2, nS1_3.getIndex());
assertEquals(3, nS1_1.getIndex());
// check reordering
assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node[3]").getUUID());
}
/**
* Move node[2] to node[3], node[3] reordered to node[2].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveSameParentSameNameMiddle() throws LoginException, NoSuchWorkspaceException, RepositoryException
{
final Node testRootS1 = testRoot;
Node nS1_1 = testRootS1.addNode("node"); // node[1]
testRootS1.save();
nS1_1.addMixin("mix:referenceable");
String s1_1_id = nS1_1.getUUID();
testRootS1.save();
Node nS1_2 = testRootS1.addNode("node"); // node[2]
Node nS1_3 = testRootS1.addNode("node"); // node[3]
testRootS1.save();
// test
try
{
// move node[2] to node[3], node[3] reordered to node[2]
move(testRootS1, testRootS1.getPath() + "/node[2]", testRootS1.getPath() + "/node");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
int index = 0;
for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
// log.info("Node: " + n.getPath());
assertEquals("Wrong index found ", index, n.getIndex());
}
// check pool updated
assertEquals(1, nS1_1.getIndex());
assertEquals(2, nS1_3.getIndex());
assertEquals(3, nS1_2.getIndex());
// check reordering
assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
}
/**
* Move SNS node to itself, move node[3] to node[3].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveSameParentSameNameLast() throws LoginException, NoSuchWorkspaceException, RepositoryException
{
final Node testRootS1 = testRoot;
Node nS1_1 = testRootS1.addNode("node"); // node[1]
testRootS1.save();
nS1_1.addMixin("mix:referenceable");
String s1_1_id = nS1_1.getUUID();
testRootS1.save();
Node nS1_2 = testRootS1.addNode("node"); // node[2]
Node nS1_3 = testRootS1.addNode("node"); // node[3]
testRootS1.save();
// test
try
{
// move to itself, move node[3] to node[3]
move(testRootS1, testRootS1.getPath() + "/node[3]", testRootS1.getPath() + "/node");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
int index = 0;
for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
// log.info("Node: " + n.getPath());
assertEquals("Wrong index found ", index, n.getIndex());
}
// check pool updated
assertEquals(1, nS1_1.getIndex());
assertEquals(2, nS1_2.getIndex());
assertEquals(3, nS1_3.getIndex());
// check reordering
assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
}
/**
* Move node[1] to node-new[1], node[1,3] reordered to node[1,2].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveSameParentDifferentName() throws LoginException, NoSuchWorkspaceException, RepositoryException
{
final Node testRootS1 = testRoot;
Node nS1_1 = testRootS1.addNode("node"); // node[1]
testRootS1.save();
Node nS1_2 = testRootS1.addNode("node"); // node[2]
Node nS1_3 = testRootS1.addNode("node"); // node[3]
testRootS1.save();
// test
try
{
// move node[2] to node[3], node[3] reordered to node[2]
move(testRootS1, testRootS1.getPath() + "/node[1]", testRootS1.getPath() + "/node-new");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
// check pool updated
assertEquals(1, nS1_2.getIndex());
assertEquals(2, nS1_3.getIndex());
assertEquals(2, testRootS1.getNodes("node").getSize());
}
/**
* Move node[1] to node-existing[2], node[1,3] reordered to node[1,2].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveSameParentDifferentExistingName() throws LoginException, NoSuchWorkspaceException,
RepositoryException
{
final Node testRootS1 = testRoot;
Node nS1_1 = testRootS1.addNode("node"); // node[1]
testRootS1.save();
Node nS1_2 = testRootS1.addNode("node"); // node[2]
Node nS1_3 = testRootS1.addNode("node"); // node[3]
Node nExisting = testRootS1.addNode("node-existing"); // node-existing
testRootS1.save();
// test
try
{
// move node[2] to node[3], node[3] reordered to node[2]
move(testRootS1, testRootS1.getPath() + "/node[1]", testRootS1.getPath() + "/node-existing");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
// check pool updated
assertEquals(1, nS1_2.getIndex());
assertEquals(2, nS1_3.getIndex());
assertEquals(1, nExisting.getIndex());
assertEquals(2, nS1_1.getIndex());
assertEquals(2, testRootS1.getNodes("node").getSize());
assertEquals(2, testRootS1.getNodes("node-existing").getSize());
}
/**
* Move SNS node to different location with SNS too, move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3].
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveAnotherParentSameExsintingName() throws LoginException, NoSuchWorkspaceException,
RepositoryException
{
final Node testRootS1 = testRoot;
final Node testNode1 = testRootS1.addNode("node1");
final Node testNode2 = testRootS1.addNode("node1");
testRootS1.save();
Node n1_1 = testNode1.addNode("node"); // node[1]
Node n1_2 = testNode1.addNode("node"); // node[2]
testNode1.save();
n1_2.addMixin("mix:referenceable");
String n1_2_id = n1_2.getUUID();
testNode1.save();
Node n1_3 = testNode1.addNode("node"); // node[3]
Node n1_4 = testNode1.addNode("node"); // node[4]
testNode1.save();
Node n2_1 = testNode2.addNode("node"); // node[1]
Node n2_2 = testNode2.addNode("node"); // node[2]
testNode2.save();
// test
try
{
// move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3]
move(testNode1, testNode1.getPath() + "/node[2]", testNode2.getPath() + "/node");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
int index = 0;
for (NodeIterator iter = testNode1.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
assertEquals("Wrong index found ", index, n.getIndex());
}
index = 0;
for (NodeIterator iter = testNode2.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
assertEquals("Wrong index found ", index, n.getIndex());
}
// check pool updated
assertEquals(1, n1_1.getIndex());
assertEquals(2, n1_3.getIndex());
assertEquals(1, n2_1.getIndex());
assertEquals(2, n2_2.getIndex());
assertEquals(3, n1_2.getIndex());
// check reordering
assertEquals("Wrong node UUID found ", n1_2_id, testNode2.getNode("node[3]").getUUID());
}
/**
* Move SNS node to different location with SNS too, move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node-new.
*
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public void testMoveAnotherParentDifferentName() throws LoginException, NoSuchWorkspaceException,
RepositoryException
{
final Node testRootS1 = testRoot;
final Node testNode1 = testRootS1.addNode("node1");
final Node testNode2 = testRootS1.addNode("node1");
testRootS1.save();
Node n1_1 = testNode1.addNode("node"); // node[1]
Node n1_2 = testNode1.addNode("node"); // node[2]
testNode1.save();
n1_2.addMixin("mix:referenceable");
String n1_2_id = n1_2.getUUID();
testNode1.save();
Node n1_3 = testNode1.addNode("node"); // node[3]
Node n1_4 = testNode1.addNode("node"); // node[4]
testNode1.save();
Node n2_1 = testNode2.addNode("node"); // node[1]
Node n2_2 = testNode2.addNode("node"); // node[2]
testNode2.save();
// test
try
{
// move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node-new
move(testNode1, testNode1.getPath() + "/node[2]", testNode2.getPath() + "/node-new");
}
catch (RepositoryException e)
{
e.printStackTrace();
fail("RepositoryException should not have been thrown, but " + e);
}
int index = 0;
for (NodeIterator iter = testNode1.getNodes(); iter.hasNext();)
{
index++;
Node n = iter.nextNode();
assertEquals("Wrong index found ", index, n.getIndex());
}
assertEquals(3, testNode1.getNodes("node").getSize());
assertEquals(2, testNode2.getNodes("node").getSize());
// check pool updated
assertEquals(1, n1_1.getIndex());
assertEquals(2, n1_3.getIndex());
assertEquals(1, n2_1.getIndex());
assertEquals(2, n2_2.getIndex());
// check reordering
assertEquals("Wrong node UUID found ", n1_2_id, testNode2.getNode("node-new").getUUID());
}
/**
* JCR-1954. When changes log contains both update and rename states.
*/
public void testSeveralMoveInRow() throws Exception
{
Node testRoot = root.addNode("testNode");
testRoot.addNode("foo");
testRoot.addNode("foo");
session.save();
workspace.move("/testNode/foo", "/testNode/bar");
workspace.move("/testNode/bar", "/testNode/foo");
workspace.move("/testNode/foo", "/testNode/bar");
}
}