/* * 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.chemistry.opencmis.inmemory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.data.RepositoryInfo; import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList; import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException; import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException; import org.apache.chemistry.opencmis.inmemory.types.DocumentTypeCreationHelper; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RepositoryServiceTest extends AbstractServiceTest { // private CmisProvider fProvider; private static final Logger log = LoggerFactory.getLogger(RepositoryServiceTest.class); @Override @Before public void setUp() { super.setTypeCreatorClass(UnitTestTypeSystemCreator.class.getName()); super.setUp(); } @Override @After public void tearDown() { super.tearDown(); } @Test public void testRepositoryInfo() { log.info("starting testRepositoryInfo() ..."); List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(null); assertNotNull(repositories); assertFalse(repositories.isEmpty()); log.info("geRepositoryInfo(), found " + repositories.size() + " repository/repositories)."); for (RepositoryInfo repository : repositories) { RepositoryInfo repository2 = fRepSvc.getRepositoryInfo(repository.getId(), null); assertNotNull(repository2); assertEquals(repository.getId(), repository2.getId()); log.info("found repository" + repository2.getId()); } log.info("... testRepositoryInfo() finished."); } @Test public void testTypeDefinition() { log.info(""); log.info("starting testTypeDefinition() ..."); String repositoryId = getRepositoryId(); String typeId = "MyDocType1"; TypeDefinition ref = UnitTestTypeSystemCreator.getTypeById(typeId); TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId, typeId, null); assertEquals(ref.getId(), type.getId()); assertEquals(ref.getDescription(), type.getDescription()); assertEquals(ref.getDisplayName(), type.getDisplayName()); assertEquals(ref.getLocalName(), type.getLocalName()); assertEquals(ref.getLocalNamespace(), type.getLocalNamespace()); containsAllBasePropertyDefinitions(type); log.info("... testTypeDefinition() finished."); } @Test public void testGetAllTypesUnlimitedDepth() { log.info(""); log.info("starting testGetAllTypesUnlimitedDepth()..."); String repositoryId = getRepositoryId(); // get types List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, null, BigInteger.valueOf(-1), Boolean.TRUE, null); assertNotNull(types); // check that we got all types int expectedSize = UnitTestTypeSystemCreator.getTypesList().size() + DocumentTypeCreationHelper.getDefaultTypes().size(); int totalSize = getRecursiveSize(types); assertEquals(expectedSize, totalSize); assertEquals(6, types.size()); for (TypeDefinitionContainer type : types) { assertNotNull(type); TypeDefinition typeDef = type.getTypeDefinition(); assertNotNull(typeDef); assertNotNull(typeDef.getId()); assertNotNull(typeDef.getBaseTypeId()); log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName()); log.info(" Base type is: " + typeDef.getBaseTypeId()); log.info(" Number of children types is: " + type.getChildren().size()); Map<String, PropertyDefinition<?>> propDefs = type.getTypeDefinition().getPropertyDefinitions(); log.info(" Number of properties is: " + (propDefs == null ? 0 : propDefs.size())); containsAllBasePropertyDefinitions(typeDef); } log.info("... testGetAllTypesUnlimitedDepth() finished."); } @Test public void testGetTypesWihtoutPropDefs() { log.info(""); log.info("starting testGetTypesWihtoutPropDefs()..."); String repositoryId = getRepositoryId(); // get types List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, BaseTypeId.CMIS_DOCUMENT.value(), BigInteger.valueOf(-1), Boolean.FALSE, null); // List<TypeDefinitionContainer> types = // fRepSvc.getTypeDescendants(repositoryId, "MyDocType1", // BigInteger.valueOf(-1), // Boolean.FALSE, null); assertNotNull(types); int totalSize = getRecursiveSize(types); log.info("Found " + totalSize + " number of type definitions. "); List<TypeDefinition> descendants = getTypeDefsFlattened(types); for (TypeDefinition typeDef : descendants) { assertNotNull(typeDef); assertNotNull(typeDef.getId()); assertNotNull(typeDef.getBaseTypeId()); assertEquals(BaseTypeId.CMIS_DOCUMENT, typeDef.getBaseTypeId()); log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName()); log.info(" Base type is: " + typeDef.getBaseTypeId()); Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions(); log.info(" Property definitions (must be null): " + propDefs); assertTrue(propDefs.isEmpty()); } log.info("... testGetTypesWihtoutPropDefs() finished."); } @Test public void testGetAllTypesLimitedDepth() { log.info(""); log.info("starting testGetAllTypesLimitedDepth()..."); String repositoryId = getRepositoryId(); // get types int depth = 1; List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, BaseTypeId.CMIS_DOCUMENT.value(), BigInteger.valueOf(depth), Boolean.TRUE, null); assertNotNull(types); log.info("Found in repository " + repositoryId + " " + types.size() + " type(s) with depth " + depth + "."); for (TypeDefinitionContainer type : types) { TypeDefinition typeDef = type.getTypeDefinition(); log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName()); log.info(" Base type is: " + typeDef.getBaseTypeId()); log.info(" Number of children types is: " + type.getChildren().size()); containsAllBasePropertyDefinitions(typeDef); } int totalSize = getRecursiveSize(types); assertEquals(5, totalSize); // all RepositoryTestTypeSystemCreator types // minus one in level two plus cmis.docment assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_DOCUMENT.value(), types)); assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_FOLDER.value(), types)); assertTrue(containsTypeByIdRecursive("MyDocType1", types)); assertTrue(containsTypeByIdRecursive("MyDocType2", types)); assertFalse(containsTypeByIdRecursive(UnitTestTypeSystemCreator.LEVEL2_TYPE, types)); for (TypeDefinitionContainer type : types) { assertNotNull(type); TypeDefinition typeDef = type.getTypeDefinition(); assertNotNull(typeDef); assertNotNull(typeDef.getId()); assertNotNull(typeDef.getBaseTypeId()); } log.info("... testGetAllTypesLimitedDepth() finished."); } @Test public void testGetSpecificTypeLimitedDepth() { log.info(""); log.info("starting testGetSpecificTypeLimitedDepth()..."); String repositoryId = getRepositoryId(); // get types int depth = 2; String typeId = "MyDocType1"; List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, typeId, BigInteger.valueOf(depth), Boolean.TRUE, null); assertNotNull(types); log.info("Found in repository " + repositoryId + " for type " + typeId + ", " + types.size() + " type(s) with depth " + depth + "."); assertEquals(4, getRecursiveSize(types)); assertTrue(containsTypeByIdRecursive("MyDocType1.1", types)); assertTrue(containsTypeByIdRecursive("MyDocType1.2", types)); assertTrue(containsTypeByIdRecursive("MyDocType1.1.1", types)); assertTrue(containsTypeByIdRecursive("MyDocType1.1.2", types)); for (TypeDefinitionContainer type : types) { assertNotNull(type); TypeDefinition typeDef = type.getTypeDefinition(); assertNotNull(typeDef); assertNotNull(typeDef.getId()); assertNotNull(typeDef.getBaseTypeId()); log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName()); log.info(" Base type is: " + typeDef.getBaseTypeId()); log.info(" Number of children types is: " + type.getChildren().size()); containsAllBasePropertyDefinitions(typeDef); } log.info("... testGetSpecificTypeLimitedDepth() finished."); } @Test public void testGetTypeChildren() { log.info(""); log.info("starting testGetTypeChildren()..."); String repositoryId = getRepositoryId(); String typeId = "MyDocType2"; // get all children BigInteger maxItems = BigInteger.valueOf(1000); BigInteger skipCount = BigInteger.valueOf(0); TypeDefinitionList children = fRepSvc.getTypeChildren(repositoryId, typeId, true, maxItems, skipCount, null); for (TypeDefinition type : children.getList()) { log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName()); containsAllBasePropertyDefinitions(type); } assertEquals(9, children.getList().size()); assertEquals(9, children.getNumItems().intValue()); assertFalse(children.hasMoreItems()); // get a chunk maxItems = BigInteger.valueOf(5); skipCount = BigInteger.valueOf(3); children = fRepSvc.getTypeChildren(repositoryId, typeId, true, maxItems, skipCount, null); for (TypeDefinition type : children.getList()) { log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName()); containsAllBasePropertyDefinitions(type); } assertEquals(5, children.getList().size()); assertEquals(9, children.getNumItems().intValue()); assertTrue(children.hasMoreItems()); log.info("... testGetTypeChildren() finished."); } @Test public void testGetTypeChildrenNoProperties() { log.info(""); log.info("starting testGetTypeChildrenNoProperties()..."); String repositoryId = getRepositoryId(); String typeId = "cmis:document"; // get all children BigInteger maxItems = BigInteger.valueOf(1000); BigInteger skipCount = BigInteger.valueOf(0); TypeDefinitionList children = fRepSvc.getTypeChildren(repositoryId, typeId, null, maxItems, skipCount, null); children = fRepSvc.getTypeChildren(repositoryId, typeId, null, maxItems, null, null); for (TypeDefinition type : children.getList()) { assertTrue(type.getPropertyDefinitions().isEmpty()); } log.info("... testGetTypeChildrenNoProperties() finished."); } @Test public void testGetWrongParameters() { log.info(""); log.info("starting testGetWrongParameters()..."); String repositoryId = getRepositoryId(); String wrongRepositoryId = "NonExistantRepository"; // get types int depth = -1; String wrongTypeId = "UnknownType"; try { RepositoryInfo repInf = fRepSvc.getRepositoryInfo(wrongRepositoryId, null); log.debug("getRepositoryInfo(): " + repInf); fail("getRepositoryInfo() with illegal repository id should throw InvalidArgumentException."); } catch (CmisInvalidArgumentException e) { log.info("getRepositoryInfo() with depth==0 raised expected exception: " + e); } try { List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, "CMISDocument", BigInteger.valueOf(0), Boolean.TRUE, null); log.debug("getTypeDescendants(): " + types); fail("getTypeDescendants() with depth 0 should throw InvalidArgumentException."); } catch (CmisInvalidArgumentException e) { log.info("getTypeDescendants() with depth==0 raised expected exception: " + e); } try { List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, wrongTypeId, BigInteger.valueOf(depth), Boolean.TRUE, null); log.debug("getTypeDescendants(): " + types); fail("getTypeDescendants() with unknown type should throw exception."); } catch (CmisInvalidArgumentException e) { log.info("getTypeDescendants() with unknown type raised expected exception: " + e); } try { TypeDefinition type = fRepSvc.getTypeDefinition(wrongRepositoryId, "CMISDocument", null); log.debug("getTypeDefinition(): " + type); fail("getTypeDefinition() with unknown repository id should throw exception."); } catch (CmisInvalidArgumentException e) { log.info("getTypeDefinition() with unknown repository id raised expected exception: " + e); } try { TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId, wrongTypeId, null); log.debug("getTypeDefinition(): " + type); fail("getTypeDefinition() with unknown type should throw exception."); } catch (CmisObjectNotFoundException e) { log.info("getTypeDefinition() with unknown type raised expected exception: " + e); } try { TypeDefinitionList types = fRepSvc.getTypeChildren(wrongRepositoryId, "CMISDocument", Boolean.TRUE, BigInteger.valueOf(100), BigInteger.ZERO, null); log.debug("getTypeChildren(): " + types); fail("getTypeDescendants() with unknown type should throw InvalidArgumentException."); } catch (CmisInvalidArgumentException e) { log.info("getTypeDescendants() with unknown repository id raised expected exception: " + e); } try { TypeDefinitionList types = fRepSvc.getTypeChildren(repositoryId, wrongTypeId, Boolean.TRUE, BigInteger.valueOf(100), BigInteger.ZERO, null); log.debug("getTypeChildren(): " + types); fail("getTypeDescendants() with unknown type should throw exception."); } catch (CmisInvalidArgumentException e) { log.info("getTypeDescendants() with unknown type raised expected exception: " + e); } log.info("... testGetUnknownType() testGetWrongParameters."); } @Test public void testInheritedProperties() { log.info(""); log.info("starting testInheritedProperties()..."); String repositoryId = getRepositoryId(); String typeId = UnitTestTypeSystemCreator.TOPLEVEL_TYPE; // get top level type TypeDefinition typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null); assertNotNull(typeContainer); Map<String, PropertyDefinition<?>> propDefMap = typeContainer.getPropertyDefinitions(); assertTrue(propDefMap.containsKey("StringPropTopLevel")); assertFalse(propDefMap.get("StringPropTopLevel").isInherited()); assertFalse(propDefMap.containsKey("StringPropLevel1")); assertFalse(propDefMap.containsKey("StringPropLevel2")); containsAllBasePropertyDefinitions(typeContainer); // get level 1 type typeId = UnitTestTypeSystemCreator.LEVEL1_TYPE; typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null); assertNotNull(typeContainer); propDefMap = typeContainer.getPropertyDefinitions(); assertTrue(propDefMap.containsKey("StringPropTopLevel")); assertTrue(propDefMap.get("StringPropTopLevel").isInherited()); assertTrue(propDefMap.containsKey("StringPropLevel1")); assertFalse(propDefMap.get("StringPropLevel1").isInherited()); assertFalse(propDefMap.containsKey("StringPropLevel2")); containsAllBasePropertyDefinitions(typeContainer); // get level 2 type typeId = UnitTestTypeSystemCreator.LEVEL2_TYPE; typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null); assertNotNull(typeContainer); propDefMap = typeContainer.getPropertyDefinitions(); assertTrue(propDefMap.containsKey("StringPropTopLevel")); assertTrue(propDefMap.get("StringPropTopLevel").isInherited()); assertTrue(propDefMap.containsKey("StringPropLevel1")); assertTrue(propDefMap.get("StringPropLevel1").isInherited()); assertTrue(propDefMap.containsKey("StringPropLevel2")); assertFalse(propDefMap.get("StringPropLevel2").isInherited()); containsAllBasePropertyDefinitions(typeContainer); log.info("... testInheritedProperties() finished."); } private String getRepositoryId() { List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(null); RepositoryInfo repository = repositories.get(0); assertNotNull(repository); return repository.getId(); } private boolean containsTypeByIdRecursive(String typeId, List<TypeDefinitionContainer> types) { for (TypeDefinitionContainer type : types) { if (containsTypeByIdRecursive(typeId, type)) { return true; } } return false; } private boolean containsTypeByIdRecursive(String typeId, TypeDefinitionContainer typeContainer) { if (typeId.equals(typeContainer.getTypeDefinition().getId())) { return true; } for (TypeDefinitionContainer type : typeContainer.getChildren()) { if (containsTypeByIdRecursive(typeId, type)) { return true; } } return false; } static void containsAllBasePropertyDefinitions(TypeDefinition typeDef) { Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions(); String baseTypeId = typeDef.getBaseTypeId().value(); if (!typeDef.getId().equals(BaseTypeId.CMIS_SECONDARY.value())) { assertTrue(propDefs.containsKey(PropertyIds.NAME)); assertTrue(propDefs.containsKey(PropertyIds.OBJECT_ID)); assertTrue(propDefs.containsKey(PropertyIds.OBJECT_TYPE_ID)); assertTrue(propDefs.containsKey(PropertyIds.BASE_TYPE_ID)); assertTrue(propDefs.containsKey(PropertyIds.CREATED_BY)); assertTrue(propDefs.containsKey(PropertyIds.CREATION_DATE)); assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFIED_BY)); assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFICATION_DATE)); assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN)); } if (baseTypeId.equals(BaseTypeId.CMIS_DOCUMENT.value())) { assertTrue(propDefs.containsKey(PropertyIds.IS_IMMUTABLE)); assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_VERSION)); assertTrue(propDefs.containsKey(PropertyIds.IS_MAJOR_VERSION)); assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_MAJOR_VERSION)); assertTrue(propDefs.containsKey(PropertyIds.VERSION_LABEL)); assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_ID)); assertTrue(propDefs.containsKey(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT)); assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY)); assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID)); assertTrue(propDefs.containsKey(PropertyIds.CHECKIN_COMMENT)); assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_LENGTH)); assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_MIME_TYPE)); assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_FILE_NAME)); assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_ID)); assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN)); } else if (baseTypeId.equals(BaseTypeId.CMIS_FOLDER.value())) { assertTrue(propDefs.containsKey(PropertyIds.PARENT_ID)); assertTrue(propDefs.containsKey(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS)); assertTrue(propDefs.containsKey(PropertyIds.PATH)); } else if (baseTypeId.equals(BaseTypeId.CMIS_POLICY.value())) { assertTrue(propDefs.containsKey(PropertyIds.POLICY_TEXT)); } else if (baseTypeId.equals(BaseTypeId.CMIS_RELATIONSHIP.value())) { assertTrue(propDefs.containsKey(PropertyIds.SOURCE_ID)); assertTrue(propDefs.containsKey(PropertyIds.TARGET_ID)); } else if (baseTypeId.equals(BaseTypeId.CMIS_ITEM.value())) { } else if (baseTypeId.equals(BaseTypeId.CMIS_SECONDARY.value())) { } else { fail("Unknown base type id in type definition"); } } private int getRecursiveSize(List<TypeDefinitionContainer> types) { if (null == types) { return 0; } int size = types.size(); for (TypeDefinitionContainer type : types) { size += getRecursiveSize(type.getChildren()); } return size; } private List<TypeDefinition> getTypeDefsFlattened(List<TypeDefinitionContainer> types) { List<TypeDefinition> flattened = new ArrayList<TypeDefinition>(); for (TypeDefinitionContainer type : types) { flattened.add(type.getTypeDefinition()); if (null != type.getChildren()) { List<TypeDefinition> children = getTypeDefsFlattened(type.getChildren()); flattened.addAll(children); } } return flattened; } }