/**
* 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.spi.tck;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.xcmis.spi.CmisConstants;
import org.xcmis.spi.CmisRegistry;
import org.xcmis.spi.ItemsList;
import org.xcmis.spi.ItemsTree;
import org.xcmis.spi.TypeNotFoundException;
import org.xcmis.spi.model.BaseType;
import org.xcmis.spi.model.CapabilityACL;
import org.xcmis.spi.model.RepositoryInfo;
import org.xcmis.spi.model.RepositoryShortInfo;
import org.xcmis.spi.model.TypeDefinition;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* 2.2.2 Repository Services The Repository Services (getRepositories,
* getRepositoryInfo, getTypeChildren, getTypeDescendants, getTypeDefinition)
* are used to discover information about the repository, including information
* about the repository and the object-types defined for the repository.
*
* @author <a href="mailto:alexey.zavizionov@exoplatform.com">Alexey
* Zavizionov</a>
* @version $Id$
*/
public class RepositoryTest extends BaseTest
{
@BeforeClass
public static void start() throws Exception
{
System.out.println("Running Repository Service tests");
}
@AfterClass
public static void stop() throws Exception
{
}
/**
* 2.2.2.1 getRepositories
* <p>
* Returns a list of CMIS repositories available from this CMIS service
* endpoint.
* </p>
*/
@Test
public void testGetRepositories() throws Exception
{
Set<RepositoryShortInfo> storageInfos = CmisRegistry.getInstance().getStorageInfos();
assertNotNull("StorageInfo is null.", storageInfos);
assertTrue("StorageInfo is empty.", !storageInfos.isEmpty());
for (RepositoryShortInfo repositoryShortInfo : storageInfos)
{
assertTrue("Repository id is missing.", repositoryShortInfo.getRepositoryId() != null
&& repositoryShortInfo.getRepositoryId().length() > 0);
assertTrue("Repository name is missing.", repositoryShortInfo.getRepositoryName() != null
&& repositoryShortInfo.getRepositoryName().length() > 0);
assertNotNull("Root folder id is missing.", repositoryShortInfo.getRootFolderId());
}
}
/**
* 2.2.2.2 getRepositoryInfo.
* <p>
* Returns information about the CMIS repository, the optional capabilities
* it supports and its Access Control information if applicable.
* </p>
*
* @throws Exception
*/
@Test
public void testGetRepositoryInfo() throws Exception
{
RepositoryInfo repositoryInfo = connection.getStorage().getRepositoryInfo();
assertNotNull("RepositoryInfo is null.", repositoryInfo);
assertTrue("Repository id is missing.", repositoryInfo.getRepositoryId() != null
&& repositoryInfo.getRepositoryId().length() > 0);
assertNotNull("Repository name is missing.", repositoryInfo.getRepositoryName());
assertNotNull("Repository VendorName is missing.", repositoryInfo.getVendorName());
assertNotNull("Repository ProductName is missing.", repositoryInfo.getProductName());
assertNotNull("Repository PropductVersion is missing.", repositoryInfo.getProductVersion());
assertNotNull("Repository Root Folder id is missing.", repositoryInfo.getRootFolderId());
assertNotNull("Repository Capabilities is missing.", repositoryInfo.getCapabilities());
assertNotNull("Repository version supported is missing.", repositoryInfo.getCmisVersionSupported());
assertNotNull("Repository Changes on type is missing.", repositoryInfo.getChangesOnType());
assertNotNull("Repository ACL capability is missing.", repositoryInfo.getAclCapability());
if (!repositoryInfo.getCapabilities().getCapabilityACL().equals(CapabilityACL.NONE))
{
assertNotNull("Repository supported permissions is missing.", repositoryInfo.getAclCapability()
.getSupportedPermissions());
assertNotNull("Repository ACL propagation is missing.", repositoryInfo.getAclCapability().getPropagation());
assertNotNull("Repository ACL permissions is missing.", repositoryInfo.getAclCapability().getPermissions());
assertNotNull("Repository ACL mapping is missing.", repositoryInfo.getAclCapability().getMapping());
}
assertNotNull("Repository principal anonymous is missing.", repositoryInfo.getPrincipalAnonymous());
assertNotNull("Repository principal anyone is missing.", repositoryInfo.getPrincipalAnyone());
}
/**
* 2.2.2.3 getTypeChildren.
* <p>
* Returns the list of Object-Types defined for the Repository that are
* children of the specified Type.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeChildren() throws Exception
{
ItemsList<TypeDefinition> typeChildren = connection.getTypeChildren(null, false, -1, 0);
List<String> tids = new ArrayList<String>();
for (TypeDefinition t : typeChildren.getItems())
{
tids.add(t.getId());
assertNull(t.getPropertyDefinitions()); // was not requested.
}
List<String> exp = new ArrayList<String>();
exp.add("cmis:document");
exp.add("cmis:folder");
if (isPoliciesSupported)
{
exp.add("cmis:policy");
}
if (isRelationshipsSupported)
{
exp.add("cmis:relationship");
}
for (String s : exp)
{
assertTrue("Expected type " + s + " is not found in result. ", tids.contains(s));
}
}
/**
* 2.2.2.3 getTypeDescendants.
* <p>
* Returns the set of children object types defined for the Repository under
* the specified type and include property definitions.
* </p>
*
* @exception Exception
*/
@Test
public void testGetTypeChildren_IncludeProperty() throws Exception
{
ItemsList<TypeDefinition> typeChildren = connection.getTypeChildren(null, true, -1, 0);
for (TypeDefinition t : typeChildren.getItems())
{
assertNotNull("Property definitions not found.", t.getPropertyDefinitions());
}
}
/**
* 2.2.2.3 getTypeChildren.
* <p>
* Returns the list of Object-Types defined for the Repository that are
* children of the specified Type. See section 2.2.1.1 "Paging". If optional
* attribute 'maxItems' specified then number of items contained in the
* response must not exceed specified value.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeChildren_MaxItems() throws Exception
{
ItemsList<TypeDefinition> types = connection.getTypeChildren(null, false, 1, 0);
assertNotNull("Root type childrens is null.", types);
assertTrue("Incorrect Root type childrens size.", types.getItems().size() <= 1);
}
/**
* 2.2.2.3 getTypeChildren.
* <p>
* Returns the list of Object-Types defined for the Repository that are
* children of the specified Type.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeChildren_SkipCount() throws Exception
{
// Get all items first.
ItemsList<TypeDefinition> types = connection.getTypeChildren(null, false, -1, 0);
List<String> tids = new ArrayList<String>();
for (TypeDefinition t : types.getItems())
{
tids.add(t.getId());
}
types = connection.getTypeChildren(null, false, -1, 1);
List<String> tidsPage = new ArrayList<String>();
for (TypeDefinition t : types.getItems())
{
tidsPage.add(t.getId());
}
// Skip 1 items.
Iterator<String> iterator0 = tids.iterator();
iterator0.next();
iterator0.remove();
assertEquals(tids, tidsPage);
}
/**
* 2.2.2.3 getTypeChildren.
* <p>
* {@link TypeNotFoundException} must be thrown if type for which children
* requested is not exists.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeChildren_TypeNotFoundException() throws Exception
{
String type = "cmis:document" + System.currentTimeMillis();
try
{
connection.getTypeChildren(type, false, -1, 0);
fail("TypeNotFoundException must be thrown, type definition " + type + " shouldn't exist. ");
}
catch (TypeNotFoundException e)
{
}
}
/**
* 2.2.2.5 getTypeDefinition.
*
* @throws Exception
*/
@Test
public void testGetTypeDefinition_Document() throws Exception
{
TypeDefinition type = connection.getTypeDefinition(CmisConstants.DOCUMENT, false);
assertEquals(CmisConstants.DOCUMENT, type.getId());
assertEquals(BaseType.DOCUMENT, type.getBaseId());
assertNotNull("Query name required. " + type.getQueryName());
assertNull("Root type may not have parent type. ", type.getParentId());
assertNull("Property definitions was not requested. ", type.getPropertyDefinitions());
}
/**
* 2.2.2.5 getTypeDefinition.
*
* @throws Exception
*/
@Test
public void testGetTypeDefinition_Folder() throws Exception
{
TypeDefinition type = connection.getTypeDefinition(CmisConstants.FOLDER, false);
assertEquals(CmisConstants.FOLDER, type.getId());
assertEquals(BaseType.FOLDER, type.getBaseId());
assertNotNull("Query name required. " + type.getQueryName());
assertNull("Root type may not have parent type. ", type.getParentId());
assertTrue("Folder type is fileable. ", type.isFileable());
assertNull("Property definitions was not requested. ", type.getPropertyDefinitions());
}
/**
* 2.2.2.5 getTypeDefinition.
*
* @throws Exception
*/
@Test
public void testGetTypeDefinition_Policy() throws Exception
{
if (!isPoliciesSupported)
{
return;
}
TypeDefinition type = connection.getTypeDefinition(CmisConstants.POLICY, false);
assertEquals(CmisConstants.POLICY, type.getId());
assertEquals(BaseType.POLICY, type.getBaseId());
assertNotNull("Query name required. " + type.getQueryName());
assertNull("Root type may not have parent type. ", type.getParentId());
assertNull("Property definitions was not requested. ", type.getPropertyDefinitions());
}
/**
* 2.2.2.5 getTypeDefinition.
*
* @throws Exception
*/
@Test
public void testGetTypeDefinition_Relationship() throws Exception
{
if (!isRelationshipsSupported)
{
return;
}
TypeDefinition type = connection.getTypeDefinition(CmisConstants.RELATIONSHIP, false);
assertEquals(CmisConstants.RELATIONSHIP, type.getId());
assertEquals(BaseType.RELATIONSHIP, type.getBaseId());
assertNotNull("Query name required. " + type.getQueryName());
assertNull("Root type may not have parent type. ", type.getParentId());
assertFalse("Relationship type is not fileable. ", type.isFileable());
assertNull("Property definitions was not requested. ", type.getPropertyDefinitions());
}
/**
* 2.2.2.5 getTypeDefinition.
* <p>
* {@link TypeNotFoundException} must be thrown if type for which children
* requested is not exists.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeDefinition_TypeNotFoundException() throws Exception
{
String type = "cmis:document" + System.currentTimeMillis();
try
{
connection.getTypeDefinition(type, false);
fail("TypeNotFoundException must be thrown, type definition " + type + " shouldn't exist. ");
}
catch (TypeNotFoundException e)
{
}
}
/**
* 2.2.2.4 getTypeDescendants.
* <p>
* Returns the set of descendant object types defined for the Repository
* under the specified Type.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeDescendants() throws Exception
{
List<ItemsTree<TypeDefinition>> typeDescendants = connection.getTypeDescendants(null, -1, false);
List<TypeDefinition> treeAsList = typeTreeAsList(typeDescendants);
List<String> tids = new ArrayList<String>();
for (TypeDefinition t : treeAsList)
{
tids.add(t.getId());
assertNull(t.getPropertyDefinitions()); // was not requested.
}
List<String> exp = new ArrayList<String>();
exp.add("cmis:document");
exp.add("cmis:folder");
if (isPoliciesSupported)
{
exp.add("cmis:policy");
}
if (isRelationshipsSupported)
{
exp.add("cmis:relationship");
}
for (String s : exp)
{
assertTrue("Expected type " + s + " is not found in result. ", tids.contains(s));
}
}
/**
* 2.2.2.4 getTypeDescendants.
* <p>
* Returns the set of descendant object types defined for the Repository
* under the specified type and include property definitions.
* </p>
*
* @exception Exception
*/
@Test
public void testGetTypeDescendants_IncludeProperty() throws Exception
{
List<ItemsTree<TypeDefinition>> typeDescendants = connection.getTypeDescendants(null, -1, true);
List<TypeDefinition> treeAsList = typeTreeAsList(typeDescendants);
for (TypeDefinition t : treeAsList)
{
assertNotNull("Property definitions not found.", t.getPropertyDefinitions());
}
}
/**
* 2.2.2.4 getTypeChildren.
* <p>
* {@link TypeNotFoundException} must be thrown if type for which children
* requested is not exists.
* </p>
*
* @throws Exception
*/
@Test
public void testGetTypeDescendants_TypeNotFoundException() throws Exception
{
String type = "cmis:document" + System.currentTimeMillis();
try
{
connection.getTypeDescendants(type, -1, false);
fail("TypeNotFoundException must be thrown, type definition " + type + " shouldn't exist. ");
}
catch (TypeNotFoundException e)
{
}
}
}