/*
* 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.impl.core.SessionImpl;
import java.util.Calendar;
import javax.jcr.ItemExistsException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a>
* @version $Id: TestAddNode.java 12651 2008-04-02 15:26:26Z ksm $
*/
public class TestAddNode extends JcrAPIBaseTest
{
public void initRepository() throws RepositoryException
{
Node root = session.getRootNode();
Node file = root.addNode("TestNodesTree", "nt:folder").addNode("childNode2", "nt:file");
Node contentNode = file.addNode("jcr:content", "nt:resource");
contentNode = file.getNode("jcr:content");
contentNode.setProperty("jcr:data", session.getValueFactory().createValue("this is the content",
PropertyType.BINARY));
contentNode.setProperty("jcr:mimeType", session.getValueFactory().createValue("text/html"));
contentNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance()));
session.save();
}
public void tearDown() throws Exception
{
session = (SessionImpl)repository.login(credentials, WORKSPACE);
Node root = session.getRootNode();
Node node = root.getNode("TestNodesTree");
node.remove();
root.save();
// node.save();ipossible to call save() on removed node
super.tearDown();
}
/**
* Test case-sensitive names
*/
public void testAddNodeCSNames() throws RepositoryException
{
try
{
Node localRoot = root.addNode("testCI", "nt:folder");
root.save();
localRoot.addNode("test", "nt:folder");
localRoot.addNode("Test", "nt:folder");
root.save();
}
catch (ItemExistsException e)
{
fail("Repository must be case-sensitive!");
}
}
public void testAddNode() throws RepositoryException
{
Node root = session.getRootNode();
// If relPath implies intermediary nodes that do not exist,
// then a PathNotFoundException is thrown.
try
{
root.addNode("notExisting/dummy");
fail("exception should have been thrown");
}
catch (PathNotFoundException e)
{
}
// If an item already exists at relPath, and same-name
// siblings are not permitted, then an ItemExistsException
// is thrown immediately (not on save).
try
{
root.getNode("TestNodesTree").addNode("childNode2", "nt:file");
fail("exception should have been thrown");
}
catch (ItemExistsException e)
{
}
try
{
root.addNode("TestNodesTree/childNode2/jcr:primaryType/test");
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
// undefined nodetype
Node node = root.getNode("TestNodesTree/childNode2");
try
{
node.addNode("notJcrContentNode");
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
Node testNode = root.addNode("testNode", "exo:EXOJCR-1869");
try
{
testNode.addNode("node1", "exo:EXOJCR-1869-2");
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
testNode.addMixin("mix:EXOJCR-1869-1");
try
{
testNode.addNode("A1", "exo:EXOJCR-1869-3");
}
catch (ConstraintViolationException e)
{
fail("exception should not thrown");
}
try
{
testNode.addNode("A2", "exo:EXOJCR-1869-3");
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
testNode.addMixin("mix:EXOJCR-1869-2");
try
{
testNode.addNode("A2", "exo:EXOJCR-1869-4");
}
catch (ConstraintViolationException e)
{
fail("exception should not thrown");
}
try
{
testNode.addNode("A1", "exo:EXOJCR-1869-4");
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
}
public void testAddAndSaveNodeWithNodeType() throws RepositoryException
{
Node root = session.getRootNode();
Node node = root.getNode("TestNodesTree/childNode2");
try
{
node.addNode("dummy", "nt:base");
session.save();
fail("exception should have been thrown");
}
catch (ConstraintViolationException e)
{
}
session = (SessionImpl)repository.login(credentials, WORKSPACE);
root = session.getRootNode();
node = root.getNode("TestNodesTree");
try
{
node.addNode("dummy1", "nt:dymyNT");
fail("exception should have been thrown");
}
catch (NoSuchNodeTypeException e)
{
}
}
public void testIfAddedNodeAppearsInGetNodesImmediatelly() throws RepositoryException
{
Node root = session.getRootNode();
Node root1 = root.addNode("root1", "nt:unstructured");
assertEquals(0, root1.getNodes().getSize());
root1.addNode("node1", "nt:unstructured");
assertEquals(1, root1.getNodes().getSize());
assertTrue(root1.hasNode("node1"));
assertNotNull(root1.getNode("node1"));
}
public void testAddingSameNameSibs() throws RepositoryException
{
// the same node already exists but same name sibs
Node subRoot = root.addNode("subRoot", "nt:unstructured");
subRoot = root.addNode("subRoot", "nt:unstructured");
Node node1 = subRoot.addNode("TestNodesTree", "nt:unstructured");
Node node2 = subRoot.addNode("TestNodesTree", "nt:unstructured");
assertNotNull(node1);
NodeIterator nodes = subRoot.getNodes();
assertEquals(2, (int)nodes.getSize());
try
{
subRoot.addNode("TestNodesTree[3]", "nt:unstructured");
fail("exception should have been thrown");
}
catch (RepositoryException e)
{
}
}
public void testInvalidItemStateException() throws RepositoryException
{
Node n = session.getRootNode().addNode("sameNode", "nt:base");
Session session2 = repository.login(credentials, "ws");
Node n2 = session2.getRootNode().addNode("sameNode", "nt:base");
session.save();
try
{
session2.save();
fail("InvalidItemStateException should have been thrown");
}
catch (ItemExistsException e)
{
}
}
public void testAddingNodeToDiffWorkspaces() throws RepositoryException
{
String[] wsNames = repository.getWorkspaceNames();
if (wsNames.length < 2)
{
fail("Too few number of ws for test should be > 1");
}
log.debug(">>>>>>>> " + wsNames.length);
for (int i = 0; i < wsNames.length; i++)
{
log.debug(">>>>>>>> " + wsNames[i]);
}
// Session s1 = repository.login(credentials, wsNames[0]);
Session s1 = repository.getSystemSession(wsNames[0]);
s1.getRootNode().addNode("test1", "nt:unstructured");
s1.save();
s1 = repository.login(credentials, wsNames[0]);
log.debug("S1 >>>>" + wsNames[0] + " : " + s1.getItem("/test1"));
log.debug("S1 >>>>" + wsNames[0] + " : " + s1 + " " + s1.getWorkspace().getName());
// Session s2 = repository.getSystemSession(wsNames[1]);
// s2.getRootNode().addNode("test2", "nt:unstructured");
// s2.save();
// s2 = repository.login(credentials, wsNames[1]);
// log.debug("S2 "+wsNames[1]+" : "+s2.getItem("/test2"));
// log.debug("S2 >>>>"+wsNames[1]+" : "+s2+" "+s2.getWorkspace().getName());
}
public void testDeleteAndAddNode() throws RepositoryException
{
log.debug(">>> start getRoot");
Node root = session.getRootNode();
log.debug(">>> start remove");
root.getNode("TestNodesTree").remove();
log.debug(">>> end remove");
root.addNode("TestNodesTree");
log.debug(">>> end add");
root.save();
log.debug(">>> end save");
log.debug(">>> " + root.getNode("TestNodesTree"));
}
public void testAddSns() throws Exception
{
Node testNode = root.addNode("testNode");
session.save();
testNode.addNode("folder");
session.save();
testNode.addNode("folder");
assertEquals(2, testNode.getNodes().getSize());
session.save();
testNode.remove();
session.save();
testNode = root.addNode("testNode");
session.save();
Node folder = testNode.addNode("folder", "nt:folder");
session.save();
assertEquals(1, testNode.getNodes().getSize());
testNode.addNode("folder");
session.save();
assertEquals(2, testNode.getNodes().getSize());
testNode.addNode("folder", "nt:folder");
session.save();
testNode.remove();
session.save();
}
public void testCheckMandatoryField() throws Exception
{
root.addNode("testCheckMandatoryField", "exo:JCR_2307");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory property 'exo:mandatoryfield' has not been set");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
Node parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
// Add a child node with a random name
parent.addNode("foo", "nt:unstructured");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory property 'exo:mandatoryfield' has not been set");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
// Add a child node with the same name as mandatory field
parent.addNode("exo:mandatoryfield", "nt:unstructured");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory property 'exo:mandatoryfield' has not been set");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
parent.setProperty("exo:mandatoryfield", "foo");
session.save();
parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
parent.setProperty("exo:mandatoryfield", "foo");
// Add a child node with a random name
parent.addNode("foo", "nt:unstructured");
session.save();
parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
parent.setProperty("exo:mandatoryfield", "foo");
// Add a child node with the same name as mandatory field
parent.addNode("exo:mandatoryfield", "nt:unstructured");
session.save();
//Make sure that it can still fail after some successes
parent = root.addNode("testCheckMandatoryField", "exo:JCR_2307");
// Add a child node with the same name as mandatory field
parent.addNode("exo:mandatoryfield", "nt:unstructured");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory property 'exo:mandatoryfield' has not been set");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
}
public void testCheckMandatoryNode() throws Exception
{
root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory node 'exo:mandatorySubNode' has not been added");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
Node parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
// Set a property with a random name
parent.setProperty("foo", "bar");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory node 'exo:mandatorySubNode' has not been added");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
// Add a property with the same name as mandatory node
parent.setProperty("exo:mandatorySubNode", "bar");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory node 'exo:mandatorySubNode' has not been added");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
parent.addNode("exo:mandatorySubNode");
session.save();
parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
parent.addNode("exo:mandatorySubNode");
// Add a property with a random name
parent.setProperty("foo", "bar");
session.save();
parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
parent.addNode("exo:mandatorySubNode", "nt:unstructured");
// Add a property with the same name as mandatory node
parent.setProperty("exo:mandatorySubNode", "foo");
session.save();
//Make sure that it can still fail after some successes
parent = root.addNode("testCheckMandatoryNode", "exo:JCR_2307_2");
// Add a property with the same name as mandatory node
parent.setProperty("exo:mandatorySubNode", "bar");
try
{
session.save();
fail("A ConstraintViolationException is expected as the mandatory node 'exo:mandatorySubNode' has not been added");
}
catch (ConstraintViolationException e)
{
// expected exception
}
session.refresh(false);
}
}