All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.test.api.NodeTest Maven / Gradle / Ivy

There is a newer version: 2.23.1-beta
Show newest version
/*
 * 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.test.api;

import org.apache.jackrabbit.test.AbstractJCRTest;
import org.apache.jackrabbit.test.NotExecutableException;

import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.Session;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.InvalidItemStateException;
import javax.jcr.ItemExistsException;
import javax.jcr.PathNotFoundException;
import javax.jcr.Repository;
import javax.jcr.Value;
import javax.jcr.PropertyType;
import javax.jcr.lock.LockException;

/**
 * NodeTest contains all test cases for the
 * javax.jcr.Node that are related to writing, modifying or deleting
 * nodes (level 2 of the specification).
 *
 */
public class NodeTest extends AbstractJCRTest {

    private Session superuserW2;

    /**
     * to be able to test the update(String) and getCorrespondingNodePath(String)
     * methods we need an additional workspace
     */
    public void setUp() throws Exception {
        super.setUp();

        // login to second workspace
        superuserW2 = getHelper().getSuperuserSession(workspaceName);
    }

    /**
     * remove all nodes in second workspace and log out
     */
    public void tearDown() throws Exception {
        try {
            cleanUpTestRoot(superuserW2);
        } catch (RepositoryException e) {
            log.println("Exception in tearDown: " + e.toString());
        } finally {
            // log out
            superuserW2.logout();
            superuserW2 = null;
        }

        super.tearDown();
    }


    /**
     * Calls {@link javax.jcr.Node#getCorrespondingNodePath(String )} with a non
     * existing workspace.
     * 

* This should throw an {@link javax.jcr.NoSuchWorkspaceException }. */ public void testGetCorrespondingNodePathNoSuchWorkspaceException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create testNode in default workspace Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save changes superuser.save(); try { defaultTestNode.getCorrespondingNodePath(getNonExistingWorkspaceName(superuser)); fail("Calling Node.getCorrespondingNodePath(workspace) with invalid workspace should throw NoSuchWorkspaceException"); } catch (NoSuchWorkspaceException e) { // ok, works as expected } } /** * Calls {@link javax.jcr.Node#getCorrespondingNodePath(String)} on a node * that has no corresponding node in second workspace */ public void testGetCorrespondingNodePathItemNotFoundException() throws RepositoryException, NotExecutableException { // make sure the repository supports multiple workspaces super.ensureMultipleWorkspacesSupported(); // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create testNode in default workspace Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save changes superuser.save(); try { // call the update method on test node in default workspace defaultTestNode.getCorrespondingNodePath(workspaceName); fail("Calling Node.getCorrespondingNodePath() on node that has no correspondend node should throw ItemNotFoundException"); } catch (ItemNotFoundException e) { // ok, works as expected } } /** * Creates a node with same path in both workspaces to check if {@link * javax.jcr.Node#getCorrespondingNodePath(String)} works properly. */ public void testGetCorrespondingNodePath() throws RepositoryException, NotExecutableException { // make sure the repository supports multiple workspaces super.ensureMultipleWorkspacesSupported(); // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create test node in default workspace Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save changes superuser.save(); // get the root node in the second workspace Node rootNodeW2 = (Node) superuserW2.getItem(testRootNode.getPath()); // create test node in second workspace rootNodeW2.addNode(nodeName1, testNodeType); // save changes superuserW2.save(); // call the update method on test node in default workspace defaultTestNode.getCorrespondingNodePath(workspaceName); // ok, works as expected } /** * Tries calling {@link javax.jcr.Node#update(String)} after node has * changed in first workspace but not been saved yet. *

* This should throw an {@link javax.jcr.InvalidItemStateException}. *

* Prerequisites:

  • javax.jcr.tck.propertyname1 name of * a String property that can be modified in javax.jcr.tck.nodetype * for testing
*/ public void testUpdateInvalidItemStateException() throws RepositoryException, NotExecutableException { // make sure the repository supports multiple workspaces super.ensureMultipleWorkspacesSupported(); // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a test node in default workspace Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save changes superuser.save(); // get the root node in the second workspace Node rootNodeW2 = (Node) superuserW2.getItem(testRootNode.getPath()); // create test node in second workspace rootNodeW2.addNode(nodeName1); // save changes superuserW2.save(); // modify the node testNode.setProperty(propertyName1, "test"); try { // try calling update testNode.update(workspaceName); fail("Calling Node.update() on modified node should throw InvalidItemStateException"); } catch (InvalidItemStateException e) { // ok, works as expected } } /** * Tries to use {@link javax.jcr.Node#update(String)} with an invalid * workspace. *

* This should throw an {@link javax.jcr.NoSuchWorkspaceException}. */ public void testUpdateNoSuchWorkspaceException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a test node in default workspace Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save changes superuser.save(); try { testNode.update(getNonExistingWorkspaceName(superuser)); fail("Calling Node.update() on a non existing workspace should throw NoSuchWorkspaceException"); } catch (NoSuchWorkspaceException e) { // ok, works as expected } } /** * Calls {@link javax.jcr.Node#update(String)} for a node that only exists * in current workspace.

In that case nothing should happen. *

* Prerequisites:

  • javax.jcr.tck.propertyname1 * name of a String property that can be modified in * javax.jcr.tck.nodetype for testing
*/ public void testUpdateNoClone() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a test node in default workspace Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // modify the node testNode.setProperty(propertyName1, "test"); superuser.save(); // call the update method on test node in default workspace testNode.update(workspaceName); // check if property is still there assertTrue("Node got property removed after Node.update() eventhough node has no clone", testNode.hasProperty(propertyName1)); // check if node did not get children suddenly assertFalse("Node has children assigned after Node.update() eventhough node has no clone", testNode.hasNodes()); } /** * Checks if {@link javax.jcr.Node#update(String)} works properly by * creating the same node in two workspaces one with a child node the other * with a property set. *

* Calling update() on the node * with properties, should remove the properties and add the child node. *

* Prerequisites:

  • javax.jcr.tck.nodetype * must allow children of same nodetype.
  • javax.jcr.tck.propertyname1 * name of a String property that can be modified in * javax.jcr.tck.nodetype for testing
*/ public void testUpdate() throws RepositoryException, NotExecutableException { // make sure the repository supports multiple workspaces super.ensureMultipleWorkspacesSupported(); // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create test node in default workspace Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); defaultTestNode.setProperty(propertyName1, "test"); // save changes superuser.save(); // get the root node in the second workspace Node rootNodeW2 = (Node) superuserW2.getItem(testRootNode.getPath()); // create test node in second workspace Node testNodeW2 = rootNodeW2.addNode(nodeName1, testNodeType); // add a child node testNodeW2.addNode(nodeName2, testNodeType); // save changes superuserW2.save(); // call the update method on test node in default workspace defaultTestNode.update(workspaceName); // ok first check if node has no longer properties assertFalse("Node updated with Node.update() should have property removed", defaultTestNode.hasProperty(propertyName1)); // ok check if the child has been added assertTrue("Node updated with Node.update() should have received childrens", defaultTestNode.hasNode(nodeName2)); } /** * Tries to add a node using {@link javax.jcr.Node#addNode(String)} where * node type can not be determined by parent (nt:base is used * as parent nodetype). *

This should throw a {@link javax.jcr.nodetype.ConstraintViolationException}. */ public void testAddNodeConstraintViolationExceptionUndefinedNodeType() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); String nodetype = testNodeTypeNoChildren == null ? ntBase : testNodeTypeNoChildren; Node defaultTestNode = defaultRootNode.addNode(nodeName1, nodetype); try { defaultTestNode.addNode(nodeName2); fail("Adding a node with node.addNode(node) where nodetype can not be determined from parent should" + " throw ConstraintViolationException"); } catch (ConstraintViolationException e) { // ok, works as expected } } /** * Tries to add a node using {@link javax.jcr.Node#addNode(String)} as a * child of a property. *

* This should throw an {@link javax.jcr.nodetype.ConstraintViolationException}. *

* Prerequisites:

  • javax.jcr.tck.propertyname1 * name of a String property that can be set in javax.jcr.tck.nodetype * for testing
*/ public void testAddNodeConstraintViolationExceptionProperty() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // add a node Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // set a property defaultTestNode.setProperty(propertyName1, "test"); try { // try to add a node as a child of a property defaultTestNode.addNode(propertyName1 + "/" + nodeName2); fail("Adding a node as a child of a property should throw ConstraintViolationException"); } catch (ConstraintViolationException e) { // ok, works as expected } } /** * Tries to create a node using {@link javax.jcr.Node#addNode(String, * String)} at a location where there is already a node with same name and * the parent does not allow same name siblings. *

* This should throw an {@link javax.jcr.ItemExistsException}. *

* Prerequisites: *

  • javax.jcr.tck.NodeTest.testAddNodeItemExistsException.nodetype * node type that does not allow same name siblings and allows to add child * nodes of the same type.
*/ public void testAddNodeItemExistsException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // add a node Node defaultTestNode = defaultRootNode.addNode(nodeName2, testNodeType); // add a child defaultTestNode.addNode(nodeName3, testNodeType); // save the new node defaultRootNode.save(); try { // try to add a node with same name again defaultTestNode.addNode(nodeName3, testNodeType); defaultRootNode.save(); fail("Adding a node to a location where same name siblings are not allowed, but a node with same name" + " already exists should throw ItemExistsException "); } catch (ItemExistsException e) { //ok, works as expected } } /** * Tries to add a node using {@link javax.jcr.Node#addNode(String)} to a non * existing destination node. *

* This should throw an {@link javax.jcr.PathNotFoundException}. */ public void testAddNodePathNotFoundException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); try { // use invalid parent path defaultRootNode.addNode(nodeName1 + "/" + nodeName2); fail("Creating a node at a non existent destination should throw PathNotFoundException"); } catch (PathNotFoundException e) { // ok, works as expected } } /** * Adds a new node using {@link javax.jcr.Node#addNode(String)} with an * index for the new name. *

This should throw an {@link RepositoryException}. */ public void testAddNodeRepositoryExceptionRelPathIndex() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); try { // use invalid relPath defaultRootNode.addNode(nodeName1 + "[1]", testNodeType); fail("Creating a node with index as postfix for new name should throw RepositoryException"); } catch (RepositoryException e) { // ok, works as expected } } /** * Creates a new node using {@link Node#addNode(String)}, then tries to call * {@link javax.jcr.Node#save()} on the newly node. *

* This should throw an {@link RepositoryException}. */ public void testAddNodeRepositoryExceptionSaveOnNewNode() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // add a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); try { // try to call save on newly created node testNode.save(); fail("Calling Node.save() on a newly created node should throw RepositoryException"); } catch (RepositoryException e) { // ok, works as expected. } } /** * Creates a new node using {@link Node#addNode(String)} , saves using * {@link javax.jcr.Node#save()} on parent node. Uses a second session to * verify if the node has been saved. */ public void testAddNodeParentSave() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // add a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save new nodes defaultRootNode.save(); // use a different session to verify if the node is there Session session = getHelper().getReadOnlySession(); try { testNode = (Node) session.getItem(testNode.getPath()); } finally { session.logout(); } } /** * Creates a new node using {@link Node#addNode(String)} , saves using * {@link javax.jcr.Session#save()}. Uses a second session to verify if the * node has been saved. */ public void testAddNodeSessionSave() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // add a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save new nodes superuser.save(); // use a different session to verify if the node is there Session session = getHelper().getReadOnlySession(); try { testNode = (Node) session.getItem(testNode.getPath()); } finally { session.logout(); } } /** * Creates a node without its mandatory child node using {@link * Node#addNode(String, String)} and then saves. *

* This should throw a {@link ConstraintViolationException}. *

* Prerequisites:

    *
  • javax.jcr.tck.NodeTest.testAddNodeLackingMandatoryChildNode.nodetype2 * a node type that has a mandatory child node
  • *
*/ public void testAddNodeLackingMandatoryChildNode() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create the node without the mandatory child node definition defaultRootNode.addNode(nodeName2, getProperty("nodetype2")); try { // save changes superuser.save(); fail("Adding a node without its mandatory child node should throw a ConstraintViolationException"); } catch (ConstraintViolationException e) { // ok, works as expected } } /** * Creates a node with a mandatory child node using {@link * Node#addNode(String, String)}, saves on parent node then tries to delete * the mandatory child node. *

* This should throw a {@link ConstraintViolationException}. *

* Prerequisites:

    *
  • javax.jcr.tck.NodeTest.testRemoveMandatoryNode.nodetype2 * a node type that has a mandatory child node
  • javax.jcr.tck.NodeTest.testRemoveMandatoryNode.nodetype3 * nodetype of the mandatory child node
  • javax.jcr.tck.NodeTest.testRemoveMandatoryNode.nodename3 * name of the mandatory child node
*/ public void testRemoveMandatoryNode() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create the node with the mandatory child node definition Node defaultTestNode = defaultRootNode.addNode(nodeName2, getProperty("nodetype2")); // add the mandatory child node Node defaultTestNodeChild = defaultTestNode.addNode(nodeName3, getProperty("nodetype3")); // save changes defaultRootNode.save(); try { // try to remove the mandatory node defaultTestNodeChild.remove(); defaultTestNode.save(); fail("Removing a mandatory node should throw a ConstraintViolationException"); } catch (ConstraintViolationException e) { // ok, works as expected } } /** * Removes a node using {@link javax.jcr.Node#remove()} with session 1, * afterwards it tries the same with session 2. *

* This should throw an {@link InvalidItemStateException}. */ public void testRemoveInvalidItemStateException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create the node Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save the nodes superuser.save(); // get the node with session 2 Session testSession = getHelper().getReadWriteSession(); try { Node defaultTestNodeSession2 = (Node) testSession.getItem(defaultTestNode.getPath()); // remove node with session 1 defaultTestNode.remove(); superuser.save(); // try to remove already deleted node with session 2 try { defaultTestNodeSession2.remove(); testSession.save(); fail("Removing a node already deleted by other session should throw an InvalidItemStateException!"); } catch (InvalidItemStateException e) { //ok, works as expected } } finally { testSession.logout(); } } /** * Removes a node using {@link javax.jcr.Node#remove()}, then saves with * parent's nodes {@link javax.jcr.Node#save()} method. */ public void testRemoveNodeParentSave() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create the node Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save the nodes defaultRootNode.save(); // remove them defaultTestNode.remove(); defaultRootNode.save(); // check if the node has been properly removed try { defaultRootNode.getNode(nodeName1); fail("Permanently removed node should no longer be adressable using Parent Node's getNode() method"); } catch (PathNotFoundException e) { // ok, works as expected } } /** * Removes a node using {@link javax.jcr.Node#remove()}, then saves using * {@link javax.jcr.Session#save()} method. */ public void testRemoveNodeSessionSave() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create the node Node defaultTestNode = defaultRootNode.addNode(nodeName1, testNodeType); // save the nodes superuser.save(); // remove them defaultTestNode.remove(); superuser.save(); // check if the node has been properly removed try { superuser.getItem(defaultRootNode.getPath() + "/" + nodeName1); fail("Permanently removed node should no longer be adressable using Session.getItem()"); } catch (PathNotFoundException e) { // ok, works as expected } } /** * Tests if Node.remove() does not throw a * LockException if Node is locked. *

* The test creates a node nodeName1 of type * testNodeType under testRoot and locks the node * with the superuser session. Then the test removes * nodeName1. */ public void testRemoveNodeLockedItself() throws LockException, NotExecutableException, RepositoryException { if (!isSupported(Repository.OPTION_LOCKING_SUPPORTED)) { throw new NotExecutableException("Locking is not supported."); } // create a node that is lockable Node node = testRootNode.addNode(nodeName1, testNodeType); // or try to make it lockable if it is not ensureMixinType(node, mixLockable); testRootNode.getSession().save(); // remove first slash of path to get rel path to root String pathRelToRoot = node.getPath().substring(1); // access node through another session to lock it Session session2 = getHelper().getSuperuserSession(); try { Node node2 = session2.getRootNode().getNode(pathRelToRoot); node2.lock(true, true); // test fails if a LockException is thrown when removing the node // (remove must be possible since the parent is not locked) node.remove(); } finally { session2.logout(); } } /** * Tests if Node.remove() throws a LockException * if the parent node of Node is locked. *

* The test creates a node nodeName1 of type * testNodeType under testRoot, adds a child node * nodeName2 and locks it with the superuser session. Then the * test tries to remove the nodeName2. */ public void testRemoveNodeParentLocked() throws LockException, NotExecutableException, RepositoryException { Session session = testRootNode.getSession(); if (!isSupported(Repository.OPTION_LOCKING_SUPPORTED)) { throw new NotExecutableException("Locking is not supported."); } // create a node that is lockable Node node = testRootNode.addNode(nodeName1, testNodeType); // or try to make it lockable if it is not ensureMixinType(node, mixLockable); // create a child node Node subNode = node.addNode(nodeName2, testNodeType); testRootNode.getSession().save(); // lock the node // remove first slash of path to get rel path to root String pathRelToRoot = node.getPath().substring(1); // access node through another session to lock it Session session2 = getHelper().getSuperuserSession(); try { Node node2 = session2.getRootNode().getNode(pathRelToRoot); node2.lock(true, true); try { subNode.remove(); session.save(); fail("Removal of a Node must throw a LockException upon remove() " + "or upon save() if the parent of the node is locked"); } catch (LockException e) { // success } // unlock to remove node at tearDown() node2.unlock(); } finally { session2.logout(); } } /** * Tests object identity, meaning two nodes objects acquired through the * same session must have the same properties and states. *

* Prerequisites:

  • javax.jcr.tck.nodetype must allow * children of same node type
  • javax.jcr.tck.propertyname1 * name of a String property that can be set in javax.jcr.tck.nodetype * for testing
*/ public void testNodeIdentity() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode1 = defaultRootNode.addNode(nodeName1, testNodeType); // add a child node testNode1.addNode(nodeName1, testNodeType); // add a property testNode1.setProperty(propertyName1, "test"); // save the new node defaultRootNode.save(); // acquire the same node with session 2 Node testNode2 = (Node) superuser.getItem(testNode1.getPath()); // check if they have the same property assertTrue("Two references of same node have different properties", testNode1.getProperty(propertyName1).isSame(testNode2.getProperty(propertyName1))); // check if they have the same child assertTrue("Two references of same node have different children", testNode1.getNode(nodeName1).isSame(testNode2.getNode(nodeName1))); // check state methods assertEquals("Two references of same node have different State for Node.isCheckedOut()", testNode1.isCheckedOut(), testNode2.isCheckedOut()); assertEquals("Two references of same node have different State for Node.isLocked()", testNode1.isLocked(), testNode2.isLocked()); assertEquals("Two references of same node have different State for Node.isModified()", testNode1.isModified(), testNode2.isModified()); assertEquals("Two references of same node have different State for Node.isNew()", testNode1.isNew(), testNode2.isNew()); assertEquals("Two references of same node have different State for Node.isNode()", testNode1.isNode(), testNode2.isNode()); assertEquals("Two references of same node have different State for Node.isNodeType()", testNode1.isNodeType(testNodeType), testNode2.isNodeType(testNodeType)); assertTrue("Two references of same node should return true for Node1.isSame(Node2)", testNode1.isSame(testNode2)); assertEquals("Two references of same node have different Definitions", testNode1.getDefinition().getName(), testNode2.getDefinition().getName()); } /** * Tests if Item.isSame(Item otherItem) will return true when * two Node objects representing the same actual repository * item have been retrieved through two different sessions and one has been * modified. */ public void testIsSameMustNotCompareStates() throws RepositoryException { // create a node and save it Node testNode1 = testRootNode.addNode(nodeName1, testNodeType); testRootNode.getSession().save(); // acquire the same node with a different session Session session = getHelper().getReadOnlySession(); try { Node testNode2 = (Node) session.getItem(testNode1.getPath()); // add a property and do not save it so property is different in testNode2 testNode1.setProperty(propertyName1, "value1"); assertTrue("Two references of same node should return true for Node1.isSame(Node2)", testNode1.isSame(testNode2)); } finally { session.logout(); } } /** * Checks if {@link Node#isModified()} works correctly for unmodified and * modified nodes. */ public void testIsModified() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); defaultRootNode.save(); assertFalse("Unmodified node should return false on Node.isModified()", testNode.isModified()); // check if modified properties are recognized testNode.setProperty(propertyName1, "test"); assertTrue("Modified node should return true on Node.isModified()", testNode.isModified()); defaultRootNode.save(); // check if modified child nodes are recognized testNode.addNode(nodeName2, testNodeType); assertTrue("Modified node should return true on Node.isModified()", testNode.isModified()); } /** * Checks if {@link Node#isNew()} works correctly for new and existing, * unmodified nodes. */ public void testIsNew() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); assertTrue("Newly created node should return true on newNode.isNew()", testNode.isNew()); defaultRootNode.save(); assertFalse("Unmodified, exisiting node should return false on newNode.isNew()", testNode.isNew()); } /** * Tries to call {@link Node#refresh(boolean)} on a deleted node. *

* This should throw an {@link InvalidItemStateException}. */ public void testRefreshInvalidItemStateException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save the new node defaultRootNode.save(); // remove the node defaultRootNode.remove(); try { testNode.refresh(true); fail("Calling Node.refresh() on deleted node should throw InvalidItemStateException!"); } catch (InvalidItemStateException e) { // ok, works as expected } } /** * Checks if {@link javax.jcr.Node#refresh(boolean refresh)} works properly * with refresh set to false. *

* Procedure:

  • Creates two nodes with session 1
  • Modifies * node 1 with session 1 by adding a child node
  • Get node 2 with * session 2
  • Modifies node 2 with session 2 by adding a child * node
  • saves session 2 changes using {@link * javax.jcr.Node#save()}
  • calls Node.refresh(false) * on root node in session 1
Session 1 changes should be cleared * and session 2 changes should now be visible to session 1. *

* Prerequisites:

  • javax.jcr.tck.nodetype * must accept children of same nodetype
*/ public void testRefreshBooleanFalse() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode1Session1 = defaultRootNode.addNode(nodeName1, testNodeType); // create a second node Node testNode2Session1 = defaultRootNode.addNode(nodeName2, testNodeType); // save the new nodes defaultRootNode.save(); // add child node to test node 1 using session 1 testNode1Session1.addNode(nodeName2, testNodeType); // get session 2 Session session2 = getHelper().getReadWriteSession(); try { // get the second node Node testNode2Session2 = (Node) session2.getItem(testNode2Session1.getPath()); // adds a child node testNode2Session2.addNode(nodeName3, testNodeType); // save the changes session2.save(); // call refresh on session 1 defaultRootNode.refresh(false); // check if session 1 flag has been cleared assertFalse("Session should have no pending changes recorded after Node.refresh(false)!", superuser.hasPendingChanges()); // check if added child node for node 1 by session 1 has been removed assertFalse("Node Modifications have not been flushed after Node.refresh(false)", testNode1Session1.hasNodes()); // check if added child node for node 2 by session 2 has become visible in session 1 assertTrue("Node modified by a different session has not been updated after Node.refresh(false)", testNode2Session1.hasNodes()); } finally { session2.logout(); } } /** * Checks if {@link javax.jcr.Node#refresh(boolean refresh)} works properly * with refresh set to true. *

* Procedure:

  • Creates two nodes with session 1
  • Modifies * node 1 with session 1 by adding a child node
  • Get node 2 with * session 2
  • Modifies node 2 with session 2 by adding a child * node
  • saves session 2 changes using {@link * javax.jcr.Node#save()}
  • calls Node.refresh(true) on * root node in session 1
Session 1 changes and session 2 * changes now be visible to session 1. *

* Prerequisites:

    *
  • javax.jcr.tck.nodetype must accept children of same * nodetype
*/ public void testRefreshBooleanTrue() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode1Session1 = defaultRootNode.addNode(nodeName1, testNodeType); // create a second node Node testNode2Session1 = defaultRootNode.addNode(nodeName2, testNodeType); // save the new nodes defaultRootNode.save(); // add child node to test node 1 using session 1 testNode1Session1.addNode(nodeName2, testNodeType); // get session 2 Session session2 = getHelper().getReadWriteSession(); try { // get the second node Node testNode2Session2 = (Node) session2.getItem(testNode2Session1.getPath()); // adds a child node testNode2Session2.addNode(nodeName3, testNodeType); // save the changes session2.save(); // call refresh on session 1 defaultRootNode.refresh(true); // check if session 1 flag has been cleared assertTrue("Session should still have pending changes recorded after Node.refresh(true)!", superuser.hasPendingChanges()); // check if added child node for node 1 by session 1 is still there assertTrue("Node Modifications are lost after Node.refresh(true)", testNode1Session1.hasNodes()); // check if added child node for node 2 by session 2 has become visible in session 1 assertTrue("Node modified by a different session has not been updated after Node.refresh(true)", testNode2Session1.hasNodes()); } finally { session2.logout(); } } /** * Tries to save a node using {@link javax.jcr.Node#save()} that was already * deleted by an other session. *

* Procedure:

  • Creates a new * node with session 1, saves it, adds a child node.
  • Access new * node with session 2,deletes the node, saves it.
  • Session 1 tries * to save modifications using Node.save() on root node .
  • *
This should throw an {@link javax.jcr.InvalidItemStateException}. *

* Prerequisites:

  • javax.jcr.tck.nodetype * must accept children of same nodetype
*/ public void testSaveInvalidStateException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node nodeSession1 = defaultRootNode.addNode(nodeName1, testNodeType); // save new node superuser.save(); // make a modification nodeSession1.addNode(nodeName2, testNodeType); // get the new node with a different session Session testSession = getHelper().getReadWriteSession(); try { Node nodeSession2 = (Node) testSession.getItem(nodeSession1.getPath()); // delete the node with the new session nodeSession2.remove(); // make node removal persistent testSession.save(); // save changes made wit superuser session try { defaultRootNode.save(); fail("Saving a modified Node using Node.save() already deleted by an other session should throw InvalidItemStateException"); } catch (InvalidItemStateException e) { // ok, works as expected } } finally { testSession.logout(); } } /** * Tries to create and save a node using {@link javax.jcr.Node#save()} with * an mandatory property that is not set on saving time. *

* Prerequisites:

  • javax.jcr.tck.Node.testSaveConstraintViolationException.nodetype2 * must reference a nodetype that has at least one property that is * mandatory but not autocreated
*/ public void testSaveConstraintViolationException() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node with at least one mandatory, not autocreated property defaultRootNode.addNode(nodeName1, this.getProperty("nodetype2")); // save changes try { superuser.save(); fail("Trying to use parent Node.save() with a node that has a mandatory property not set, should throw ConstraintViolationException"); } catch (ConstraintViolationException e) { // ok } } /** * Creates a new node, saves it uses second session to verify if node has * been added. */ public void testNodeSave() throws RepositoryException { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); // save new node defaultRootNode.save(); // get the new node with a different session Session testSession = getHelper().getReadOnlySession(); try { testSession.getItem(testNode.getPath()); } finally { testSession.logout(); } } /** * Tests if a {@link javax.jcr.RepositoryException} is thrown when calling * Node.save() on a newly added node */ public void testSaveOnNewNodeRepositoryException() throws Exception { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); // create a node Node newNode = defaultRootNode.addNode(nodeName1, testNodeType); try { newNode.save(); fail("Calling Node.save() on a newly added node should throw a RepositoryException"); } catch (RepositoryException success) { // ok } } /** * Tests if the primary node type is properly stored in jcr:primaryType */ public void testPrimaryType() throws Exception { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); assertEquals("The primary node type is not properly stored in jcr:primaryType",testNodeType,testNode.getProperty(jcrPrimaryType).getString()); } /** * Tests if jcr:primaryType is protected */ public void testPrimaryTypeProtected() throws Exception { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); try { testNode.setProperty(jcrPrimaryType,ntBase); fail("Manually setting jcr:primaryType should throw a ConstraintViolationException"); } catch (ConstraintViolationException success) { // ok } } /** * Tests if jcr:mixinTypes is protected */ public void testMixinTypesProtected() throws Exception { // get default workspace test root node using superuser session Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath()); Node testNode = defaultRootNode.addNode(nodeName1, testNodeType); Value mixinName = superuser.getValueFactory().createValue(mixLockable, PropertyType.NAME); try { testNode.setProperty(jcrMixinTypes, new Value[]{mixinName}); fail("Manually setting jcr:mixinTypes should throw a ConstraintViolationException"); } catch (ConstraintViolationException success) { // ok } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy