blob: ae44e13ea4ab5a38e93c8cd43fb29e57eff25d1d [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.tck.tests.types;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.WARNING;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.data.CreatablePropertyTypes;
import org.apache.chemistry.opencmis.commons.data.NewTypeSettableAttributes;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.enums.Cardinality;
import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
import org.apache.chemistry.opencmis.commons.enums.PropertyType;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.DocumentTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyBooleanDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDateTimeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyHtmlDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIdDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyUriDefinitionImpl;
import org.apache.chemistry.opencmis.tck.CmisTestResult;
import org.apache.chemistry.opencmis.tck.impl.AbstractSessionTest;
public class CreateAndDeleteTypeTest extends AbstractSessionTest {
@Override
public void init(Map<String, String> parameters) {
super.init(parameters);
setName("Create and Delete Type Test");
setDescription("Creates a document type and deletes it again.");
}
@Override
public void run(Session session) {
if (session.getRepositoryInfo().getCmisVersion() == CmisVersion.CMIS_1_0) {
addResult(createResult(SKIPPED, "Type mutability is not supported by CMIS 1.0. Test skipped!"));
return;
}
ObjectType parentType = session.getTypeDefinition(getDocumentTestTypeId());
if (parentType.getTypeMutability() == null || !Boolean.TRUE.equals(parentType.getTypeMutability().canCreate())) {
addResult(createResult(SKIPPED, "Test document type doesn't allow creating a sub-type. Test skipped!"));
return;
}
createTypeWithoutProperties(session, parentType);
createTypeWithProperties(session, parentType);
}
private void createTypeWithoutProperties(Session session, ObjectType parentType) {
CmisTestResult failure = null;
// define the type
DocumentTypeDefinitionImpl newTypeDef = createDocumentTypeDefinition(session, "tck:testid_without_properties",
parentType);
// create the type
ObjectType newType = createType(session, newTypeDef);
if (newType == null) {
return;
}
// get the type
ObjectType newType2 = null;
try {
newType2 = session.getTypeDefinition(newType.getId());
// assert type definitions
failure = createResult(FAILURE,
"The type definition returned by createType() doesn't match the type definition returned by getTypeDefinition()!");
addResult(assertEquals(newType, newType2, null, failure));
} catch (CmisObjectNotFoundException e) {
addResult(createResult(FAILURE, "Newly created type can not be fetched. Id: " + newType.getId(), e, false));
}
// delete the type
deleteType(session, newType.getId());
}
private void createTypeWithProperties(Session session, ObjectType parentType) {
CmisTestResult failure = null;
CreatablePropertyTypes cpt = session.getRepositoryInfo().getCapabilities().getCreatablePropertyTypes();
if (cpt == null || cpt.canCreate() == null || cpt.canCreate().isEmpty()) {
addResult(createResult(FAILURE, "Repository Info does not indicate, which property types can be created!"));
return;
}
// define the type
DocumentTypeDefinitionImpl newTypeDef = createDocumentTypeDefinition(session, "tck:testid_with_properties",
parentType);
// add a property for each creatable property type
for (PropertyType propType : PropertyType.values()) {
if (!cpt.canCreate().contains(propType)) {
continue;
}
newTypeDef.addPropertyDefinition(createPropertyDefinition(propType));
}
// create the type
ObjectType newType = createType(session, newTypeDef);
if (newType == null) {
return;
}
// get the type
ObjectType newType2 = null;
try {
newType2 = session.getTypeDefinition(newType.getId());
// assert type definitions
failure = createResult(FAILURE,
"The type definition returned by createType() doesn't match the type definition returned by getTypeDefinition()!");
addResult(assertEquals(newType, newType2, null, failure));
} catch (CmisObjectNotFoundException e) {
addResult(createResult(FAILURE, "Newly created type can not be fetched. Id: " + newType.getId(), e, false));
}
// check properties
List<PropertyDefinition<?>> newPropDefs = new ArrayList<PropertyDefinition<?>>();
for (Map.Entry<String, PropertyDefinition<?>> propDef : newType.getPropertyDefinitions().entrySet()) {
if (Boolean.FALSE.equals(propDef.getValue().isInherited())) {
newPropDefs.add(propDef.getValue());
}
}
failure = createResult(FAILURE,
"The number of defined properties and the number of non-inherited properties don't match!");
addResult(assertEquals(newTypeDef.getPropertyDefinitions().size(), newPropDefs.size(), null, failure));
// check the order of the properties, which must match the order of the
// original type definition
// (OpenCMIS keeps the order of the property definitions.)
int i = 0;
for (Map.Entry<String, PropertyDefinition<?>> propDef : newTypeDef.getPropertyDefinitions().entrySet()) {
PropertyDefinition<?> newPropDef = newPropDefs.get(i);
failure = createResult(FAILURE, "Property " + (i + 1) + " must be of type "
+ propDef.getValue().getPropertyType() + " but is of type " + newPropDef.getPropertyType() + "!");
addResult(assertEquals(propDef.getValue().getPropertyType(), newPropDef.getPropertyType(), null, failure));
addResult(createInfoResult("Repository assigned the property '" + propDef.getValue().getId()
+ "' the following property id: " + newPropDef.getId()));
i++;
}
// delete the type
deleteType(session, newType.getId());
}
private DocumentTypeDefinitionImpl createDocumentTypeDefinition(Session session, String typeId,
ObjectType parentType) {
CmisTestResult failure = null;
NewTypeSettableAttributes settableAttributes = session.getRepositoryInfo().getCapabilities()
.getNewTypeSettableAttributes();
if (settableAttributes == null) {
addResult(createResult(WARNING, "Capability NewTypeSettableAttributes is not set!"));
}
DocumentTypeDefinitionImpl result = new DocumentTypeDefinitionImpl();
result.setBaseTypeId(parentType.getBaseTypeId());
result.setParentTypeId(parentType.getId());
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetId())) {
result.setId(typeId);
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'id' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetId(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetLocalName())) {
result.setLocalName("tck:testlocal");
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'localName' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetLocalName(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetLocalNamespace())) {
result.setLocalNamespace("http://tck/testlocalnamespace");
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'localNamespace' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetLocalNamespace(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetDisplayName())) {
result.setDisplayName("TCK Document Type");
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'displayName' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetDisplayName(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetDescription())) {
result.setDescription("This is the TCK document type");
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'description' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetDescription(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetQueryName())) {
result.setQueryName("tck:testqueryname");
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'queryName' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetQueryName(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetQueryable())) {
result.setIsQueryable(false);
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'queryable' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetQueryable(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetFulltextIndexed())) {
result.setIsFulltextIndexed(false);
} else if (settableAttributes != null) {
failure = createResult(WARNING,
"Flag 'fulltextIndexed' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetFulltextIndexed(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetIncludedInSupertypeQuery())) {
result.setIsIncludedInSupertypeQuery(false);
} else if (settableAttributes != null) {
failure = createResult(WARNING,
"Flag 'includedInSupertypeQuery' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetIncludedInSupertypeQuery(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetControllableAcl())) {
result.setIsControllableAcl(false);
} else if (settableAttributes != null) {
failure = createResult(WARNING,
"Flag 'controllableACL' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetControllableAcl(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetControllablePolicy())) {
result.setIsControllablePolicy(false);
} else if (settableAttributes != null) {
failure = createResult(WARNING,
"Flag 'controllablePolicy' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetControllablePolicy(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetCreatable())) {
result.setIsCreatable(true);
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'creatable' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetCreatable(), null, failure));
}
if (settableAttributes == null || Boolean.TRUE.equals(settableAttributes.canSetFileable())) {
result.setIsFileable(true);
} else if (settableAttributes != null) {
failure = createResult(WARNING, "Flag 'fileable' in capability NewTypeSettableAttributes is not set!");
addResult(assertNotNull(settableAttributes.canSetFileable(), null, failure));
}
result.setIsVersionable(false);
result.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
return result;
}
private AbstractPropertyDefinition<?> createPropertyDefinition(PropertyType propertyType) {
AbstractPropertyDefinition<?> result = null;
switch (propertyType) {
case BOOLEAN:
result = new PropertyBooleanDefinitionImpl();
break;
case ID:
result = new PropertyIdDefinitionImpl();
break;
case INTEGER:
result = new PropertyIntegerDefinitionImpl();
break;
case DATETIME:
result = new PropertyDateTimeDefinitionImpl();
break;
case DECIMAL:
result = new PropertyDecimalDefinitionImpl();
break;
case HTML:
result = new PropertyHtmlDefinitionImpl();
break;
case URI:
result = new PropertyUriDefinitionImpl();
break;
default:
result = new PropertyStringDefinitionImpl();
}
result.setPropertyType(propertyType);
result.setId("tck:" + propertyType.value());
result.setLocalName("tck:local_" + propertyType.value());
result.setLocalNamespace("tck:testlocalnamespace");
result.setDisplayName("TCK " + propertyType.value() + " propertry");
result.setQueryName("tck:" + propertyType.value());
result.setDescription("TCK " + propertyType.value() + " propertry");
result.setCardinality(Cardinality.SINGLE);
result.setUpdatability(Updatability.READWRITE);
result.setIsInherited(false);
result.setIsQueryable(false);
result.setIsOrderable(false);
result.setIsRequired(false);
result.setIsOpenChoice(true);
return result;
}
}