blob: f29f45bfb24a67bc3eabfa46aeaa78bf231cf57f [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.server.support;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement;
import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
import org.apache.chemistry.opencmis.commons.definitions.Choice;
import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableDocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableFolderTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableItemTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutablePolicyTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutablePropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableRelationshipTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableSecondaryTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.MutableTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyBooleanDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDateTimeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDecimalDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyHtmlDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyIdDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyIntegerDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyStringDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyUriDefinition;
import org.apache.chemistry.opencmis.commons.definitions.RelationshipTypeDefinition;
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.definitions.TypeMutability;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
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.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ChoiceImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.CmisExtensionElementImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.DocumentTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.FolderTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ItemTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PolicyTypeDefinitionImpl;
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.commons.impl.dataobjects.RelationshipTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.SecondaryTypeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.TypeDefinitionContainerImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.TypeDefinitionListImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.TypeMutabilityImpl;
import org.apache.chemistry.opencmis.commons.spi.RepositoryService;
/**
* Type definition factory.
*/
public final class TypeDefinitionFactory {
private static final Set<String> NEW_CMIS11_PROPERTIES = new HashSet<String>();
static {
NEW_CMIS11_PROPERTIES.add(PropertyIds.DESCRIPTION);
NEW_CMIS11_PROPERTIES.add(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
NEW_CMIS11_PROPERTIES.add(PropertyIds.IS_PRIVATE_WORKING_COPY);
}
private Class<? extends MutableDocumentTypeDefinition> documentTypeDefinitionClass;
private Class<? extends MutableFolderTypeDefinition> folderTypeDefinitionClass;
private Class<? extends MutablePolicyTypeDefinition> policyTypeDefinitionClass;
private Class<? extends MutableRelationshipTypeDefinition> relationshipTypeDefinitionClass;
private Class<? extends MutableItemTypeDefinition> itemTypeDefinitionClass;
private Class<? extends MutableSecondaryTypeDefinition> secondaryTypeDefinitionClass;
private String defaultNamespace;
private boolean defaultControllableAcl;
private boolean defaultIsFullTextIndexed;
private boolean defaultControllablePolicy;
private boolean defaultQueryable;
private boolean defaultFulltextIndexed;
private TypeMutability defaultTypeMutability;
private TypeDefinitionFactory() {
documentTypeDefinitionClass = DocumentTypeDefinitionImpl.class;
folderTypeDefinitionClass = FolderTypeDefinitionImpl.class;
policyTypeDefinitionClass = PolicyTypeDefinitionImpl.class;
relationshipTypeDefinitionClass = RelationshipTypeDefinitionImpl.class;
itemTypeDefinitionClass = ItemTypeDefinitionImpl.class;
secondaryTypeDefinitionClass = SecondaryTypeDefinitionImpl.class;
defaultNamespace = null;
defaultControllableAcl = false;
defaultControllablePolicy = false;
defaultQueryable = true;
defaultFulltextIndexed = false;
TypeMutabilityImpl typeMutability = new TypeMutabilityImpl();
typeMutability.setCanCreate(false);
typeMutability.setCanUpdate(false);
typeMutability.setCanDelete(false);
defaultTypeMutability = typeMutability;
}
/**
* Creates a new instance of the factory.
*/
public static TypeDefinitionFactory newInstance() {
return new TypeDefinitionFactory();
}
// --- definition classes ---
public Class<? extends MutableDocumentTypeDefinition> getDocumentTypeDefinitionClass() {
return documentTypeDefinitionClass;
}
public void setDocumentTypeDefinitionClass(
Class<? extends MutableDocumentTypeDefinition> documentTypeDefinitionClass) {
checkClass(documentTypeDefinitionClass);
this.documentTypeDefinitionClass = documentTypeDefinitionClass;
}
protected MutableDocumentTypeDefinition createDocumentTypeDefinitionObject() {
try {
return documentTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
public Class<? extends MutableFolderTypeDefinition> getFolderTypeDefinitionClass() {
return folderTypeDefinitionClass;
}
public void setFolderTypeDefinitionClass(Class<? extends MutableFolderTypeDefinition> folderTypeDefinitionClass) {
checkClass(folderTypeDefinitionClass);
this.folderTypeDefinitionClass = folderTypeDefinitionClass;
}
protected MutableFolderTypeDefinition createFolderTypeDefinitionObject() {
try {
return folderTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
public Class<? extends MutablePolicyTypeDefinition> getPolicyTypeDefinitionClass() {
return policyTypeDefinitionClass;
}
public void setPolicyTypeDefinitionClass(Class<? extends MutablePolicyTypeDefinition> policyTypeDefinitionClass) {
checkClass(policyTypeDefinitionClass);
this.policyTypeDefinitionClass = policyTypeDefinitionClass;
}
protected MutablePolicyTypeDefinition createPolicyTypeDefinitionObject() {
try {
return policyTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
public Class<? extends MutableRelationshipTypeDefinition> getRelationshipTypeDefinitionClass() {
return relationshipTypeDefinitionClass;
}
public void setRelationshipTypeDefinitionClass(
Class<? extends MutableRelationshipTypeDefinition> relationshipTypeDefinitionClass) {
checkClass(relationshipTypeDefinitionClass);
this.relationshipTypeDefinitionClass = relationshipTypeDefinitionClass;
}
protected MutableRelationshipTypeDefinition createRelationshipTypeDefinitionObject() {
try {
return relationshipTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
public Class<? extends MutableItemTypeDefinition> getItemTypeDefinitionClass() {
return itemTypeDefinitionClass;
}
public void setItemTypeDefinitionClass(Class<? extends MutableItemTypeDefinition> itemTypeDefinitionClass) {
checkClass(itemTypeDefinitionClass);
this.itemTypeDefinitionClass = itemTypeDefinitionClass;
}
protected MutableItemTypeDefinition createItemTypeDefinitionObject() {
try {
return itemTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
public Class<? extends MutableSecondaryTypeDefinition> getSecondaryTypeDefinitionClass() {
return secondaryTypeDefinitionClass;
}
public void setSecondaryTypeDefinitionClass(
Class<? extends MutableSecondaryTypeDefinition> secondaryTypeDefinitionClass) {
checkClass(secondaryTypeDefinitionClass);
this.secondaryTypeDefinitionClass = secondaryTypeDefinitionClass;
}
protected MutableSecondaryTypeDefinition createSecondaryTypeDefinitionObject() {
try {
return secondaryTypeDefinitionClass.newInstance();
} catch (Exception e) {
throw new CmisRuntimeException("Cannot create type defintion object: " + e.getMessage(), e);
}
}
private void checkClass(Class<? extends MutableTypeDefinition> clazz) {
if (clazz == null) {
throw new IllegalArgumentException("Class must be set!");
}
// check for default constructor
try {
clazz.getConstructor(new Class[0]);
} catch (Exception e) {
throw new IllegalArgumentException("Class has no accessible default constructor!", e);
}
}
// --- default values ---
public String getDefaultNamespace() {
return defaultNamespace;
}
public void setDefaultNamespace(String defaultNamespace) {
this.defaultNamespace = defaultNamespace;
}
public boolean getDefaultIsFulltextIndexed() {
return defaultIsFullTextIndexed;
}
public void setDefaultIsFulltextIndexed(boolean defaultIsFullTextIndexed) {
this.defaultIsFullTextIndexed = defaultIsFullTextIndexed;
}
public boolean getDefaultControllableAcl() {
return defaultControllableAcl;
}
public void setDefaultControllableAcl(boolean defaultControllableAcl) {
this.defaultControllableAcl = defaultControllableAcl;
}
public boolean getDefaultControllablePolicy() {
return defaultControllablePolicy;
}
public void setDefaultControllablePolicy(boolean defaultControllablePolicy) {
this.defaultControllablePolicy = defaultControllablePolicy;
}
public boolean getDefaultQueryable() {
return defaultQueryable;
}
public void setDefaultQueryable(boolean defaultQueryable) {
this.defaultQueryable = defaultQueryable;
}
public boolean getDefaultFulltextIndexed() {
return defaultFulltextIndexed;
}
public void setDefaultFulltextIndexed(boolean defaultFulltextIndexed) {
this.defaultFulltextIndexed = defaultFulltextIndexed;
}
public TypeMutability getDefaultTypeMutability() {
return defaultTypeMutability;
}
public void setDefaultTypeMutability(TypeMutability defaultTypeMutability) {
this.defaultTypeMutability = defaultTypeMutability;
}
// --- create methods ---
/**
* Creates a new type mutability object.
*/
public TypeMutability createTypeMutability(boolean canCreate, boolean canUpdate, boolean canDelete) {
TypeMutabilityImpl result = new TypeMutabilityImpl();
result.setCanCreate(canCreate);
result.setCanUpdate(canUpdate);
result.setCanDelete(canDelete);
return result;
}
/**
* Creates a new mutable base document type definition including all
* property definitions defined in the CMIS specification.
*/
public MutableDocumentTypeDefinition createBaseDocumentTypeDefinition(CmisVersion cmisVersion) {
return createDocumentTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable document type definition including all base
* property definitions defined in the CMIS specification.
*/
public MutableDocumentTypeDefinition createDocumentTypeDefinition(CmisVersion cmisVersion, String parentId) {
MutableDocumentTypeDefinition documentType = createDocumentTypeDefinitionObject();
documentType.setBaseTypeId(BaseTypeId.CMIS_DOCUMENT);
documentType.setParentTypeId(parentId);
documentType.setIsControllableAcl(defaultControllableAcl);
documentType.setIsControllablePolicy(defaultControllablePolicy);
documentType.setIsCreatable(true);
documentType.setDescription("Document");
documentType.setDisplayName("Document");
documentType.setIsFileable(true);
documentType.setIsFulltextIndexed(defaultFulltextIndexed);
documentType.setIsIncludedInSupertypeQuery(true);
documentType.setLocalName("Document");
documentType.setLocalNamespace(defaultNamespace);
documentType.setIsQueryable(defaultQueryable);
documentType.setQueryName("cmis:document");
documentType.setId(BaseTypeId.CMIS_DOCUMENT.value());
if (cmisVersion != CmisVersion.CMIS_1_0) {
documentType.setTypeMutability(defaultTypeMutability);
}
documentType.setIsVersionable(false);
documentType.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
addBasePropertyDefinitions(documentType, cmisVersion, parentId != null);
addDocumentPropertyDefinitions(documentType, cmisVersion, parentId != null);
return documentType;
}
/**
* Creates a new mutable base folder type definition including all property
* definitions defined in the CMIS specification.
*/
public MutableFolderTypeDefinition createBaseFolderTypeDefinition(CmisVersion cmisVersion) {
return createFolderTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable folder type definition including all base property
* definitions defined in the CMIS specification.
*/
public MutableFolderTypeDefinition createFolderTypeDefinition(CmisVersion cmisVersion, String parentId) {
MutableFolderTypeDefinition folderType = createFolderTypeDefinitionObject();
folderType.setBaseTypeId(BaseTypeId.CMIS_FOLDER);
folderType.setParentTypeId(parentId);
folderType.setIsControllableAcl(defaultControllableAcl);
folderType.setIsControllablePolicy(defaultControllablePolicy);
folderType.setIsCreatable(true);
folderType.setDescription("Folder");
folderType.setDisplayName("Folder");
folderType.setIsFileable(true);
folderType.setIsFulltextIndexed(defaultFulltextIndexed);
folderType.setIsIncludedInSupertypeQuery(true);
folderType.setLocalName("Folder");
folderType.setLocalNamespace(defaultNamespace);
folderType.setIsQueryable(defaultQueryable);
folderType.setQueryName("cmis:folder");
folderType.setId(BaseTypeId.CMIS_FOLDER.value());
if (cmisVersion != CmisVersion.CMIS_1_0) {
folderType.setTypeMutability(defaultTypeMutability);
}
addBasePropertyDefinitions(folderType, cmisVersion, parentId != null);
addFolderPropertyDefinitions(folderType, cmisVersion, parentId != null);
return folderType;
}
/**
* Creates a new mutable base policy type definition including all property
* definitions defined in the CMIS specification.
*/
public MutablePolicyTypeDefinition createBasePolicyTypeDefinition(CmisVersion cmisVersion) {
return createPolicyTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable policy type definition including all base property
* definitions defined in the CMIS specification.
*/
public MutablePolicyTypeDefinition createPolicyTypeDefinition(CmisVersion cmisVersion, String parentId) {
MutablePolicyTypeDefinition policyType = createPolicyTypeDefinitionObject();
policyType.setBaseTypeId(BaseTypeId.CMIS_POLICY);
policyType.setParentTypeId(parentId);
policyType.setIsControllableAcl(defaultControllableAcl);
policyType.setIsControllablePolicy(defaultControllablePolicy);
policyType.setIsCreatable(false);
policyType.setDescription("Policy");
policyType.setDisplayName("Policy");
policyType.setIsFileable(false);
policyType.setIsFulltextIndexed(defaultFulltextIndexed);
policyType.setIsIncludedInSupertypeQuery(true);
policyType.setLocalName("Policy");
policyType.setLocalNamespace(defaultNamespace);
policyType.setIsQueryable(defaultQueryable);
policyType.setQueryName("cmis:policy");
policyType.setId(BaseTypeId.CMIS_POLICY.value());
if (cmisVersion != CmisVersion.CMIS_1_0) {
policyType.setTypeMutability(defaultTypeMutability);
}
addBasePropertyDefinitions(policyType, cmisVersion, parentId != null);
addPolicyPropertyDefinitions(policyType, cmisVersion, parentId != null);
return policyType;
}
/**
* Creates a new mutable base relationship type definition including all
* property definitions defined in the CMIS specification.
*/
public MutableRelationshipTypeDefinition createBaseRelationshipTypeDefinition(CmisVersion cmisVersion) {
return createRelationshipTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable relationship type definition including all base
* property definitions defined in the CMIS specification.
*/
public MutableRelationshipTypeDefinition createRelationshipTypeDefinition(CmisVersion cmisVersion, String parentId) {
MutableRelationshipTypeDefinition relationshipType = createRelationshipTypeDefinitionObject();
relationshipType.setBaseTypeId(BaseTypeId.CMIS_RELATIONSHIP);
relationshipType.setParentTypeId(parentId);
relationshipType.setIsControllableAcl(defaultControllableAcl);
relationshipType.setIsControllablePolicy(defaultControllablePolicy);
relationshipType.setIsCreatable(false);
relationshipType.setDescription("Relationship");
relationshipType.setDisplayName("Relationship");
relationshipType.setIsFileable(false);
relationshipType.setIsFulltextIndexed(defaultFulltextIndexed);
relationshipType.setIsIncludedInSupertypeQuery(true);
relationshipType.setLocalName("Relationship");
relationshipType.setLocalNamespace(defaultNamespace);
relationshipType.setIsQueryable(defaultQueryable);
relationshipType.setQueryName("cmis:relationship");
relationshipType.setId(BaseTypeId.CMIS_RELATIONSHIP.value());
if (cmisVersion != CmisVersion.CMIS_1_0) {
relationshipType.setTypeMutability(defaultTypeMutability);
}
addBasePropertyDefinitions(relationshipType, cmisVersion, parentId != null);
addRelationshipPropertyDefinitions(relationshipType, cmisVersion, parentId != null);
return relationshipType;
}
/**
* Creates a new mutable base item type definition including all property
* definitions defined in the CMIS specification.
*/
public MutableItemTypeDefinition createBaseItemTypeDefinition(CmisVersion cmisVersion) {
return createItemTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable item type definition including all base property
* definitions defined in the CMIS specification.
*/
public MutableItemTypeDefinition createItemTypeDefinition(CmisVersion cmisVersion, String parentId) {
if (cmisVersion == CmisVersion.CMIS_1_0) {
throw new IllegalArgumentException("CMIS 1.0 doesn't support item types!");
}
MutableItemTypeDefinition itemType = createItemTypeDefinitionObject();
itemType.setBaseTypeId(BaseTypeId.CMIS_ITEM);
itemType.setParentTypeId(parentId);
itemType.setIsControllableAcl(defaultControllableAcl);
itemType.setIsControllablePolicy(defaultControllablePolicy);
itemType.setIsCreatable(true);
itemType.setDescription("Item");
itemType.setDisplayName("Item");
itemType.setIsFileable(true);
itemType.setIsFulltextIndexed(defaultFulltextIndexed);
itemType.setIsIncludedInSupertypeQuery(true);
itemType.setLocalName("Item");
itemType.setLocalNamespace(defaultNamespace);
itemType.setIsQueryable(defaultQueryable);
itemType.setQueryName("cmis:item");
itemType.setId(BaseTypeId.CMIS_ITEM.value());
itemType.setTypeMutability(defaultTypeMutability);
addBasePropertyDefinitions(itemType, cmisVersion, parentId != null);
return itemType;
}
/**
* Creates a new mutable base secondary type definition.
*/
public MutableSecondaryTypeDefinition createBaseSecondaryTypeDefinition(CmisVersion cmisVersion) {
return createSecondaryTypeDefinition(cmisVersion, null);
}
/**
* Creates a new mutable secondary type definition.
*/
public MutableSecondaryTypeDefinition createSecondaryTypeDefinition(CmisVersion cmisVersion, String parentId) {
if (cmisVersion == CmisVersion.CMIS_1_0) {
throw new IllegalArgumentException("CMIS 1.0 doesn't support secondary types!");
}
MutableSecondaryTypeDefinition secondaryType = createSecondaryTypeDefinitionObject();
secondaryType.setBaseTypeId(BaseTypeId.CMIS_SECONDARY);
secondaryType.setParentTypeId(parentId);
secondaryType.setIsControllableAcl(defaultControllableAcl);
secondaryType.setIsControllablePolicy(defaultControllablePolicy);
secondaryType.setIsCreatable(true);
secondaryType.setDescription("Secondary");
secondaryType.setDisplayName("Secondary");
secondaryType.setIsFileable(false);
secondaryType.setIsFulltextIndexed(false);
secondaryType.setIsIncludedInSupertypeQuery(true);
secondaryType.setLocalName("Secondary");
secondaryType.setLocalNamespace(defaultNamespace);
secondaryType.setIsQueryable(defaultQueryable);
secondaryType.setQueryName("cmis:secondary");
secondaryType.setId(BaseTypeId.CMIS_SECONDARY.value());
secondaryType.setTypeMutability(defaultTypeMutability);
return secondaryType;
}
/**
* Creates a new mutable type definition, which is a child of the provided
* type definition. Property definitions are copied from the parent and
* marked as inherited.
*
* @param parentTypeDefinition
* the type definition of the parent
* @param id
* the id of the child type definition
*
* @return a mutable child type definition
*/
public MutableTypeDefinition createChildTypeDefinition(TypeDefinition parentTypeDefinition, String id) {
return createChildTypeDefinition(parentTypeDefinition, id, id, id, id, null, true, null);
}
/**
* Creates a new mutable type definition, which is a child of the provided
* type definition. If the parameter {@code includePropertyDefinitions} is
* set to {@code true} property definitions are copied from the parent and
* marked as inherited.
*/
public MutableTypeDefinition createChildTypeDefinition(TypeDefinition parentTypeDefinition, String id,
String localName, String queryName, String displayName, String description,
boolean includePropertyDefinitions, CmisVersion cmisVersion) {
if (parentTypeDefinition == null) {
throw new IllegalArgumentException("Parent type must be set!");
}
if (id == null) {
throw new IllegalArgumentException("Child id must be set!");
}
MutableTypeDefinition childType = copy(parentTypeDefinition, false);
childType.setParentTypeId(parentTypeDefinition.getId());
childType.setDescription(description);
childType.setDisplayName(displayName);
childType.setLocalName(localName);
childType.setQueryName(queryName);
childType.setId(id);
if (includePropertyDefinitions) {
copyPropertyDefinitions(parentTypeDefinition, childType, cmisVersion, true);
}
return childType;
}
/**
* Creates a property definition object.
*
* @param id
* the property ID, not {@code null}
* @param displayName
* the display name, may be {@code null}
* @param description
* the description, may be {@code null}
* @param datatype
* the datatype, not {@code null}
* @param cardinality
* the cardinality, not {@code null}
* @param updateability
* the updateability, not {@code null}
* @param inherited
* {@code true} if the property definition is inherited,
* {@code false} otherwise
* @param required
* {@code true} if a property value is required, {@code false}
* otherwise
* @param queryable
* {@code true} if the property can be used in the WHERE clause
* of a query, {@code false} otherwise
* @param orderable
* {@code true} if the property can be used in the ORDER BY
* clause of a query, {@code false} otherwise
*
* @return a mutable property definition object
*/
public MutablePropertyDefinition<?> createPropertyDefinition(String id, String displayName, String description,
PropertyType datatype, Cardinality cardinality, Updatability updateability, boolean inherited,
boolean required, boolean queryable, boolean orderable) {
if (id == null) {
throw new IllegalArgumentException("ID must be set!");
}
if (datatype == null) {
throw new IllegalArgumentException("Datatype must be set!");
}
if (cardinality == null) {
throw new IllegalArgumentException("Cardinality must be set!");
}
if (updateability == null) {
throw new IllegalArgumentException("Updateability must be set!");
}
MutablePropertyDefinition<?> result = null;
switch (datatype) {
case BOOLEAN:
result = new PropertyBooleanDefinitionImpl();
break;
case DATETIME:
result = new PropertyDateTimeDefinitionImpl();
break;
case DECIMAL:
result = new PropertyDecimalDefinitionImpl();
break;
case HTML:
result = new PropertyHtmlDefinitionImpl();
break;
case ID:
result = new PropertyIdDefinitionImpl();
break;
case INTEGER:
result = new PropertyIntegerDefinitionImpl();
break;
case STRING:
result = new PropertyStringDefinitionImpl();
break;
case URI:
result = new PropertyUriDefinitionImpl();
break;
default:
throw new IllegalArgumentException("Unknown datatype! Spec change?");
}
result.setId(id);
result.setLocalName(id);
result.setDisplayName(displayName);
result.setDescription(description);
result.setPropertyType(datatype);
result.setCardinality(cardinality);
result.setUpdatability(updateability);
result.setIsInherited(inherited);
result.setIsRequired(required);
result.setIsQueryable(queryable);
result.setIsOrderable(orderable);
result.setQueryName(id);
return result;
}
/**
* Creates a single value Choice object.
*
* @param displayName
* the choice display name
* @param value
* the value
*
* @return the Choice object
*/
public <T> Choice<T> createChoice(String displayName, T value) {
ChoiceImpl<T> result = new ChoiceImpl<T>();
result.setDisplayName(displayName);
result.setValue(value);
return result;
}
/**
* Creates a multi value Choice object.
*
* @param displayName
* the choice display name
* @param value
* the value
*
* @return the Choice object
*/
public <T> Choice<T> createChoice(String displayName, List<T> value) {
ChoiceImpl<T> result = new ChoiceImpl<T>();
result.setDisplayName(displayName);
result.setValue(value);
return result;
}
/**
* Creates a Choice object with sub choices.
*
* @param displayName
* the choice display name
* @param subChoice
* the sub choice list
*
* @return the Choice object
*/
public <T> Choice<T> createChoiceWithSubChoices(String displayName, List<Choice<T>> subChoice) {
ChoiceImpl<T> result = new ChoiceImpl<T>();
result.setDisplayName(displayName);
result.setChoice(subChoice);
return result;
}
/**
* Creates a type definition list.
*
* @param list
* the list of type definitions, not {@code null}
* @param hasMoreItems
* {@code true} if there are more items, {@code false} otherwise
* @param numItems
* the total (positive) number of types at this level or
* {@code null} if the number is unknown
*
* @return the TypeDefinitionList object
*/
public TypeDefinitionList createTypeDefinitionList(List<TypeDefinition> list, boolean hasMoreItems,
BigInteger numItems) {
if (list == null) {
throw new IllegalArgumentException("List must be set!");
}
if (numItems != null && numItems.signum() < 0) {
throw new IllegalArgumentException("Number of items is negative!");
}
TypeDefinitionListImpl result = new TypeDefinitionListImpl(list);
result.setHasMoreItems(hasMoreItems);
result.setNumItems(numItems);
return result;
}
/**
* Creates a {@link TypeDefinitionList} for
* {@link RepositoryService#getTypeChildren(String, String, Boolean, BigInteger, BigInteger, ExtensionsData)}
* .
*/
public TypeDefinitionList createTypeDefinitionList(Map<String, TypeDefinition> allTypes, String typeId,
Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount) {
return createTypeDefinitionList(allTypes, typeId, includePropertyDefinitions, maxItems, skipCount, null);
}
/**
* Creates a {@link TypeDefinitionList} for
* {@link RepositoryService#getTypeChildren(String, String, Boolean, BigInteger, BigInteger, ExtensionsData)}
* .
*/
public TypeDefinitionList createTypeDefinitionList(Map<String, TypeDefinition> allTypes, String typeId,
Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount, CmisVersion cmisVersion) {
if (allTypes == null) {
throw new IllegalArgumentException("Types map must be set!");
}
if (typeId != null && !allTypes.containsKey(typeId)) {
throw new CmisObjectNotFoundException("Type '" + typeId + "' does not exist!");
}
TypeDefinitionListImpl result = new TypeDefinitionListImpl(Collections.<TypeDefinition> emptyList());
result.setHasMoreItems(false);
result.setNumItems(BigInteger.ZERO);
if (allTypes.isEmpty()) {
return result;
}
int maxItemsInt = (maxItems == null ? Integer.MAX_VALUE : maxItems.intValue());
if (maxItemsInt < 0) {
maxItemsInt = 0;
}
int skipCountInt = (skipCount == null ? 0 : skipCount.intValue());
if (skipCountInt < 0) {
skipCountInt = 0;
}
boolean includePropertyDefinitionsBool = (includePropertyDefinitions == null ? false
: includePropertyDefinitions.booleanValue());
List<TypeDefinition> targetList = new ArrayList<TypeDefinition>();
for (TypeDefinition typeDef : allTypes.values()) {
if ((typeId == null && typeDef.getParentTypeId() == null)
|| (typeId != null && typeId.equals(typeDef.getParentTypeId()))) {
targetList.add(copy(typeDef, includePropertyDefinitionsBool, cmisVersion));
}
}
Collections.sort(targetList, new Comparator<TypeDefinition>() {
public int compare(TypeDefinition td1, TypeDefinition td2) {
String pid1 = td1.getParentTypeId();
String pid2 = td2.getParentTypeId();
if (pid1 == null) {
if (pid2 == null) {
return td1.getId().compareTo(td2.getId());
} else {
return -1;
}
} else {
if (pid2 == null) {
return 1;
} else {
int c = pid1.compareTo(pid2);
if (c == 0) {
return td1.getId().compareTo(td2.getId());
}
return c;
}
}
}
});
result.setList(targetList.subList(skipCountInt, Math.min(skipCountInt + maxItemsInt, targetList.size())));
result.setNumItems(BigInteger.valueOf(targetList.size()));
result.setHasMoreItems(targetList.size() > skipCountInt + maxItemsInt);
return result;
}
/**
* Creates a type definition container.
*
* @param typeDef
* the type definition, not {@code null}
* @param children
* the child type definitions, may be {@code null}
*
* @return the TypeDefinitionContainer object
*/
public TypeDefinitionContainer createTypeDefinitionContainer(TypeDefinition typeDef,
List<TypeDefinitionContainer> children) {
if (typeDef == null) {
throw new IllegalArgumentException("Type definition must be set!");
}
TypeDefinitionContainerImpl result = new TypeDefinitionContainerImpl(typeDef);
result.setChildren(children);
return result;
}
/**
* Creates a list of {@link TypeDefinitionContainer} for
* {@link RepositoryService#getTypeDescendants(String, String, BigInteger, Boolean, ExtensionsData)}
* .
*/
public List<TypeDefinitionContainer> createTypeDescendants(Map<String, TypeDefinition> allTypes, String typeId,
BigInteger depth, Boolean includePropertyDefinitions) {
return createTypeDescendants(allTypes, typeId, depth, includePropertyDefinitions, null);
}
/**
* Creates a list of {@link TypeDefinitionContainer} for
* {@link RepositoryService#getTypeDescendants(String, String, BigInteger, Boolean, ExtensionsData)}
* .
*/
public List<TypeDefinitionContainer> createTypeDescendants(Map<String, TypeDefinition> allTypes, String typeId,
BigInteger depth, Boolean includePropertyDefinitions, CmisVersion cmisVersion) {
if (allTypes == null) {
throw new IllegalArgumentException("Types map must be set!");
}
int depthInt = (depth == null ? -1 : depth.intValue());
if (depthInt == 0) {
throw new IllegalArgumentException("Depth must not be 0!");
}
if (typeId == null) {
depthInt = -1;
}
if (typeId != null && !allTypes.containsKey(typeId)) {
throw new CmisObjectNotFoundException("Type '" + typeId + "' does not exist!");
}
if (allTypes.isEmpty()) {
return Collections.<TypeDefinitionContainer> emptyList();
}
boolean includePropertyDefinitionsBool = (includePropertyDefinitions == null ? false
: includePropertyDefinitions.booleanValue());
// gather parent ids
Map<String, Set<String>> typeDefChildren = new HashMap<String, Set<String>>();
for (TypeDefinition typeDef : allTypes.values()) {
Set<String> children = typeDefChildren.get(typeDef.getParentTypeId());
if (children == null) {
children = new HashSet<String>();
typeDefChildren.put(typeDef.getParentTypeId(), children);
}
children.add(typeDef.getId());
}
Set<String> children = typeDefChildren.get(typeId);
if (children == null) {
return Collections.<TypeDefinitionContainer> emptyList();
}
// build container tree
List<TypeDefinitionContainer> result = new ArrayList<TypeDefinitionContainer>();
for (String child : children) {
result.add(createTypeDefinitionContainer(allTypes, typeDefChildren, child, depthInt - 1,
includePropertyDefinitionsBool, cmisVersion));
}
return result;
}
private TypeDefinitionContainer createTypeDefinitionContainer(Map<String, TypeDefinition> allTypes,
Map<String, Set<String>> typeDefChildren, String typeId, int depth, boolean includePropertyDefinitions,
CmisVersion cmisVersion) {
TypeDefinitionContainerImpl result = new TypeDefinitionContainerImpl();
result.setTypeDefinition(includePropertyDefinitions ? copy(allTypes.get(typeId), true, cmisVersion) : copy(
allTypes.get(typeId), false, cmisVersion));
if (depth != 0) {
if (typeDefChildren.containsKey(typeId)) {
for (String child : typeDefChildren.get(typeId)) {
result.getChildren().add(
createTypeDefinitionContainer(allTypes, typeDefChildren, child, depth < 0 ? -1 : depth - 1,
includePropertyDefinitions, cmisVersion));
}
}
}
return result;
}
// --- copy methods ---
/**
* Copies the given type definition and returns a mutable object.
*/
public MutableTypeDefinition copy(TypeDefinition sourceTypeDefintion, boolean includePropertyDefinitions) {
return copy(sourceTypeDefintion, includePropertyDefinitions, null);
}
/**
* Copies the given type definition and returns a mutable object.
*/
public MutableTypeDefinition copy(TypeDefinition sourceTypeDefintion, boolean includePropertyDefinitions,
CmisVersion cmisVersion) {
if (sourceTypeDefintion == null) {
throw new IllegalArgumentException("Source type must be set!");
}
if (sourceTypeDefintion.getBaseTypeId() == null) {
throw new IllegalArgumentException("Source type has no base type!");
}
MutableTypeDefinition result = null;
switch (sourceTypeDefintion.getBaseTypeId()) {
case CMIS_DOCUMENT:
result = createDocumentTypeDefinitionObject();
((MutableDocumentTypeDefinition) result).setIsVersionable(((DocumentTypeDefinition) sourceTypeDefintion)
.isVersionable());
((MutableDocumentTypeDefinition) result)
.setContentStreamAllowed(((DocumentTypeDefinition) sourceTypeDefintion).getContentStreamAllowed());
break;
case CMIS_FOLDER:
result = createFolderTypeDefinitionObject();
break;
case CMIS_POLICY:
result = createPolicyTypeDefinitionObject();
break;
case CMIS_RELATIONSHIP:
result = createRelationshipTypeDefinitionObject();
List<String> sourceTypeIds = ((RelationshipTypeDefinition) sourceTypeDefintion).getAllowedSourceTypeIds();
if (sourceTypeIds != null) {
((MutableRelationshipTypeDefinition) result)
.setAllowedSourceTypes(new ArrayList<String>(sourceTypeIds));
}
List<String> targetTypeIds = ((RelationshipTypeDefinition) sourceTypeDefintion).getAllowedTargetTypeIds();
if (targetTypeIds != null) {
((MutableRelationshipTypeDefinition) result)
.setAllowedTargetTypes(new ArrayList<String>(targetTypeIds));
}
break;
case CMIS_ITEM:
if (cmisVersion == CmisVersion.CMIS_1_0) {
throw new IllegalArgumentException("CMIS 1.0 doesn't support item types!");
}
result = createItemTypeDefinitionObject();
break;
case CMIS_SECONDARY:
if (cmisVersion == CmisVersion.CMIS_1_0) {
throw new IllegalArgumentException("CMIS 1.0 doesn't support secondary types!");
}
result = createSecondaryTypeDefinitionObject();
break;
default:
throw new RuntimeException("Unknown base type!");
}
result.setId(sourceTypeDefintion.getId());
result.setLocalName(sourceTypeDefintion.getLocalName());
result.setLocalNamespace(sourceTypeDefintion.getLocalNamespace());
result.setDisplayName(sourceTypeDefintion.getDisplayName());
result.setQueryName(sourceTypeDefintion.getQueryName());
result.setDescription(sourceTypeDefintion.getDescription());
result.setBaseTypeId(sourceTypeDefintion.getBaseTypeId());
result.setParentTypeId(sourceTypeDefintion.getParentTypeId());
result.setIsCreatable(sourceTypeDefintion.isCreatable());
result.setIsFileable(sourceTypeDefintion.isFileable());
result.setIsQueryable(sourceTypeDefintion.isQueryable());
result.setIsFulltextIndexed(sourceTypeDefintion.isFulltextIndexed());
result.setIsIncludedInSupertypeQuery(sourceTypeDefintion.isIncludedInSupertypeQuery());
result.setIsControllablePolicy(sourceTypeDefintion.isControllablePolicy());
result.setIsControllableAcl(sourceTypeDefintion.isControllableAcl());
if (cmisVersion != CmisVersion.CMIS_1_0) {
if (sourceTypeDefintion.getTypeMutability() != null) {
result.setTypeMutability(createTypeMutability(sourceTypeDefintion.getTypeMutability().canCreate(),
sourceTypeDefintion.getTypeMutability().canUpdate(), sourceTypeDefintion.getTypeMutability()
.canDelete()));
}
}
copyExtensions(sourceTypeDefintion, result);
if (includePropertyDefinitions) {
copyPropertyDefinitions(sourceTypeDefintion, result, cmisVersion, false);
}
return result;
}
/**
* Copies the given property definition and returns a mutable object.
*/
public MutablePropertyDefinition<?> copy(PropertyDefinition<?> sourcePropertyDefinition) {
if (sourcePropertyDefinition == null) {
throw new IllegalArgumentException("Source definition must be set!");
}
if (sourcePropertyDefinition.getPropertyType() == null) {
throw new IllegalArgumentException("Source definition property type must be set!");
}
MutablePropertyDefinition<?> result = null;
switch (sourcePropertyDefinition.getPropertyType()) {
case BOOLEAN:
result = new PropertyBooleanDefinitionImpl();
((PropertyBooleanDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyBooleanDefinition) sourcePropertyDefinition));
((PropertyBooleanDefinitionImpl) result)
.setChoices(copyChoices((PropertyBooleanDefinition) sourcePropertyDefinition));
break;
case DATETIME:
result = new PropertyDateTimeDefinitionImpl();
((PropertyDateTimeDefinitionImpl) result)
.setDateTimeResolution(((PropertyDateTimeDefinition) sourcePropertyDefinition)
.getDateTimeResolution());
((PropertyDateTimeDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyDateTimeDefinition) sourcePropertyDefinition));
((PropertyDateTimeDefinitionImpl) result)
.setChoices(copyChoices((PropertyDateTimeDefinition) sourcePropertyDefinition));
break;
case DECIMAL:
result = new PropertyDecimalDefinitionImpl();
((PropertyDecimalDefinitionImpl) result).setMinValue(((PropertyDecimalDefinition) sourcePropertyDefinition)
.getMinValue());
((PropertyDecimalDefinitionImpl) result).setMaxValue(((PropertyDecimalDefinition) sourcePropertyDefinition)
.getMaxValue());
((PropertyDecimalDefinitionImpl) result)
.setPrecision(((PropertyDecimalDefinition) sourcePropertyDefinition).getPrecision());
((PropertyDecimalDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyDecimalDefinition) sourcePropertyDefinition));
((PropertyDecimalDefinitionImpl) result)
.setChoices(copyChoices((PropertyDecimalDefinition) sourcePropertyDefinition));
break;
case HTML:
result = new PropertyHtmlDefinitionImpl();
((PropertyHtmlDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyHtmlDefinition) sourcePropertyDefinition));
break;
case ID:
result = new PropertyIdDefinitionImpl();
((PropertyIdDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyIdDefinition) sourcePropertyDefinition));
((PropertyIdDefinitionImpl) result)
.setChoices(copyChoices((PropertyIdDefinition) sourcePropertyDefinition));
break;
case INTEGER:
result = new PropertyIntegerDefinitionImpl();
((PropertyIntegerDefinitionImpl) result).setMinValue(((PropertyIntegerDefinition) sourcePropertyDefinition)
.getMinValue());
((PropertyIntegerDefinitionImpl) result).setMaxValue(((PropertyIntegerDefinition) sourcePropertyDefinition)
.getMaxValue());
((PropertyIntegerDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyIntegerDefinition) sourcePropertyDefinition));
((PropertyIntegerDefinitionImpl) result)
.setChoices(copyChoices((PropertyIntegerDefinition) sourcePropertyDefinition));
break;
case STRING:
result = new PropertyStringDefinitionImpl();
((PropertyStringDefinitionImpl) result).setMaxLength((((PropertyStringDefinition) sourcePropertyDefinition)
.getMaxLength()));
((PropertyStringDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyStringDefinition) sourcePropertyDefinition));
((PropertyStringDefinitionImpl) result)
.setChoices(copyChoices((PropertyStringDefinition) sourcePropertyDefinition));
break;
case URI:
result = new PropertyUriDefinitionImpl();
((PropertyUriDefinitionImpl) result)
.setDefaultValue(copyDefaultValue((PropertyUriDefinition) sourcePropertyDefinition));
((PropertyUriDefinitionImpl) result)
.setChoices(copyChoices((PropertyUriDefinition) sourcePropertyDefinition));
break;
default:
throw new RuntimeException("Unknown datatype!");
}
result.setId(sourcePropertyDefinition.getId());
result.setLocalName(sourcePropertyDefinition.getLocalName());
result.setLocalNamespace(sourcePropertyDefinition.getLocalNamespace());
result.setDisplayName(sourcePropertyDefinition.getDisplayName());
result.setDescription(sourcePropertyDefinition.getDescription());
result.setPropertyType(sourcePropertyDefinition.getPropertyType());
result.setCardinality(sourcePropertyDefinition.getCardinality());
result.setUpdatability(sourcePropertyDefinition.getUpdatability());
result.setIsInherited(sourcePropertyDefinition.isInherited());
result.setIsRequired(sourcePropertyDefinition.isRequired());
result.setIsQueryable(sourcePropertyDefinition.isQueryable());
result.setIsOrderable(sourcePropertyDefinition.isOrderable());
result.setQueryName(sourcePropertyDefinition.getQueryName());
result.setIsOpenChoice(sourcePropertyDefinition.isOpenChoice());
copyExtensions(sourcePropertyDefinition, result);
return result;
}
// --- internal methods ---
/**
* Copies the property definitions from a source type to a target type.
*/
protected void copyPropertyDefinitions(TypeDefinition source, MutableTypeDefinition target,
CmisVersion cmisVersion, boolean markAsInherited) {
assert source != null;
assert target != null;
if (source.getPropertyDefinitions() != null) {
for (PropertyDefinition<?> propDef : source.getPropertyDefinitions().values()) {
if (cmisVersion == CmisVersion.CMIS_1_0) {
if (NEW_CMIS11_PROPERTIES.contains(propDef.getId())) {
continue;
}
}
MutablePropertyDefinition<?> newPropDef = copy(propDef);
if (markAsInherited) {
newPropDef.setIsInherited(true);
}
target.addPropertyDefinition(newPropDef);
}
}
}
/**
* Returns a copy of a default value.
*/
protected <T> List<T> copyDefaultValue(PropertyDefinition<T> source) {
if (source == null || source.getDefaultValue() == null) {
return null;
}
return new ArrayList<T>(source.getDefaultValue());
}
/**
* Returns a copy of a choice tree.
*/
protected <T> List<Choice<T>> copyChoices(PropertyDefinition<T> source) {
if (source == null || source.getChoices() == null) {
return null;
}
List<Choice<T>> result = new ArrayList<Choice<T>>();
for (Choice<T> c : source.getChoices()) {
result.add(copyChoice(c));
}
return result;
}
private <T> Choice<T> copyChoice(Choice<T> source) {
if (source == null) {
return null;
}
ChoiceImpl<T> result = new ChoiceImpl<T>();
result.setDisplayName(source.getDisplayName());
if (source.getValue() != null) {
result.setValue(new ArrayList<T>(source.getValue()));
}
if (source.getChoice() != null) {
List<Choice<T>> choices = new ArrayList<Choice<T>>();
for (Choice<T> c : source.getChoice()) {
choices.add(copyChoice(c));
}
result.setChoice(choices);
}
return result;
}
/**
* Makes a deep copy of extension of a source object and adds them to a
* target object.
*/
protected void copyExtensions(ExtensionsData source, ExtensionsData target) {
if (source == null || target == null) {
return;
}
if (source.getExtensions() == null) {
target.setExtensions(null);
return;
}
List<CmisExtensionElement> elementList = new ArrayList<CmisExtensionElement>();
for (CmisExtensionElement element : source.getExtensions()) {
elementList.add(copy(element));
}
target.setExtensions(elementList);
}
/**
* Makes a deep copy of an extension element.
*/
private CmisExtensionElement copy(CmisExtensionElement element) {
if (element == null) {
return null;
}
Map<String, String> attrs = (element.getAttributes() != null ? new HashMap<String, String>(
element.getAttributes()) : null);
if (element.getChildren() == null) {
return new CmisExtensionElementImpl(element.getNamespace(), element.getName(), attrs, element.getValue());
} else {
List<CmisExtensionElement> children = new ArrayList<CmisExtensionElement>();
for (CmisExtensionElement child : element.getChildren()) {
children.add(copy(child));
}
return new CmisExtensionElementImpl(element.getNamespace(), element.getName(), attrs, children);
}
}
/**
* Adds the base property definitions to a type definition.
*/
protected void addBasePropertyDefinitions(MutableTypeDefinition type, CmisVersion cmisVersion, boolean inherited) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.NAME, "Name", "Name", PropertyType.STRING,
Cardinality.SINGLE, Updatability.READWRITE, inherited, true, true, true));
if (cmisVersion != CmisVersion.CMIS_1_0) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.DESCRIPTION, "Description", "Description",
PropertyType.STRING, Cardinality.SINGLE, Updatability.READWRITE, inherited, false, false, false));
}
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.OBJECT_ID, "Object Id", "Object Id",
PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, inherited, false, true, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.BASE_TYPE_ID, "Base Type Id", "Base Type Id",
PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, inherited, false, true, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.OBJECT_TYPE_ID, "Object Type Id",
"Object Type Id", PropertyType.ID, Cardinality.SINGLE, Updatability.ONCREATE, inherited, true, true,
false));
if (cmisVersion != CmisVersion.CMIS_1_0) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.SECONDARY_OBJECT_TYPE_IDS,
"Secondary Type Ids", "Secondary Type Ids", PropertyType.ID, Cardinality.MULTI,
Updatability.READONLY, inherited, false, true, false));
}
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CREATED_BY, "Created By", "Created By",
PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false, true, true));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CREATION_DATE, "Creation Date",
"Creation Date", PropertyType.DATETIME, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
true, true));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.LAST_MODIFIED_BY, "Last Modified By",
"Last Modified By", PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
true, true));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.LAST_MODIFICATION_DATE,
"Last Modification Date", "Last Modification Date", PropertyType.DATETIME, Cardinality.SINGLE,
Updatability.READONLY, inherited, false, true, true));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CHANGE_TOKEN, "Change Token", "Change Token",
PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false, false, false));
}
protected void addDocumentPropertyDefinitions(MutableDocumentTypeDefinition type, CmisVersion cmisVersion,
boolean inherited) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_IMMUTABLE, "Is Immutable", "Is Immutable",
PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, inherited, false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_LATEST_VERSION, "Is Latest Version",
"Is Latest Version", PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_MAJOR_VERSION, "Is Major Version",
"Is Major Version", PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_LATEST_MAJOR_VERSION,
"Is Latest Major Version", "Is Latest Major Version", PropertyType.BOOLEAN, Cardinality.SINGLE,
Updatability.READONLY, inherited, false, false, false));
if (cmisVersion != CmisVersion.CMIS_1_0) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_PRIVATE_WORKING_COPY,
"Is Private Working Copy", "Is Private Working Copy", PropertyType.BOOLEAN, Cardinality.SINGLE,
Updatability.READONLY, inherited, false, true, false));
}
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.VERSION_LABEL, "Version Label",
"Version Label", PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
true, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.VERSION_SERIES_ID, "Version Series Id",
"Version Series Id", PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
true, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT,
"Is Verison Series Checked Out", "Is Verison Series Checked Out", PropertyType.BOOLEAN,
Cardinality.SINGLE, Updatability.READONLY, inherited, false, true, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY,
"Version Series Checked Out By", "Version Series Checked Out By", PropertyType.STRING,
Cardinality.SINGLE, Updatability.READONLY, inherited, false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID,
"Version Series Checked Out Id", "Version Series Checked Out Id", PropertyType.ID, Cardinality.SINGLE,
Updatability.READONLY, inherited, false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CHECKIN_COMMENT, "Checkin Comment",
"Checkin Comment", PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CONTENT_STREAM_LENGTH, "Content Stream Length",
"Content Stream Length", PropertyType.INTEGER, Cardinality.SINGLE, Updatability.READONLY, inherited,
false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CONTENT_STREAM_MIME_TYPE, "MIME Type",
"MIME Type", PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false, false,
false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CONTENT_STREAM_FILE_NAME, "Filename",
"Filename", PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, inherited, false, false,
false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.CONTENT_STREAM_ID, "Content Stream Id",
"Content Stream Id", PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, inherited, false,
false, false));
}
protected void addFolderPropertyDefinitions(MutableFolderTypeDefinition type, CmisVersion cmisVersion,
boolean inherited) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.PARENT_ID, "Parent Id", "Parent Id",
PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, inherited, false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.PATH, "Path", "Path", PropertyType.STRING,
Cardinality.SINGLE, Updatability.READONLY, inherited, false, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS,
"Allowed Child Object Type Ids", "Allowed Child Object Type Ids", PropertyType.ID, Cardinality.MULTI,
Updatability.READONLY, inherited, false, false, false));
}
protected void addPolicyPropertyDefinitions(MutablePolicyTypeDefinition type, CmisVersion cmisVersion,
boolean inherited) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.POLICY_TEXT, "Policy Text", "Policy Text",
PropertyType.STRING, Cardinality.SINGLE, Updatability.READWRITE, inherited, false, false, false));
}
protected void addRelationshipPropertyDefinitions(MutableRelationshipTypeDefinition type, CmisVersion cmisVersion,
boolean inherited) {
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.SOURCE_ID, "Source Id", "Source Id",
PropertyType.ID, Cardinality.SINGLE, Updatability.READWRITE, inherited, true, false, false));
type.addPropertyDefinition(createPropertyDefinition(PropertyIds.TARGET_ID, "Target Id", "Target Id",
PropertyType.ID, Cardinality.SINGLE, Updatability.READWRITE, inherited, true, false, false));
}
}