/*
* 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 org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.util.EntityCollection;
import org.exoplatform.services.jcr.access.PermissionType;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NodeType;
import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS 27.12.2006
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
* Nedonosko</a>
* @version $Id: TestOrderBefore.java 11962 2008-03-16 16:31:14Z gazarenkov $
*/
public class TestOrderBefore extends JcrAPIBaseTest
{
protected final String TEST_ROOT = "order_test";
private Node testBase = null;
@Override
public void setUp() throws Exception
{
super.setUp();
testBase = root.addNode(TEST_ROOT);
root.save();
}
private void initSimpleCase() throws Exception
{
testBase.addNode("n1");
testBase.addNode("n2");
testBase.addNode("n3");
testBase.addNode("n4");
root.save();
}
private void initSimpleCase5() throws Exception
{
testBase.addNode("n2");
testBase.addNode("n3");
testBase.addNode("n1");
testBase.addNode("n4");
testBase.addNode("n5");
root.save();
}
private void initSNSCase1() throws Exception
{
testBase.addNode("n1");
testBase.addNode("n2");
testBase.addNode("n2");
testBase.addNode("n3");
root.save();
}
private void initSNSCase2() throws Exception
{
testBase.addNode("n1");
testBase.addNode("n1");
Node n3 = testBase.addNode("n1");
n3.addMixin("mix:referenceable");
testBase.addNode("n1");
root.save();
}
private void initSNSCase3() throws Exception
{
testBase.addNode("n1");
testBase.addNode("n1");
Node n3 = testBase.addNode("n1");
n3.addMixin("mix:referenceable");
testBase.addNode("n1");
testBase.addNode("n2");
root.save();
}
private void initSNSCase4() throws Exception
{
testBase.addNode("n1");
testBase.addNode("n1");
Node n21 = testBase.addNode("n2");
n21.addMixin("mix:referenceable");
testBase.addNode("n2");
Node n13 = testBase.addNode("n1");
n13.addMixin("mix:referenceable");
testBase.addNode("n3");
root.save();
}
private void initCustom(String[] names) throws ItemExistsException, PathNotFoundException, VersionException,
ConstraintViolationException, LockException, RepositoryException
{
for (int i = 0; i < names.length; i++)
{
testBase.addNode(names[i]);
}
root.save();
}
private void initSNSCaseLargeArray() throws Exception
{
for (int i = 1; i <= 100; i++)
{
Node node = testBase.addNode("n1");
if (i == 40)
{
node.addMixin("mix:referenceable");
}
}
root.save();
for (int i = 1; i <= 30; i++)
{
testBase.addNode("n_" + i);
}
root.save();
}
@Override
protected void tearDown() throws Exception
{
try
{
testBase.remove();
root.save();
}
catch (Throwable e)
{
log.error("TEAR DOWN ERROR. " + getName() + ". " + e.getMessage(), e);
}
super.tearDown();
}
/**
* nodes and positions must be of same length
*
* @param nodes
*/
private void checkOrder(Node testRoot, String[] nodes) throws Exception
{
if (log.isDebugEnabled())
log.debug(">>>> CHECK ORDER >>>>");
NodeIterator childs = testRoot.getNodes();
int orderPos = -1;
while (childs.hasNext())
{
orderPos++;
Node next = childs.nextNode();
String nodeName = nodes[orderPos];
if (!next.getPath().endsWith(nodeName))
{
String failMsg =
"Nodes order is invalid. Expected: " + nodeName + ". Found: " + next.getPath() + ". Position: "
+ orderPos;
log.error(failMsg);
fail(failMsg);
}
String mixins = "";
for (NodeType nt : next.getMixinNodeTypes())
{
mixins += nt.getName() + " ";
}
mixins = mixins.trim();
if (log.isDebugEnabled())
log.debug(">> " + next.getPath() + ", " + next.getPrimaryNodeType().getName() + " " + mixins);
}
if (log.isDebugEnabled())
log.debug("<<<< CHECK ORDER <<<<");
}
/**
* nodes and positions must be of same length
*
* @param nodes
*/
private void checkOrderAnotherSession(String[] nodes) throws Exception
{
Session newSession = repository.login(this.credentials, session.getWorkspace().getName());
Node testRoot = newSession.getRootNode().getNode(TEST_ROOT);
checkOrder(testRoot, nodes);
newSession.logout();
}
/**
* nodes and positions must be of same length
*
* @param nodes
*/
private void checkOrder(String[] nodes) throws Exception
{
checkOrder(testBase, nodes);
}
// -------------- Tests ---------------
// -------------- Simple use-case: child nodes n1, n2, n3, n4 ---------------
public void testOrderUp() throws Exception
{
initSimpleCase();
testBase.orderBefore("n4", "n3");
String[] order = new String[]{"n1", "n2", "n4", "n3"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderUpStepOver() throws Exception
{
initSimpleCase5();
// was n2,n3,n1,n4,n5
testBase.orderBefore("n4", "n3");
String[] order = new String[]{"n2", "n4", "n3", "n1", "n5"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderBegin() throws Exception
{
initSimpleCase();
testBase.orderBefore("n3", "n1");
String[] order = new String[]{"n3", "n1", "n2", "n4"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderDown() throws Exception
{
initSimpleCase();
testBase.orderBefore("n2", "n4");
String[] order = new String[]{"n1", "n3", "n2", "n4"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderEnd() throws Exception
{
initSimpleCase();
testBase.orderBefore("n2", null);
String[] order = new String[]{"n1", "n3", "n4", "n2"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
// ----- Same-name sibling use-case: child nodes n1, n2[1], n2[2], n3 -----
public void testOrderUp_SNS1() throws Exception
{
initSNSCase1();
testBase.orderBefore("n3", "n2");
String[] order = new String[]{"n1", "n3", "n2", "n2[2]"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderBegin_SNS1() throws Exception
{
initSNSCase1();
testBase.orderBefore("n2[2]", "n1");
String[] order = new String[]{"n2", "n1", "n2[2]", "n3"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderDown_SNS1() throws Exception
{
initSNSCase1();
testBase.orderBefore("n1", "n2[2]");
String[] order = new String[]{"n2", "n1", "n2[2]", "n3"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
/**
* A childs order map is unchanged after the order
*/
public void testOrderDown1_SNS1() throws Exception
{
initSNSCase1();
testBase.orderBefore("n2", "n3");
String[] order = new String[]{"n1", "n2", "n2[2]", "n3"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
public void testOrderEnd_SNS1() throws Exception
{
initSNSCase1();
testBase.orderBefore("n2[2]", null);
String[] order = new String[]{"n1", "n2", "n3", "n2[2]"};
checkOrder(order);
testBase.save();
checkOrderAnotherSession(order);
}
// ----- Same-name sibling use-case: child nodes n1, n1[2], n1[3], n1[4].
// n1[3] -
// mix:referenceable -----
public void testOrderBegin_SNS2() throws Exception
{
initSNSCase2();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[3]", "n1");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]"}; // n1[3]
// -> n1
checkOrder(order);
try
{
String n1uuid = testBase.getNode("n1").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n1uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n1uuid = testBase.getNode("n1").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n1uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1").getPath()
+ ". " + e);
}
}
public void testOrderUp_SNS2() throws Exception
{
initSNSCase2();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[4]", "n1[2]");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]"}; // n1[3]
// ->
// n1[4]
checkOrder(order);
try
{
String n4uuid = testBase.getNode("n1[4]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n4uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[4]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n4uuid = testBase.getNode("n1[4]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n4uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[4]").getPath()
+ ". " + e);
}
}
public void testOrderDown_SNS2() throws Exception
{
initSNSCase2();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1", "n1[3]");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]"}; // n1[3]
// is
// unchanged
// in
// location
checkOrder(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be unchanged after order an other node", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order of an other node, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
}
/**
* A childs order map is unchanged after the order
*/
public void testOrderDown1_SNS2() throws Exception
{
initSNSCase2();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[2]", "n1[4]");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]"}; // n1[3]
// ->
// n1[2]
checkOrder(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
}
public void testOrderEnd_SNS2() throws Exception
{
initSNSCase2();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[2]", null);
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]"}; // n1[3]
// ->
// n1[2]
checkOrder(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
}
// ----- Same-name sibling use-case: child nodes n1, n1[2], n1[3], n1[4], n2.
// n1[3] -
// mix:referenceable -----
public void testOrderBegin_SNS3() throws Exception
{
initSNSCase3();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n2", "n1");
String[] order = new String[]{"n2", "n1", "n1[2]", "n1[3]", "n1[4]"}; // n1
// [
// 3
// ]
// unchanged
checkOrder(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be unchanged after order an other node", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order of an other node, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be unchanged after order an other node", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order of an other node, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
}
public void testOrderUp_SNS3() throws Exception
{
initSNSCase3();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n2", "n1[3]");
String[] order = new String[]{"n1", "n1[2]", "n2", "n1[3]", "n1[4]"}; // n1
// [
// 3
// ]
// unchanged
checkOrder(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be unchanged after order an other node", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order of an other node, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n3uuid_same = testBase.getNode("n1[3]").getUUID();
assertEquals("A UUIDs must be unchanged after order an other node", n3uuid, n3uuid_same);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order of an other node, " + testBase.getNode("n1[3]").getPath()
+ ". " + e);
}
}
public void testOrderDown_SNS3() throws Exception
{
initSNSCase3();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1", "n2");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]", "n2"}; // n1
// [
// 3
// ]
// -
// >
// n1
// [
// 2
// ]
checkOrder(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
}
/**
* A childs order map is unchanged after the order
*/
public void testOrderDown1_SNS3() throws Exception
{
initSNSCase3();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[2]", "n1[4]");
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n1[4]", "n2"}; // n1
// [
// 3
// ]
// -
// >
// n1
// [
// 2
// ]
checkOrder(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n2uuid = testBase.getNode("n1[2]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n2uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[2]").getPath()
+ ". " + e);
}
}
public void testOrderEnd_SNS3() throws Exception
{
initSNSCase3();
String n3uuid = testBase.getNode("n1[3]").getUUID();
testBase.orderBefore("n1[3]", null);
String[] order = new String[]{"n1", "n1[2]", "n1[3]", "n2", "n1[4]"}; // n1
// [3]->n1[4]
checkOrder(order);
try
{
String n4uuid = testBase.getNode("n1[4]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n4uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[4]").getPath()
+ ". " + e);
}
testBase.save();
checkOrderAnotherSession(order);
try
{
String n4uuid = testBase.getNode("n1[4]").getUUID();
assertEquals("A UUIDs must be equals after order node to another position", n3uuid, n4uuid);
}
catch (RepositoryException e)
{
fail("A node is not mix:referenceable after order to another position, " + testBase.getNode("n1[4]").getPath()
+ ". " + e);
}
}
// ================= Large arrays of nodes ================
/**
* Test of case when an index text length in the item path is differs from one
* new creted by reorder. E.g. n1[2] -> n1[100]
*/
public void testLargeNodesArray() throws Exception
{
initSNSCaseLargeArray();
// String n40uuid = testBase.getNode("n1[40]").getUUID();
Node n1__2 = testBase.getNode("n1[2]");
Node n_21 = testBase.getNode("n_21");
Node n_24 = testBase.getNode("n_24");
// === step 1 ===
// n1[2] -> n1[100] pos:120; n_21 = pos:121; ... n1[3] -> pos:2; n1[99] ->
// n1[98] pos:98;
// n1[100] -> n1[99] pos:99
testBase.orderBefore("n1[2]", "n_21");
EntityCollection nodes = getEntityCollection(testBase.getNodes());
assertEquals("Nodes must be equals ", n1__2, nodes.getList().get(119)); // pos
// :
// 120
assertEquals("Nodes must be equals ", n1__2, testBase.getNode("n1[100]"));
assertEquals("Nodes must be equals ", n_21, nodes.getList().get(120)); //pos:
// 121
assertEquals("Nodes must be equals ", n_21, testBase.getNode("n_21"));
assertTrue("Node must exists ", testBase.hasNode("n1[2]"));
testBase.save();
nodes = getEntityCollection(testBase.getNodes());
assertEquals("Nodes must be equals ", n1__2, nodes.getList().get(119)); // pos
// :
// 120
assertEquals("Nodes must be equals ", n1__2, testBase.getNode("n1[100]"));
assertEquals("Nodes must be equals ", n_21, nodes.getList().get(120)); //pos:
// 121
assertEquals("Nodes must be equals ", n_21, testBase.getNode("n_21"));
assertTrue("Node must exists ", testBase.hasNode("n1[2]"));
// === step 2 ===
Node n1__100 = testBase.getNode("n1[100]");
// n_24 -> pos:120; n1[100] -> pos:121;
testBase.orderBefore("n_24", "n1[100]");
nodes = getEntityCollection(testBase.getNodes());
assertEquals("Nodes must be equals ", n1__100, nodes.getList().get(120)); // pos
// :
// 121
assertEquals("Nodes must be equals ", n1__100, testBase.getNode("n1[100]"));
assertEquals("Nodes must be equals ", n_24, nodes.getList().get(119)); //pos:
// 120
assertEquals("Nodes must be equals ", n_24, testBase.getNode("n_24"));
assertEquals("Nodes must be equals ", n_21, nodes.getList().get(121)); //pos:
// 122
assertEquals("Nodes must be equals ", n_21, testBase.getNode("n_21"));
testBase.save();
assertEquals("Nodes must be equals ", n1__100, nodes.getList().get(120)); // pos
// :
// 121
assertEquals("Nodes must be equals ", n1__100, testBase.getNode("n1[100]"));
assertEquals("Nodes must be equals ", n_24, nodes.getList().get(119)); //pos:
// 120
assertEquals("Nodes must be equals ", n_24, testBase.getNode("n_24"));
assertEquals("Nodes must be equals ", n_21, nodes.getList().get(121)); //pos:
// 122
assertEquals("Nodes must be equals ", n_21, testBase.getNode("n_21"));
}
public void testOrderTwice() throws Exception
{
String[] order = new String[]{"n1", "n2", "n3", "n4", "n5"};
initCustom(order);
checkOrder(testBase, order);
testBase.orderBefore("n1", "n4");
order = new String[]{"n2", "n3", "n1", "n4", "n5"};
checkOrder(order);
testBase.save();
checkOrder(order);
checkOrderAnotherSession(order);
testBase.orderBefore("n4", "n3");
order = new String[]{"n2", "n4", "n3", "n1", "n5"};
checkOrder(order);
testBase.save();
checkOrder(order);
checkOrderAnotherSession(order);
}
public void testAddMixinOrderBefore() throws Exception
{
Session session = repository.login(credentials, "ws");
Node testBase = session.getRootNode().addNode("test");
session.save();
testBase.addNode("n1");
root.save();
Node n2 = testBase.addNode("n2");
testBase.orderBefore("n2", "n1");
n2.addMixin("exo:datetime");
testBase.save();
Node n3 = testBase.addNode("n3");
testBase.orderBefore("n3", "n2");
n3.addMixin("exo:datetime");
testBase.save();
Node n4 = testBase.addNode("n4");
testBase.orderBefore("n4", "n3");
n4.addMixin("exo:datetime");
testBase.save();
NodeIterator it = testBase.getNodes();
NodeImpl node1 = (NodeImpl)it.nextNode();
NodeImpl node2 = (NodeImpl)it.nextNode();
NodeImpl node3 = (NodeImpl)it.nextNode();
NodeImpl node4 = (NodeImpl)it.nextNode();
assertEquals("n4", node1.getName());
assertEquals("n3", node2.getName());
assertEquals("n2", node3.getName());
assertEquals("n1", node4.getName());
assertTrue(((NodeData)node1.getData()).getOrderNumber() < ((NodeData)node2.getData()).getOrderNumber());
assertTrue(((NodeData)node2.getData()).getOrderNumber() < ((NodeData)node3.getData()).getOrderNumber());
assertTrue(((NodeData)node3.getData()).getOrderNumber() < ((NodeData)node4.getData()).getOrderNumber());
session.logout();
}
public void testSetACLOrderBefore() throws Exception
{
Session session = repository.login(credentials, "ws");
NodeImpl testBase = (NodeImpl)session.getRootNode().addNode("testACL");
session.save();
testBase.addNode("n1");
root.save();
NodeImpl n2 = (NodeImpl) testBase.addNode("n2");
n2.addMixin("exo:privilegeable");
testBase.orderBefore("n2", "n1");
n2.setPermission("mary", new String[]{PermissionType.SET_PROPERTY});
testBase.save();
NodeImpl n3 = (NodeImpl) testBase.addNode("n3");
n3.addMixin("exo:privilegeable");
testBase.orderBefore("n3", "n2");
n3.setPermission("mary", new String[]{PermissionType.SET_PROPERTY});
testBase.save();
NodeImpl n4 = (NodeImpl) testBase.addNode("n4");
n4.addMixin("exo:privilegeable");
testBase.orderBefore("n4", "n3");
n4.setPermission("mary", new String[]{PermissionType.SET_PROPERTY});
testBase.save();
NodeIterator it = testBase.getNodes();
NodeImpl node1 = (NodeImpl)it.nextNode();
NodeImpl node2 = (NodeImpl)it.nextNode();
NodeImpl node3 = (NodeImpl)it.nextNode();
NodeImpl node4 = (NodeImpl)it.nextNode();
assertEquals("n4", node1.getName());
assertEquals("n3", node2.getName());
assertEquals("n2", node3.getName());
assertEquals("n1", node4.getName());
assertTrue(((NodeData)node1.getData()).getOrderNumber() < ((NodeData)node2.getData()).getOrderNumber());
assertTrue(((NodeData)node2.getData()).getOrderNumber() < ((NodeData)node3.getData()).getOrderNumber());
assertTrue(((NodeData)node3.getData()).getOrderNumber() < ((NodeData)node4.getData()).getOrderNumber());
session.logout();
}
public void testMoveOrderBefore() throws Exception
{
SessionImpl session = (SessionImpl)repository.login(credentials, WORKSPACE);
Node testMove = session.getRootNode().addNode("testMove");
testMove.addNode("n1");
session.save();
testMove.addNode("n2");
testMove.orderBefore("n2", "n1");
testMove.addNode("n3");
testMove.orderBefore("n3", "n2");
testMove.addNode("n4");
testMove.orderBefore("n4", "n3");
session.move(testMove.getPath(), "/dest");
session.save();
session.logout();
session = (SessionImpl)repository.login(credentials, WORKSPACE);
NodeIterator it = session.getRootNode().getNode("dest").getNodes();
NodeImpl node1 = (NodeImpl)it.nextNode();
NodeImpl node2 = (NodeImpl)it.nextNode();
NodeImpl node3 = (NodeImpl)it.nextNode();
NodeImpl node4 = (NodeImpl)it.nextNode();
assertEquals("n4", node1.getName());
assertEquals("n3", node2.getName());
assertEquals("n2", node3.getName());
assertEquals("n1", node4.getName());
assertTrue(((NodeData)node1.getData()).getOrderNumber() < ((NodeData)node2.getData()).getOrderNumber());
assertTrue(((NodeData)node2.getData()).getOrderNumber() < ((NodeData)node3.getData()).getOrderNumber());
assertTrue(((NodeData)node3.getData()).getOrderNumber() < ((NodeData)node4.getData()).getOrderNumber());
session.logout();
}
public void testDeleteOrderBefore() throws Exception
{
Session session = repository.login(credentials, "ws");
session.getRootNode().addNode("a");
session.save();
session.logout();
session = repository.login(credentials, "ws");
Node a = session.getRootNode().getNode("a"); // We suppose it already exists
a.addNode("n");
a.addNode("n");
a.addNode("n");
a.addNode("n");
session.save();
session.logout();
session = repository.login(credentials, "ws");
a = session.getRootNode().getNode("a");
NodeIterator i = a.getNodes();
i.nextNode().remove();
i.nextNode().remove();
i.nextNode().remove();
session.save();
session.logout();
session = repository.login(credentials, "ws");
a = session.getRootNode().getNode("a");
a.addNode("n");
a.orderBefore("n", null); // NPE happens here
session.save();
}
public void testDeleteOrderBefore_SNS() throws Exception
{
Session session = repository.login(credentials, "ws");
session.getRootNode().addNode("a");
session.save();
session.logout();
session = repository.login(credentials, "ws");
Node a = session.getRootNode().getNode("a"); // We suppose it already exist
Node n1 = a.addNode("n");
n1.addMixin("mix:referenceable");
Node n2 = a.addNode("n");
n2.addMixin("mix:referenceable");
Node n3 = a.addNode("n");
n3.addMixin("mix:referenceable");
session.save();
String n1id = n1.getUUID();
String n2id = n2.getUUID();
String n3id = n3.getUUID();
session.logout();
session = repository.login(credentials, "ws");
a = session.getRootNode().getNode("a");
a.getNode("n[2]").remove();
a.save();
session.save();
session.logout();
session = repository.login(credentials, "ws");
a = session.getRootNode().getNode("a");
try
{
session.getNodeByUUID(n2id);
fail("Node with id " + n2id + " is deleted");
}
catch (ItemNotFoundException e)
{
// ok
}
}
public void testOrderBeforeAfterMove() throws Exception
{
SessionImpl session = (SessionImpl)repository.login(credentials, WORKSPACE);
Node list = session.getRootNode().addNode("list2", "list");
assertEquals("list", list.getPrimaryNodeType().getName());
assertTrue(list.getPrimaryNodeType().hasOrderableChildNodes());
String path = list.addNode("1").getPath();
list.addNode("2");
session.save();
session.logout();
session = (SessionImpl)repository.login(credentials, WORKSPACE);
list = session.getRootNode().getNode("list2");
session.move(path, list.getPath() + "/3");
list.orderBefore("3", "2");
session.save();
session.logout();
session = (SessionImpl)repository.login(credentials, WORKSPACE);
NodeIterator it = session.getRootNode().getNode("list2").getNodes();
NodeImpl node1 = (NodeImpl)it.nextNode();
NodeImpl node2 = (NodeImpl)it.nextNode();
assertEquals("3", node1.getName());
assertEquals("2", node2.getName());
assertTrue(((NodeData)node1.getData()).getOrderNumber() < ((NodeData)node2.getData()).getOrderNumber());
session.logout();
}
public void testOrderBeforeAfterMove2() throws Exception
{
SessionImpl session = (SessionImpl)repository.login(credentials, WORKSPACE);
Node list = session.getRootNode().addNode("list2", "list");
assertEquals("list", list.getPrimaryNodeType().getName());
assertTrue(list.getPrimaryNodeType().hasOrderableChildNodes());
list.addNode("1");
list.addNode("2");
list.addNode("3");
list.addNode("4");
session.save();
session.logout();
session = (SessionImpl)repository.login(credentials, WORKSPACE);
list = session.getRootNode().getNode("list2");
session.move(list.getPath() + "/2", list.getPath() + "/5");
list.orderBefore("5", "1");
session.save();
session.logout();
session = (SessionImpl)repository.login(credentials, WORKSPACE);
NodeIterator it = session.getRootNode().getNode("list2").getNodes();
NodeImpl node1 = (NodeImpl)it.nextNode();
NodeImpl node2 = (NodeImpl)it.nextNode();
NodeImpl node3 = (NodeImpl)it.nextNode();
NodeImpl node4 = (NodeImpl)it.nextNode();
assertEquals("5", node1.getName());
assertEquals("1", node2.getName());
assertEquals("3", node3.getName());
assertEquals("4", node4.getName());
assertTrue(((NodeData)node1.getData()).getOrderNumber() < ((NodeData)node2.getData()).getOrderNumber());
assertTrue(((NodeData)node2.getData()).getOrderNumber() < ((NodeData)node3.getData()).getOrderNumber());
assertTrue(((NodeData)node3.getData()).getOrderNumber() < ((NodeData)node4.getData()).getOrderNumber());
session.logout();
}
private EntityCollection getEntityCollection(NodeIterator nodes)
{
List result = new ArrayList();
while (nodes.hasNext())
{
result.add(nodes.next());
}
return new EntityCollection(result);
}
}