/**
* Copyright (C) 2010 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.xcmis.wssoap;
import org.apache.cxf.endpoint.Server;
import org.xcmis.core.CmisAccessControlEntryType;
import org.xcmis.core.CmisAccessControlListType;
import org.xcmis.core.CmisAccessControlPrincipalType;
import org.xcmis.core.EnumACLPropagation;
import org.xcmis.core.EnumBasicPermissions;
import org.xcmis.messaging.CmisACLType;
import org.xcmis.messaging.CmisExtensionType;
import org.xcmis.soap.ACLServicePort;
import org.xcmis.spi.model.AccessControlPropagation;
import org.xcmis.wssoap.impl.ACLServicePortImpl;
import org.xcmis.wssoap.impl.TypeConverter;
import java.util.ArrayList;
import java.util.List;
public class ACLServiceTest extends BaseTest
{
private ACLServicePort port;
/**
* Service name.
*/
private final static String SERVICE_NAME = "ACLService";
/**
* Address.
*/
private final static String SERVICE_ADDRESS = "http://localhost:8081/" + SERVICE_NAME;
/**
* Server.
*/
private Server server;
public void setUp() throws Exception
{
super.setUp();
server = complexDeployService(SERVICE_ADDRESS, new ACLServicePortImpl(), interceptors, null, true);
port = getAccessControlService(SERVICE_ADDRESS);
assertNotNull(server);
assertNotNull(port);
}
public void testApplyACL() throws Exception
{
assertNotNull(port);
String docId = createDocument(testFolderId, "doc");
CmisAccessControlListType addACL = new CmisAccessControlListType();
CmisAccessControlListType removeACL = new CmisAccessControlListType();
CmisAccessControlEntryType entry1 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal1 = new CmisAccessControlPrincipalType();
principal1.setPrincipalId("Makis");
entry1.setPrincipal(principal1);
entry1.getPermission().add(EnumBasicPermissions.CMIS_WRITE.value());
CmisAccessControlEntryType entry2 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal2 = new CmisAccessControlPrincipalType();
principal2.setPrincipalId("root");
entry2.setPrincipal(principal2);
entry2.getPermission().add(EnumBasicPermissions.CMIS_READ.value());
entry2.getPermission().add(EnumBasicPermissions.CMIS_WRITE.value());
addACL.getPermission().add(entry1);
addACL.getPermission().add(entry2);
CmisAccessControlEntryType entry3 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal3 = new CmisAccessControlPrincipalType();
principal3.setPrincipalId("any");
entry3.setPrincipal(principal3);
entry3.getPermission().add(EnumBasicPermissions.CMIS_ALL.value());
removeACL.getPermission().add(entry3);
port.applyACL(repositoryId, //
docId, //
addACL, //
removeACL, //
EnumACLPropagation.REPOSITORYDETERMINED, //
new CmisExtensionType());
CmisAccessControlListType acl = TypeConverter.getCmisAccessControlListType(conn.getACL(docId, true));
assertNotNull(acl.getPermission());
for (CmisAccessControlEntryType ace : acl.getPermission())
{
if ("Makis".equals(ace.getPrincipal().getPrincipalId()))
{
assertEquals(1, ace.getPermission().size());
assertEquals(EnumBasicPermissions.CMIS_WRITE.value(), ace.getPermission().get(0));
}
else if ("root".equals(ace.getPrincipal().getPrincipalId()))
{
if (1 == ace.getPermission().size())
{
assertEquals(EnumBasicPermissions.CMIS_ALL.value(), ace.getPermission().get(0));
}
else if (2 == ace.getPermission().size())
{
List<String> expected = new ArrayList<String>();
expected.add(EnumBasicPermissions.CMIS_READ.value());
expected.add(EnumBasicPermissions.CMIS_WRITE.value());
assertEquals(true, ace.getPermission().containsAll(expected));
}
else
{
fail("Unexpected permissions set: " + ace.getPermission());
}
}
else
{
fail("Unknown principal: " + ace.getPrincipal().getPrincipalId());
}
}
}
public void _testGetACL() throws Exception
{
assertNotNull(port);
String docId = createDocument(testFolderId, "doc");
CmisAccessControlListType addACL = new CmisAccessControlListType();
CmisAccessControlListType removeACL = new CmisAccessControlListType();
CmisAccessControlEntryType entry1 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal1 = new CmisAccessControlPrincipalType();
principal1.setPrincipalId("Makis");
entry1.setPrincipal(principal1);
entry1.getPermission().add(EnumBasicPermissions.CMIS_WRITE.value());
addACL.getPermission().add(entry1);
CmisAccessControlEntryType entry2 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal2 = new CmisAccessControlPrincipalType();
principal2.setPrincipalId("root");
entry2.setPrincipal(principal2);
entry2.getPermission().add(EnumBasicPermissions.CMIS_READ.value());
entry2.getPermission().add(EnumBasicPermissions.CMIS_WRITE.value());
addACL.getPermission().add(entry2);
CmisAccessControlEntryType entry3 = new CmisAccessControlEntryType();
CmisAccessControlPrincipalType principal3 = new CmisAccessControlPrincipalType();
principal3.setPrincipalId("any");
entry3.setPrincipal(principal3);
entry3.getPermission().add(EnumBasicPermissions.CMIS_ALL.value());
removeACL.getPermission().add(entry3);
conn.applyACL(docId, TypeConverter.getListAccessControlEntry(addACL), TypeConverter
.getListAccessControlEntry(removeACL), AccessControlPropagation.REPOSITORYDETERMINED);
CmisACLType resp = port.getACL(repositoryId, docId, false, new CmisExtensionType());
assertNotNull(resp);
CmisAccessControlListType acl = resp.getACL();
for (CmisAccessControlEntryType ace : acl.getPermission())
{
if ("root".equals(ace.getPrincipal().getPrincipalId()))
{
if (1 == ace.getPermission().size())
{
assertEquals(EnumBasicPermissions.CMIS_ALL.value(), ace.getPermission().get(0));
}
else if (2 == ace.getPermission().size())
{
List<String> expected = new ArrayList<String>();
expected.add(EnumBasicPermissions.CMIS_READ.value());
expected.add(EnumBasicPermissions.CMIS_WRITE.value());
assertEquals(true, ace.getPermission().containsAll(expected));
}
else
{
fail("Unexpected permissions set: " + ace.getPermission());
}
}
else if ("Makis".equals(ace.getPrincipal().getPrincipalId()))
{
assertEquals(1, ace.getPermission().size());
assertEquals(EnumBasicPermissions.CMIS_WRITE.value(), ace.getPermission().get(0));
}
else
{
fail("Unknown principal: " + ace.getPrincipal().getPrincipalId());
}
}
}
private ACLServicePort getAccessControlService(String address) throws Exception
{
org.apache.cxf.jaxws.JaxWsProxyFactoryBean client = new org.apache.cxf.jaxws.JaxWsProxyFactoryBean();
client.setServiceClass(ACLServicePort.class);
client.setAddress(address);
Object obj = client.create();
return (ACLServicePort)obj;
}
protected void tearDown() throws Exception
{
server.stop();
super.tearDown();
}
}