blob: 16d3765940246130bcd87d6b6b03a2123f76c55b [file] [log] [blame]
/*
* 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;
}
}