/* * 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.InvalidItemStateException; import javax.jcr.LoginException; import javax.jcr.NoSuchWorkspaceException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; /** * Created by The eXo Platform SAS. * * Date: 31.03.2008 * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: TestInvalidItemState.java 12967 2008-04-09 09:29:36Z pnedonosko $ */ public class TestInvalidItemState extends JcrAPIBaseTest { private Node testRoot; @Override public void setUp() throws Exception { super.setUp(); testRoot = root.addNode("invalidTest"); root.save(); } @Override protected void tearDown() throws Exception { root.refresh(false); testRoot.remove(); root.save(); super.tearDown(); } public void testSessionRemainChanges() throws Exception { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); // test Node nS1 = testRootS1.addNode("node"); testRootS1.save(); Node nS2 = testRootS2.getNode("node"); nS2.remove(); nS1.remove(); testRootS1.save(); try { testRootS2.save(); } catch (InvalidItemStateException e) { // ok, check pending changes assertTrue("Failed session has to store pending changes", s2.hasPendingChanges()); } } public void testAddRemoveRegularNode() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); // test Node nS1 = testRootS1.addNode("node1"); testRootS1.save(); testRootS2.addNode("node2"); nS1.remove(); testRootS1.save(); try { testRootS2.save(); } catch (InvalidItemStateException e) { e.printStackTrace(); fail("InvalidItemStateException should not have been thrown, but " + e); } } public void testAddRemoveSameNameSiblings() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); // test Node nS1 = testRootS1.addNode("node"); testRootS1.save(); testRootS2.addNode("node"); nS1.remove(); testRootS1.save(); try { testRootS2.save(); fail("InvalidItemStateException should have been thrown"); } catch (InvalidItemStateException e) { // ok } } public void testAddSubtreeOfNodes() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; // test try { Node nS1 = testRootS1.addNode("node1"); Node nS1_1 = nS1.addNode("childNode1"); Node nS1_2 = nS1.addNode("childNode1"); Node nS1_2_1 = nS1_2.addNode("childNode2"); Node nS1_2_2 = nS1_2.addNode("childNode2"); testRootS1.save(); } catch (InvalidItemStateException e) { e.printStackTrace(); fail("InvalidItemStateException should not have been thrown, but " + e); } } /** * Test if remove of same-name siblings will not thorwn an exception. Nodes are removed by their * Ids. * * @throws LoginException * @throws NoSuchWorkspaceException * @throws RepositoryException */ public void testRemoveSameNameSiblings() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); Node nS1 = testRootS1.addNode("node"); // node[1] testRootS1.save(); Node nS2marker = testRootS2.addNode("node"); // node[2] nS2marker.addMixin("mix:referenceable"); String s2id = nS2marker.getUUID(); Node nS2 = testRootS2.addNode("node"); // node[3] testRootS2.save(); // test nS1.remove(); // 1. node[2] -> node[1] nS2.remove(); // 2. node[3] -> node[2] too testRootS1.save(); // save step 1 try { testRootS2.save(); // save step 2 } catch (InvalidItemStateException e) { fail("InvalidItemStateException should not have been thrown, but " + e); } assertEquals("Wrong node UUID found ", s2id, testRootS2.getNode("node").getUUID()); } public void testOrderSameNameSiblings() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); testRootS1.addNode("node"); // node[1] testRootS1.save(); Node nS2_2 = testRootS2.addNode("node"); // node[2] nS2_2.addMixin("mix:referenceable"); String s2_2_id = nS2_2.getUUID(); testRootS2.addNode("node"); // node[3] testRootS2.save(); // test testRootS2.orderBefore("node[3]", "node[1]"); testRootS1.orderBefore("node[3]", "node[2]"); testRootS1.save(); // save step 1 try { testRootS2.save(); // save step 2 } catch (InvalidItemStateException e) { fail("InvalidItemStateException should not have been thrown, but " + e); } assertEquals("Wrong node UUID found ", s2_2_id, testRootS2.getNode("node[3]").getUUID()); } /** * Test if orderBefore of same-name sibling nodes fails if one of them is deleted. * <p> * Check if refresh(true) and refresh(false) works ok with changes recorded on the Session. * * @throws LoginException * @throws NoSuchWorkspaceException * @throws RepositoryException */ public void testOrderRemoveSameNameSiblings() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); 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 nS2_2 = testRootS2.addNode("node"); // node[2] nS2_2.addMixin("mix:referenceable"); String s2_2_id = nS2_2.getUUID(); testRootS2.addNode("node"); // node[3] testRootS2.save(); // test testRootS2.orderBefore("node[3]", "node[1]");// node[3] -> node[1], node[1] -> node[2] testRootS1.orderBefore("node[3]", "node[2]");// node[3] -> node[2], node[2] -> node[3] nS1_1.remove();// remove node[1] testRootS1.save(); // save step 1 try { testRootS2.save(); // save step 2 fail("InvalidItemStateException should have been thrown, node[1] was removed"); } catch (InvalidItemStateException e) { // ok } try { testRootS2.refresh(true); testRootS2.save(); // save step 2 fail("InvalidItemStateException should have been thrown, node[1] was removed"); } catch (InvalidItemStateException e) { // ok } // in pending changes assertEquals("Wrong node UUID found ", s1_1_id, testRootS2.getNode("node[2]").getUUID()); testRootS2.refresh(false); // in persistent storage assertEquals("Wrong node UUID found ", s2_2_id, testRootS2.getNode("node[2]").getUUID()); } /** * Check if orderBefore of same-name sibling and regular nodes fails if the regular is deleted. * <p> * Check if refresh(true) and refresh(false) works ok with changes recorded on the Session. * * @throws LoginException * @throws NoSuchWorkspaceException * @throws RepositoryException */ public void testOrderSameNameSiblingsRemoveRegular() throws LoginException, NoSuchWorkspaceException, RepositoryException { final Node testRootS1 = testRoot; Session s2 = repository.login(credentials, testRootS1.getSession().getWorkspace().getName()); final Node testRootS2 = (Node)s2.getItem(testRootS1.getPath()); Node nS1_1 = testRootS1.addNode("node"); // node[1] testRootS1.save(); nS1_1.addMixin("mix:referenceable"); String s1_1_id = nS1_1.getUUID(); testRootS1.save(); testRootS2.addNode("my_node"); // my_node Node nS2_2 = testRootS2.addNode("node"); // node[2] nS2_2.addMixin("mix:referenceable"); String s2_2_id = nS2_2.getUUID(); testRootS2.save(); // test testRootS2.orderBefore("my_node", "node[1]"); testRootS1.orderBefore("my_node", "node[2]"); nS1_1.remove();// remove node[1] testRootS1.save(); // save step 1 try { testRootS2.save(); // save step 2 fail("InvalidItemStateException should have been thrown, node[1] was removed"); } catch (InvalidItemStateException e) { // ok } try { testRootS2.refresh(true); testRootS2.save(); // save step 2 fail("InvalidItemStateException should have been thrown, node[1] was removed"); } catch (InvalidItemStateException e) { // ok } // in pending changes, node[1] exists as an origialy created with index 1 assertEquals("Wrong node UUID found ", s1_1_id, testRootS2.getNode("node[1]").getUUID()); testRootS2.refresh(false); // in persistent storage, node[1] it's a node[2] originally assertEquals("Wrong node UUID found ", s2_2_id, testRootS2.getNode("node[1]").getUUID()); } }