/*
* Copyright (C) 2011 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.ext.hierarchy;
import org.exoplatform.services.jcr.core.ExtendedNode;
import org.exoplatform.services.jcr.ext.BaseStandaloneTest;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.impl.NewGroupListener;
import org.exoplatform.services.jcr.ext.hierarchy.impl.NewUserListener;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.impl.GroupImpl;
import org.exoplatform.services.organization.impl.UserImpl;
import org.exoplatform.services.security.ConversationState;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Session;
/**
* @author <a href="mailto:nicolas.filotto@exoplatform.com">Nicolas Filotto</a>
* @version $Id$
*
*/
public class TestNodeHierarchyCreator extends BaseStandaloneTest
{
private NodeHierarchyCreator creator;
private SessionProvider sessionProvider;
private NewUserListener userListener;
private NewGroupListener groupListener;
private Session session;
/**
* @see org.exoplatform.services.jcr.ext.BaseStandaloneTest#setUp()
*/
@Override
public void setUp() throws Exception
{
super.setUp();
creator = (NodeHierarchyCreator)container.getComponentInstanceOfType(NodeHierarchyCreator.class);
userListener = (NewUserListener)container.getComponentInstanceOfType(NewUserListener.class);
groupListener = (NewGroupListener)container.getComponentInstanceOfType(NewGroupListener.class);
sessionProvider = new SessionProvider(ConversationState.getCurrent());
session = sessionProvider.getSession("ws1", repository);
}
/**
* @see org.exoplatform.services.jcr.ext.BaseStandaloneTest#tearDown()
*/
@Override
protected void tearDown() throws Exception
{
creator = null;
userListener = null;
groupListener = null;
if (session != null)
{
session.logout();
session = null;
}
if (sessionProvider != null)
{
sessionProvider.close();
sessionProvider = null;
}
super.tearDown();
}
public void testGetJcrPath() throws Exception
{
assertEquals("/exo:applications", creator.getJcrPath("eXoApplications"));
assertEquals("/exo:services", creator.getJcrPath("eXoServices"));
assertEquals("/Users", creator.getJcrPath("usersPath"));
assertEquals("/Groups/Path/Home", creator.getJcrPath("groupsPath"));
}
public void testInit() throws Exception
{
Node node = (Node)session.getItem("/exo:services");
assertNotNull(node);
assertTrue(node.isNodeType("nt:folder"));
assertTrue(node.canAddMixin("mix:referenceable"));
assertTrue(node.canAddMixin("exo:privilegeable"));
node = (Node)session.getItem("/exo:applications");
assertNotNull(node);
assertFalse(node.isNodeType("nt:folder"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertTrue(node.canAddMixin("exo:privilegeable"));
node = (Node)session.getItem("/Users");
assertNotNull(node);
assertFalse(node.isNodeType("nt:folder"));
assertTrue(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
node = (Node)session.getItem("/Groups/Path/Home");
assertNotNull(node);
assertTrue(node.isNodeType("nt:unstructured"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
assertTrue(node.getParent().isNodeType("nt:unstructured"));
assertFalse(node.getParent().canAddMixin("mix:referenceable"));
assertFalse(node.getParent().canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node.getParent()).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node.getParent()).getACL().getPermissions("*:/platform/administrators"));
assertTrue(node.getParent().getParent().isNodeType("nt:unstructured"));
assertFalse(node.getParent().getParent().canAddMixin("mix:referenceable"));
assertFalse(node.getParent().getParent().canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node.getParent().getParent()).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node.getParent().getParent()).getACL().getPermissions("*:/platform/administrators"));
}
public void testGetUserNode() throws Exception
{
Node node = creator.getUserNode(sessionProvider, "foo");
assertNotNull(node);
assertTrue(node.getPath().startsWith("/Users"));
}
public void testGetUserApplicationNode() throws Exception
{
User user = new UserImpl("foo");
userListener.preSave(user, true);
Node node = creator.getUserApplicationNode(sessionProvider, "foo");
assertNotNull(node);
assertTrue(node.isNodeType("nt:folder"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
Node parentNode = creator.getUserNode(sessionProvider, "foo");
assertNotNull(parentNode);
assertTrue(node.getPath().startsWith(parentNode.getPath()));
assertNotNull(session.getItem(node.getPath()));
userListener.preDelete(user);
try
{
session.getItem(node.getPath());
fail("A PathNotFoundException is expected");
}
catch (PathNotFoundException e)
{
// ignore me
}
}
public void testGroupsNode() throws Exception
{
GroupImpl group1 = new GroupImpl("platform");
GroupImpl group2 = new GroupImpl();
group2.setId("/platform/users");
GroupImpl group3 = new GroupImpl("my-group-name2");
group3.setParentId("/platform");
groupListener.preSave(group1, true);
Node node = (Node)session.getItem("/Groups/Path/Home/" + group1.getGroupName());
assertNotNull(node);
node = node.getNode("ApplicationData");
assertTrue(node.isNodeType("nt:folder"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
groupListener.preSave(group2, true);
node = (Node)session.getItem("/Groups/Path/Home" + group2.getId());
assertNotNull(node);
node = node.getNode("ApplicationData");
assertTrue(node.isNodeType("nt:folder"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
groupListener.preDelete(group2);
try
{
session.getItem("/Groups/Path/Home" + group2.getId());
fail("A PathNotFoundException is expected");
}
catch (PathNotFoundException e)
{
// ignore me
}
groupListener.preSave(group3, true);
node = (Node)session.getItem("/Groups/Path/Home" + group3.getParentId() + "/" + group3.getGroupName());
assertNotNull(node);
node = node.getNode("ApplicationData");
assertTrue(node.isNodeType("nt:folder"));
assertFalse(node.canAddMixin("mix:referenceable"));
assertFalse(node.canAddMixin("exo:privilegeable"));
assertTrue(((ExtendedNode)node).getACL().hasPermissions());
assertNotNull(((ExtendedNode)node).getACL().getPermissions("*:/platform/administrators"));
groupListener.preDelete(group3);
try
{
session.getItem("/Groups/Path/Home" + group3.getParentId() + "/" + group3.getGroupName());
fail("A PathNotFoundException is expected");
}
catch (PathNotFoundException e)
{
// ignore me
}
groupListener.preDelete(group1);
try
{
session.getItem("/Groups/Path/Home/" + group1.getGroupName());
fail("A PathNotFoundException is expected");
}
catch (PathNotFoundException e)
{
// ignore me
}
}
}