/******************************************************************************* * Copyright (c) 2013 aegif. * * This file is part of NemakiWare. * * NemakiWare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NemakiWare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with NemakiWare. * If not, see <http://www.gnu.org/licenses/>. * * Contributors: * linzhixing(https://github.com/linzhixing) - initial API and implementation ******************************************************************************/ package jp.aegif.nemaki.cmis.aspect.type.impl; import java.lang.reflect.Field; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import jp.aegif.nemaki.businesslogic.TypeService; import jp.aegif.nemaki.cmis.aspect.type.TypeManager; import jp.aegif.nemaki.cmis.factory.info.RepositoryInfo; import jp.aegif.nemaki.cmis.factory.info.RepositoryInfoMap; import jp.aegif.nemaki.model.Content; import jp.aegif.nemaki.model.NemakiPropertyDefinition; import jp.aegif.nemaki.model.NemakiPropertyDefinitionCore; import jp.aegif.nemaki.model.NemakiPropertyDefinitionDetail; import jp.aegif.nemaki.model.NemakiTypeDefinition; import jp.aegif.nemaki.util.DataUtil; import jp.aegif.nemaki.util.PropertyManager; import jp.aegif.nemaki.util.constant.PropertyKey; import org.apache.chemistry.opencmis.commons.PropertyIds; 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.enums.Cardinality; 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.CmisInvalidArgumentException; import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition; import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractTypeDefinition; 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.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.server.CallContext; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; /** * Type Manager class */ public class TypeManagerImpl implements TypeManager { private RepositoryInfoMap repositoryInfoMap; private TypeService typeService; private PropertyManager propertyManager; /** * Constant */ private final static boolean REQUIRED = true; private final static boolean QUERYABLE = true; private final static boolean ORDERABLE = true; /** * Global variables containing type information */ // Map of all types //private Map<String, TypeDefinitionContainer> types; private Map<String, Map<String, TypeDefinitionContainer>> TYPES; // Map of all base types private Map<String, TypeDefinitionContainer> basetypes; // Map of subtype-specific property private Map<String, List<PropertyDefinition<?>>> subTypeProperties; // Map of propertyDefinition cores(id, name, queryName, propertyType) private Map<String, PropertyDefinition<?>> propertyDefinitionCoresForQueryName; // ///////////////////////////////////////////////// // Constructor // ///////////////////////////////////////////////// public void init() { initGlobalTypes(); basetypes = new HashMap<String, TypeDefinitionContainer>(); subTypeProperties = new HashMap<String, List<PropertyDefinition<?>>>(); propertyDefinitionCoresForQueryName = new HashMap<String, PropertyDefinition<?>>(); generate(); } private void initGlobalTypes(){ TYPES = new HashMap<String, Map<String,TypeDefinitionContainer>>(); for(String key : repositoryInfoMap.keys()){ TYPES.put(key, new HashMap<String, TypeDefinitionContainer>()); } } private void generate(){ for(String key : repositoryInfoMap.keys()){ generate(key); } } private void generate(String repositoryId) { // Generate basetypes addDocumentType(repositoryId); addFolderType(repositoryId); addRelationshipType(repositoryId); addPolicyType(repositoryId); addItemType(repositoryId); addSecondayType(repositoryId); // Generate subtypes addSubTypes(repositoryId); // Generate property definition cores buildPropertyDefinitionCores(repositoryId); } // ///////////////////////////////////////////////// // Refresh global variables from DB // ///////////////////////////////////////////////// @Override public void refreshTypes() { initGlobalTypes(); basetypes.clear(); basetypes = new HashMap<String, TypeDefinitionContainer>(); subTypeProperties.clear(); subTypeProperties = new HashMap<String, List<PropertyDefinition<?>>>(); generate(); } // ///////////////////////////////////////////////// // BaseType Generating Methods // ///////////////////////////////////////////////// private void addDocumentType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_DOCUMENT_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_DOCUMENT_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_DOCUMENT_DESCRIPTION); boolean creatable = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_CREATABLE); boolean fileable = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_FILEABLE); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_QUERYABLE); boolean controllablePolicy = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_CONTROLLABLE_POLICY); boolean controllableAcl = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_CONTROLLABLE_ACL); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_TYPE_MUTABILITY_CAN_DELETE); boolean versionable = propertyManager .readBoolean(PropertyKey.BASETYPE_DOCUMENT_VERSIONABLE); String _contentStreamAllowed = propertyManager .readValue(PropertyKey.BASETYPE_DOCUMENT_CONTENT_STREAM_ALLOWED); ContentStreamAllowed contentStreamAllowed = ContentStreamAllowed .fromValue(_contentStreamAllowed); // Set attributes DocumentTypeDefinitionImpl documentType = new DocumentTypeDefinitionImpl(); documentType.setId(BaseTypeId.CMIS_DOCUMENT.value()); documentType.setLocalName(localName); documentType.setLocalNamespace(getNameSpace(repositoryId)); documentType.setQueryName(BaseTypeId.CMIS_DOCUMENT.value()); documentType.setDisplayName(displayName); documentType.setDescription(description); documentType.setBaseTypeId(BaseTypeId.CMIS_DOCUMENT); documentType.setIsCreatable(creatable); documentType.setIsFileable(fileable); documentType.setIsQueryable(queryable); documentType.setIsControllablePolicy(controllablePolicy); documentType.setIsControllableAcl(controllableAcl); documentType.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); documentType.setIsFulltextIndexed(fulltextIndexed); documentType.setIsVersionable(versionable); documentType.setContentStreamAllowed(contentStreamAllowed); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); documentType.setTypeMutability(typeMutability); addBasePropertyDefinitions(repositoryId, documentType); addDocumentPropertyDefinitions(repositoryId, documentType); addTypeInternal(TYPES.get(repositoryId), documentType); addTypeInternal(basetypes, documentType); } private void addFolderType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_FOLDER_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_FOLDER_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_FOLDER_DESCRIPTION); boolean creatable = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_CREATABLE); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_QUERYABLE); boolean controllablePolicy = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_CONTROLLABLE_POLICY); boolean controllableAcl = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_CONTROLLABLE_ACL); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_FOLDER_TYPE_MUTABILITY_CAN_DELETE); // Set attributes FolderTypeDefinitionImpl folderType = new FolderTypeDefinitionImpl(); folderType.setId(BaseTypeId.CMIS_FOLDER.value()); folderType.setLocalName(localName); folderType.setLocalNamespace(getNameSpace(repositoryId)); folderType.setQueryName(BaseTypeId.CMIS_FOLDER.value()); folderType.setDisplayName(displayName); folderType.setBaseTypeId(BaseTypeId.CMIS_FOLDER); folderType.setDescription(description); folderType.setIsCreatable(creatable); folderType.setIsFileable(true); folderType.setIsQueryable(queryable); folderType.setIsControllablePolicy(controllablePolicy); folderType.setIsControllableAcl(controllableAcl); folderType.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); folderType.setIsFulltextIndexed(fulltextIndexed); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); folderType.setTypeMutability(typeMutability); addBasePropertyDefinitions(repositoryId, folderType); addFolderPropertyDefinitions(repositoryId, folderType); addTypeInternal(TYPES.get(repositoryId), folderType); addTypeInternal(basetypes, folderType); } private void addRelationshipType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_RELATIONSHIP_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_RELATIONSHIP_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_RELATIONSHIP_DESCRIPTION); boolean creatable = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_CREATABLE); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_QUERYABLE); boolean controllablePolicy = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_CONTROLLABLE_POLICY); boolean controllableAcl = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_CONTROLLABLE_ACL); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_RELATIONSHIP_TYPE_MUTABILITY_CAN_DELETE); List<String> allowedSourceTypes = propertyManager .readValues(PropertyKey.BASETYPE_RELATIONSHIP_ALLOWED_SOURCE_TYPES); List<String> allowedTargetTypes = propertyManager .readValues(PropertyKey.BASETYPE_RELATIONSHIP_ALLOWED_TARGET_TYPES); // Set attributes RelationshipTypeDefinitionImpl relationshipType = new RelationshipTypeDefinitionImpl(); relationshipType.setId(BaseTypeId.CMIS_RELATIONSHIP.value()); relationshipType.setLocalName(localName); relationshipType.setLocalNamespace(getNameSpace(repositoryId)); relationshipType.setQueryName(BaseTypeId.CMIS_RELATIONSHIP.value()); relationshipType.setDisplayName(displayName); relationshipType.setBaseTypeId(BaseTypeId.CMIS_RELATIONSHIP); relationshipType.setDescription(description); relationshipType.setIsCreatable(creatable); relationshipType.setIsFileable(false); relationshipType.setIsQueryable(queryable); relationshipType.setIsControllablePolicy(controllablePolicy); relationshipType.setIsControllableAcl(controllableAcl); relationshipType .setIsIncludedInSupertypeQuery(includedInSupertypeQuery); relationshipType.setIsFulltextIndexed(fulltextIndexed); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); relationshipType.setTypeMutability(typeMutability); relationshipType.setAllowedSourceTypes(allowedSourceTypes); relationshipType.setAllowedTargetTypes(allowedTargetTypes); addBasePropertyDefinitions(repositoryId, relationshipType); addRelationshipPropertyDefinitions(repositoryId, relationshipType); addTypeInternal(TYPES.get(repositoryId), relationshipType); addTypeInternal(basetypes, relationshipType); } private void addPolicyType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_POLICY_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_POLICY_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_POLICY_DESCRIPTION); boolean creatable = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_CREATABLE); boolean fileable = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_FILEABLE); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_QUERYABLE); boolean controllablePolicy = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_CONTROLLABLE_POLICY); boolean controllableAcl = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_CONTROLLABLE_ACL); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_POLICY_TYPE_MUTABILITY_CAN_DELETE); // Set attributes PolicyTypeDefinitionImpl policyType = new PolicyTypeDefinitionImpl(); policyType.setId(BaseTypeId.CMIS_POLICY.value()); policyType.setLocalName(localName); policyType.setLocalNamespace(getNameSpace(repositoryId)); policyType.setQueryName(BaseTypeId.CMIS_POLICY.value()); policyType.setDisplayName(displayName); policyType.setBaseTypeId(BaseTypeId.CMIS_POLICY); policyType.setDescription(description); policyType.setIsCreatable(creatable); policyType.setIsFileable(fileable); policyType.setIsQueryable(queryable); policyType.setIsControllablePolicy(controllablePolicy); policyType.setIsControllableAcl(controllableAcl); policyType.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); policyType.setIsFulltextIndexed(fulltextIndexed); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); policyType.setTypeMutability(typeMutability); addBasePropertyDefinitions(repositoryId, policyType); addPolicyPropertyDefinitions(repositoryId, policyType); addTypeInternal(TYPES.get(repositoryId), policyType); addTypeInternal(basetypes, policyType); } private void addItemType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_ITEM_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_ITEM_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_ITEM_DESCRIPTION); boolean creatable = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_CREATABLE); boolean fileable = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_FILEABLE); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_QUERYABLE); boolean controllablePolicy = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_CONTROLLABLE_POLICY); boolean controllableAcl = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_CONTROLLABLE_ACL); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_ITEM_TYPE_MUTABILITY_CAN_DELETE); // Set attributes ItemTypeDefinitionImpl itemType = new ItemTypeDefinitionImpl(); itemType.setId(BaseTypeId.CMIS_ITEM.value()); itemType.setLocalName(localName); itemType.setLocalNamespace(getNameSpace(repositoryId)); itemType.setQueryName(BaseTypeId.CMIS_ITEM.value()); itemType.setDisplayName(displayName); itemType.setBaseTypeId(BaseTypeId.CMIS_ITEM); itemType.setDescription(description); itemType.setIsCreatable(creatable); itemType.setIsFileable(fileable); itemType.setIsQueryable(queryable); itemType.setIsControllablePolicy(controllablePolicy); itemType.setIsControllableAcl(controllableAcl); itemType.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); itemType.setIsFulltextIndexed(fulltextIndexed); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); itemType.setTypeMutability(typeMutability); addBasePropertyDefinitions(repositoryId, itemType); addTypeInternal(TYPES.get(repositoryId), itemType); addTypeInternal(basetypes, itemType); } private void addSecondayType(String repositoryId) { // Read parameters String localName = propertyManager .readValue(PropertyKey.BASETYPE_SECONDARY_LOCAL_NAME); String displayName = propertyManager .readValue(PropertyKey.BASETYPE_SECONDARY_DISPLAY_NAME); String description = propertyManager .readValue(PropertyKey.BASETYPE_SECONDARY_DESCRIPTION); boolean queryable = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_QUERYABLE); boolean includedInSupertypeQuery = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_INCLUDED_IN_SUPER_TYPE_QUERY); boolean fulltextIndexed = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_FULLTEXT_INDEXED); boolean typeMutabilityCanCreate = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_TYPE_MUTABILITY_CAN_CREATE); boolean typeMutabilityCanUpdate = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_TYPE_MUTABILITY_CAN_UPDATE); boolean typeMutabilityCanDelete = propertyManager .readBoolean(PropertyKey.BASETYPE_SECONDARY_TYPE_MUTABILITY_CAN_DELETE); // Set attributes SecondaryTypeDefinitionImpl secondaryType = new SecondaryTypeDefinitionImpl(); secondaryType.setId(BaseTypeId.CMIS_SECONDARY.value()); secondaryType.setLocalName(localName); secondaryType.setLocalNamespace(getNameSpace(repositoryId)); secondaryType.setQueryName(BaseTypeId.CMIS_SECONDARY.value()); secondaryType.setDisplayName(displayName); secondaryType.setBaseTypeId(BaseTypeId.CMIS_SECONDARY); secondaryType.setDescription(description); secondaryType.setIsCreatable(false); secondaryType.setIsFileable(false); secondaryType.setIsQueryable(queryable); secondaryType.setIsControllablePolicy(false); secondaryType.setIsControllableAcl(false); secondaryType.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); secondaryType.setIsFulltextIndexed(fulltextIndexed); secondaryType .setPropertyDefinitions(new HashMap<String, PropertyDefinition<?>>()); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(typeMutabilityCanCreate); typeMutability.setCanUpdate(typeMutabilityCanUpdate); typeMutability.setCanDelete(typeMutabilityCanDelete); secondaryType.setTypeMutability(typeMutability); secondaryType .setPropertyDefinitions(new HashMap<String, PropertyDefinition<?>>()); addTypeInternal(TYPES.get(repositoryId), secondaryType); addTypeInternal(basetypes, secondaryType); } private void addBasePropertyDefinitions(String repositoryId, AbstractTypeDefinition type) { //cmis:name String _updatability_name = propertyManager.readValue(PropertyKey.PROPERTY_NAME_UPDATABILITY); Updatability updatability_name = Updatability.fromValue(_updatability_name); boolean queryable_name = propertyManager.readBoolean(PropertyKey.PROPERTY_NAME_QUERYABLE); boolean orderable_name = propertyManager.readBoolean(PropertyKey.PROPERTY_NAME_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.NAME, PropertyType.STRING, Cardinality.SINGLE, updatability_name, REQUIRED, queryable_name, orderable_name, null)); //cmis:description String _updatability_description = propertyManager.readValue(PropertyKey.PROPERTY_DESCRIPTION_UPDATABILITY); Updatability updatability_description = Updatability.fromValue(_updatability_description); boolean queryable_description = propertyManager.readBoolean(PropertyKey.PROPERTY_DESCRIPTION_QUERYABLE); boolean orderable_description = propertyManager.readBoolean(PropertyKey.PROPERTY_DESCRIPTION_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.DESCRIPTION, PropertyType.STRING, Cardinality.SINGLE, updatability_description, !REQUIRED, queryable_description, orderable_description, null)); //cmis:objectId boolean orderable_objectId = propertyManager.readBoolean(PropertyKey.PROPERTY_OBJECT_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.OBJECT_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, QUERYABLE, orderable_objectId, null)); //cmis:baseTypeId boolean queryable_baseTypeId = propertyManager.readBoolean(PropertyKey.PROPERTY_BASE_TYPE_ID_QUERYABLE); boolean orderable_baseTypeId = propertyManager.readBoolean(PropertyKey.PROPERTY_BASE_TYPE_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.BASE_TYPE_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_baseTypeId, orderable_baseTypeId, null)); //cmis:objectTypeId boolean queryable_objectTypeId = propertyManager.readBoolean(PropertyKey.PROPERTY_OBJECT_TYPE_ID_QUERYABLE); boolean orderable_objectTypeId = propertyManager.readBoolean(PropertyKey.PROPERTY_OBJECT_TYPE_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.OBJECT_TYPE_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.ONCREATE, REQUIRED, queryable_objectTypeId, orderable_objectTypeId, null)); //cmis:secondaryObjectTypeIds String _updatability_secondaryObjectTypeIds = propertyManager.readValue(PropertyKey.PROPERTY_SECONDARY_OBJECT_TYPE_IDS_UPDATABILITY); Updatability updatability_secondaryObjectTypeIds = Updatability.fromValue(_updatability_secondaryObjectTypeIds); boolean queryable_secondaryObjectTypeIds = propertyManager.readBoolean(PropertyKey.PROPERTY_SECONDARY_OBJECT_TYPE_IDS_QUERYABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.SECONDARY_OBJECT_TYPE_IDS, PropertyType.ID, Cardinality.MULTI, updatability_secondaryObjectTypeIds, !REQUIRED, queryable_secondaryObjectTypeIds, !ORDERABLE, null)); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.CREATED_BY, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, QUERYABLE, ORDERABLE, null)); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CREATION_DATE, PropertyType.DATETIME, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, QUERYABLE, ORDERABLE, null)); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.LAST_MODIFIED_BY, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, QUERYABLE, ORDERABLE, null)); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.LAST_MODIFICATION_DATE, PropertyType.DATETIME, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, QUERYABLE, ORDERABLE, null)); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CHANGE_TOKEN, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, !QUERYABLE, !ORDERABLE, null)); } private void addFolderPropertyDefinitions(String repositoryId, FolderTypeDefinitionImpl type) { //cmis:parentId boolean queryable_parentId = propertyManager.readBoolean(PropertyKey.PROPERTY_PARENT_ID_QUERYABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.PARENT_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_parentId, !ORDERABLE, null)); //cmis:path boolean queryable_path = propertyManager.readBoolean(PropertyKey.PROPERTY_PATH_QUERYABLE); boolean orderable_path = propertyManager.readBoolean(PropertyKey.PROPERTY_PATH_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.PATH, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_path, orderable_path, null)); List<String> defaults = new ArrayList<String>(); defaults.add(BaseTypeId.CMIS_FOLDER.value()); defaults.add(BaseTypeId.CMIS_DOCUMENT.value()); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, PropertyType.ID, Cardinality.MULTI, Updatability.READONLY, !REQUIRED, !QUERYABLE, !ORDERABLE, defaults)); } private void addDocumentPropertyDefinitions(String repositoryId, DocumentTypeDefinitionImpl type) { //cmis:isImmutable boolean queryable_isImmutable = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_IMMUTABLE_QUERYABLE); boolean orderable_isImmutable = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_IMMUTABLE_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_IMMUTABLE, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isImmutable, orderable_isImmutable, Arrays.asList(false))); //cmis:isLatestVersion boolean queryable_isLatestVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_LATEST_VERSION_QUERYABLE); boolean orderable_isLatestVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_LATEST_VERSION_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_LATEST_VERSION, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isLatestVersion, orderable_isLatestVersion, null)); //cmis:isMajorVersion boolean queryable_isMajorVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_MAJOR_VERSION_QUERYABLE); boolean orderable_isMajorVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_MAJOR_VERSION_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_MAJOR_VERSION, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isMajorVersion, orderable_isMajorVersion, null)); //cmis:isLatestMajorVersion boolean queryable_isLatestMajorVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_LATEST_MAJOR_VERSION_QUERYABLE); boolean orderable_isLatestMajorVersion = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_LATEST_MAJOR_VERSION_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_LATEST_MAJOR_VERSION, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isLatestMajorVersion, orderable_isLatestMajorVersion, null)); //cmis:isPrivateWorkingCopy boolean queryable_isPrivateWorkingCopy = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_PRIVATE_WORKING_COPY_QUERYABLE); boolean orderable_isPrivateWorkingCopy = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_PRIVATE_WORKING_COPY_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_PRIVATE_WORKING_COPY, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isPrivateWorkingCopy, orderable_isPrivateWorkingCopy, null)); //cmis:versionLabel boolean queryable_versionLabel = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_LABEL_QUERYABLE); boolean orderable_versionLabel = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_LABEL_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.VERSION_LABEL, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_versionLabel, orderable_versionLabel, null)); //cmis:versionSeriesId boolean queryable_versionSeriesId = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_ID_QUERYABLE); boolean orderable_versionSeriesId = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.VERSION_SERIES_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_versionSeriesId, orderable_versionSeriesId, null)); //cmis:isVersionSeriesCheckedOut boolean queryable_isVersionSeriesCheckedOut = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_VERSION_SERIES_CHECKED_OUT_QUERYABLE); boolean orderable_isVersionSeriesCheckedOut = propertyManager.readBoolean(PropertyKey.PROPERTY_IS_VERSION_SERIES_CHECKED_OUT_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, PropertyType.BOOLEAN, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_isVersionSeriesCheckedOut, orderable_isVersionSeriesCheckedOut, null)); //cmis:versionSeriesCheckedOutBy boolean queryable_versionSeriesCheckedOutBy = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_CHECKED_OUT_BY_QUERYABLE); boolean orderable_versionSeriesCheckedOutBy = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_CHECKED_OUT_BY_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_versionSeriesCheckedOutBy, orderable_versionSeriesCheckedOutBy, null)); //cmis:versionSeriesCheckedOutId boolean queryable_versionSeriesCheckedOutId = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_CHECKED_OUT_ID_QUERYABLE); boolean orderable_versionSeriesCheckedOutId = propertyManager.readBoolean(PropertyKey.PROPERTY_VERSION_SERIES_CHECKED_OUT_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_versionSeriesCheckedOutId, orderable_versionSeriesCheckedOutId, null)); //cmis:checkInComment boolean queryable_checkInComment = propertyManager.readBoolean(PropertyKey.PROPERTY_CHECK_IN_COMMENT_QUERYABLE); boolean orderable_checkInComment = propertyManager.readBoolean(PropertyKey.PROPERTY_CHECK_IN_COMMENT_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CHECKIN_COMMENT, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_checkInComment, orderable_checkInComment, null)); //cmis:contentStreamLength boolean queryable_contentStreamLength = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_LENGTH_QUERYABLE); boolean orderable_contentStreamLength = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_LENGTH_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CONTENT_STREAM_LENGTH, PropertyType.INTEGER, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_contentStreamLength, orderable_contentStreamLength, null)); //cmis:contentStreamMimeType boolean queryable_contentStreamMimeType = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_MIME_TYPE_QUERYABLE); boolean orderable_contentStreamMimeType = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_MIME_TYPE_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CONTENT_STREAM_MIME_TYPE, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_contentStreamMimeType, orderable_contentStreamMimeType, null)); //cmis:contentStreamMimeType boolean queryable_contentStreamFileName = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_FILE_NAME_QUERYABLE); boolean orderable_contentStreamFileName = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_FILE_NAME_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CONTENT_STREAM_FILE_NAME, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_contentStreamFileName, orderable_contentStreamFileName, null)); //cmis:contentStreamId boolean queryable_contentStreamId = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_ID_QUERYABLE); boolean orderable_contentStreamId = propertyManager.readBoolean(PropertyKey.PROPERTY_CONTENT_STREAM_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.CONTENT_STREAM_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_contentStreamId, orderable_contentStreamId, null)); } private void addRelationshipPropertyDefinitions( String repositoryId, RelationshipTypeDefinitionImpl type) { //cmis:sourceId boolean queryable_sourceId = propertyManager.readBoolean(PropertyKey.PROPERTY_SOURCE_ID_QUERYABLE); boolean orderable_sourceId = propertyManager.readBoolean(PropertyKey.PROPERTY_SOURCE_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.SOURCE_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READWRITE, REQUIRED, queryable_sourceId, orderable_sourceId, null)); //cmis:targetId boolean queryable_targetId = propertyManager.readBoolean(PropertyKey.PROPERTY_TARGET_ID_QUERYABLE); boolean orderable_targetId = propertyManager.readBoolean(PropertyKey.PROPERTY_TARGET_ID_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef(repositoryId, PropertyIds.TARGET_ID, PropertyType.ID, Cardinality.SINGLE, Updatability.READWRITE, REQUIRED, queryable_targetId, orderable_targetId, null)); } private void addPolicyPropertyDefinitions(String repositoryId, PolicyTypeDefinitionImpl type) { //cmis:policyText boolean queryable_policyText = propertyManager.readBoolean(PropertyKey.PROPERTY_POLICY_TEXT_QUERYABLE); boolean orderable_policyText = propertyManager.readBoolean(PropertyKey.PROPERTY_POLICY_TEXT_ORDERABLE); type.addPropertyDefinition(createDefaultPropDef( repositoryId, PropertyIds.POLICY_TEXT, PropertyType.STRING, Cardinality.SINGLE, Updatability.READONLY, !REQUIRED, queryable_policyText, orderable_policyText, null)); } private PropertyDefinition<?> createDefaultPropDef(String repositoryId, String id, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean required, boolean queryable, boolean orderable, List<?> defaultValue) { PropertyDefinition<?> result = null; // Default values String localName = id; String localNameSpace = getNameSpace(repositoryId); String queryName = id; String displayName = id; String description = id; boolean inherited = false; boolean openChoice = false; result = DataUtil.createPropDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, required, queryable, inherited, null, openChoice, orderable, defaultValue, null, null, null, null, null, null, null); return result; } private String getNameSpace(String repositoryId){ return repositoryInfoMap.get(repositoryId).getNameSpace(); } // ///////////////////////////////////////////////// // Subtype // ///////////////////////////////////////////////// private List<NemakiTypeDefinition> getNemakiTypeDefinitions(String repositoryId) { return typeService.getTypeDefinitions(repositoryId); } private void addSubTypes(){ for(String key : repositoryInfoMap.keys()){ RepositoryInfo info = repositoryInfoMap.get(key); String repositoryId = info.getId(); addSubTypes(repositoryId); } } private void addSubTypes(String repositoryId) { List<NemakiTypeDefinition> subtypes = getNemakiTypeDefinitions(repositoryId); List<NemakiTypeDefinition> firstGeneration = new ArrayList<NemakiTypeDefinition>(); if(CollectionUtils.isNotEmpty(subtypes)){ for (NemakiTypeDefinition subtype : subtypes) { if (subtype.getBaseId().value().equals(subtype.getParentId())) { firstGeneration.add(subtype); } } for (NemakiTypeDefinition type : firstGeneration) { addSubTypesInternal(repositoryId, subtypes, type); } } return; } private void addSubTypesInternal(String repositoryId, List<NemakiTypeDefinition> subtypes, NemakiTypeDefinition type) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); TypeDefinitionContainerImpl container = new TypeDefinitionContainerImpl(); container.setTypeDefinition(buildTypeDefinitionFromDB(repositoryId, type)); container.setChildren(new ArrayList<TypeDefinitionContainer>()); if (types.get(type.getTypeId()) == null) { types.put(type.getTypeId(), container); } else { // TODO logging: can't overwrite the type } List<NemakiTypeDefinition> children = new ArrayList<NemakiTypeDefinition>(); for (NemakiTypeDefinition subtype : subtypes) { if (subtype.getParentId().equals(type.getTypeId())) { children.add(subtype); } } if (!CollectionUtils.isEmpty(children)) { for (NemakiTypeDefinition child : children) { addSubTypesInternal(repositoryId, subtypes, child); } } TypeDefinitionContainer parentContainer = types.get(type.getParentId()); parentContainer.getChildren().add(container); return; } @Override public AbstractTypeDefinition buildTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { switch (nemakiType.getBaseId()) { case CMIS_DOCUMENT: return buildDocumentTypeDefinitionFromDB(repositoryId, nemakiType); case CMIS_FOLDER: return buildFolderTypeDefinitionFromDB(repositoryId, nemakiType); case CMIS_RELATIONSHIP: return buildRelationshipTypeDefinitionFromDB(repositoryId, nemakiType); case CMIS_POLICY: return buildPolicyTypeDefinitionFromDB(repositoryId, nemakiType); case CMIS_ITEM: return buildItemTypeDefinitionFromDB(repositoryId, nemakiType); case CMIS_SECONDARY: return buildSecondaryTypeDefinitionFromDB(repositoryId, nemakiType); default: break; } return null; } private void buildTypeDefinitionBaseFromDB(String repositoryId, AbstractTypeDefinition type, AbstractTypeDefinition parentType, NemakiTypeDefinition nemakiType) { type.setId(nemakiType.getTypeId()); type.setLocalName(nemakiType.getLocalName()); type.setLocalNamespace(nemakiType.getLocalNameSpace()); type.setQueryName(nemakiType.getQueryName()); type.setDisplayName(nemakiType.getDisplayName()); type.setBaseTypeId(nemakiType.getBaseId()); type.setParentTypeId(nemakiType.getParentId()); type.setDescription(nemakiType.getDescription()); boolean creatable = (nemakiType.isCreatable() == null) ? parentType .isCreatable() : nemakiType.isCreatable(); type.setIsCreatable(creatable); boolean filable = (nemakiType.isFilable() == null) ? parentType .isFileable() : nemakiType.isFilable(); type.setIsFileable(filable); boolean queryable = (nemakiType.isQueryable() == null) ? parentType .isQueryable() : nemakiType.isQueryable(); type.setIsQueryable(queryable); boolean controllablePolicy = (nemakiType.isControllablePolicy() == null) ? parentType .isControllablePolicy() : nemakiType.isControllablePolicy(); type.setIsControllablePolicy(controllablePolicy); boolean controllableACL = (nemakiType.isControllableACL() == null) ? parentType .isControllableAcl() : nemakiType.isControllableACL(); type.setIsControllableAcl(controllableACL); boolean fulltextIndexed = (nemakiType.isFulltextIndexed() == null) ? parentType .isFulltextIndexed() : nemakiType.isFulltextIndexed(); type.setIsFulltextIndexed(fulltextIndexed); boolean includedInSupertypeQuery = (nemakiType .isIncludedInSupertypeQuery() == null) ? parentType .isIncludedInSupertypeQuery() : nemakiType .isIncludedInSupertypeQuery(); type.setIsIncludedInSupertypeQuery(includedInSupertypeQuery); // Type Mutability boolean create = (nemakiType.isTypeMutabilityCreate() == null) ? parentType .getTypeMutability().canCreate() : nemakiType .isTypeMutabilityCreate(); boolean update = (nemakiType.isTypeMutabilityUpdate() == null) ? parentType .getTypeMutability().canUpdate() : nemakiType .isTypeMutabilityUpdate(); boolean delete = (nemakiType.isTypeMutabilityDelete() == null) ? parentType .getTypeMutability().canDelete() : nemakiType .isTypeMutabilityDelete(); TypeMutabilityImpl typeMutability = new TypeMutabilityImpl(); typeMutability.setCanCreate(create); typeMutability.setCanUpdate(update); typeMutability.setCanDelete(delete); type.setTypeMutability(typeMutability); // Inherit parent's properties TypeDefinition copied = DataUtil.copyTypeDefinition(parentType); Map<String, PropertyDefinition<?>> parentProperties = copied .getPropertyDefinitions(); if (MapUtils.isEmpty(parentProperties)) { parentProperties = new HashMap<String, PropertyDefinition<?>>(); } for (String key : parentProperties.keySet()) { PropertyDefinition<?> parentProperty = parentProperties.get(key); setInheritedToTrue((AbstractPropertyDefinition<?>) parentProperty); } type.setPropertyDefinitions(parentProperties); // Add specific properties // TODO if there is the same id with that of the inherited, check the // difference of attributes Map<String, PropertyDefinition<?>> properties = type .getPropertyDefinitions(); List<PropertyDefinition<?>> specificProperties = new ArrayList<PropertyDefinition<?>>(); if (!CollectionUtils.isEmpty(nemakiType.getProperties())) { for (String propertyId : nemakiType.getProperties()) { NemakiPropertyDefinitionDetail detail = typeService .getPropertyDefinitionDetail(repositoryId, propertyId); NemakiPropertyDefinitionCore core = typeService .getPropertyDefinitionCore(repositoryId, detail.getCoreNodeId()); NemakiPropertyDefinition p = new NemakiPropertyDefinition(core, detail); PropertyDefinition<?> property = DataUtil.createPropDef( p.getPropertyId(), p.getLocalName(), p.getLocalNameSpace(), p.getQueryName(), p.getDisplayName(), p.getDescription(), p.getPropertyType(), p.getCardinality(), p.getUpdatability(), p.isRequired(), p.isQueryable(), false, p.getChoices(), p.isOpenChoice(), p.isOrderable(), p.getDefaultValue(), p.getMinValue(), p.getMaxValue(), p.getResolution(), p.getDecimalPrecision(), p.getDecimalMinValue(), p.getDecimalMaxValue(), p.getMaxLength()); properties.put(p.getPropertyId(), property); // for subTypeProperties // ignore null property (List index will be lost) if (property != null) { specificProperties.add(property); } } } // for subTypeProperties if (subTypeProperties.containsKey(type.getParentTypeId())) { List<PropertyDefinition<?>> parentSpecificProperties = subTypeProperties .get(type.getParentTypeId()); // subTypeProperties.put(type.getId(), specificProperties); specificProperties.addAll(parentSpecificProperties); subTypeProperties.put(type.getId(), specificProperties); } else { subTypeProperties.put(type.getId(), specificProperties); } } private AbstractPropertyDefinition<?> setInheritedToTrue( AbstractPropertyDefinition<?> property) { property.setIsInherited(true); return property; } private DocumentTypeDefinitionImpl buildDocumentTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); DocumentTypeDefinitionImpl type = new DocumentTypeDefinitionImpl(); DocumentTypeDefinitionImpl parentType = (DocumentTypeDefinitionImpl) types .get(nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); // Add specific attributes ContentStreamAllowed contentStreamAllowed = (nemakiType .getContentStreamAllowed() == null) ? parentType .getContentStreamAllowed() : nemakiType .getContentStreamAllowed(); type.setContentStreamAllowed(contentStreamAllowed); boolean versionable = (nemakiType.isVersionable() == null) ? parentType .isVersionable() : nemakiType.isVersionable(); type.setIsVersionable(versionable); return type; } private FolderTypeDefinitionImpl buildFolderTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); FolderTypeDefinitionImpl type = new FolderTypeDefinitionImpl(); FolderTypeDefinitionImpl parentType = (FolderTypeDefinitionImpl) types .get(nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); return type; } private RelationshipTypeDefinitionImpl buildRelationshipTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); RelationshipTypeDefinitionImpl type = new RelationshipTypeDefinitionImpl(); RelationshipTypeDefinitionImpl parentType = (RelationshipTypeDefinitionImpl) types .get(nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); // Set specific attributes type.setAllowedSourceTypes(nemakiType.getAllowedSourceTypes()); type.setAllowedTargetTypes(nemakiType.getAllowedTargetTypes()); return type; } private PolicyTypeDefinitionImpl buildPolicyTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); PolicyTypeDefinitionImpl type = new PolicyTypeDefinitionImpl(); PolicyTypeDefinitionImpl parentType = (PolicyTypeDefinitionImpl) types .get(nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); return type; } private ItemTypeDefinitionImpl buildItemTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); ItemTypeDefinitionImpl type = new ItemTypeDefinitionImpl(); ItemTypeDefinitionImpl parentType = (ItemTypeDefinitionImpl) types.get( nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); return type; } private SecondaryTypeDefinitionImpl buildSecondaryTypeDefinitionFromDB( String repositoryId, NemakiTypeDefinition nemakiType) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); SecondaryTypeDefinitionImpl type = new SecondaryTypeDefinitionImpl(); SecondaryTypeDefinitionImpl parentType = (SecondaryTypeDefinitionImpl) types .get(nemakiType.getParentId()).getTypeDefinition(); // Set base attributes, and properties(with specific properties // included) buildTypeDefinitionBaseFromDB(repositoryId, type, parentType, nemakiType); return type; } private void buildPropertyDefinitionCores(String repositoryId) { Map<String, TypeDefinitionContainer>types = TYPES.get(repositoryId); // CMIS default property cores Map<String, PropertyDefinition<?>> d = types.get(BaseTypeId.CMIS_DOCUMENT.value()) .getTypeDefinition().getPropertyDefinitions(); Map<String, PropertyDefinition<?>> f = types.get(BaseTypeId.CMIS_FOLDER.value()) .getTypeDefinition().getPropertyDefinitions(); Map<String, PropertyDefinition<?>> r = types.get(BaseTypeId.CMIS_RELATIONSHIP.value()) .getTypeDefinition().getPropertyDefinitions(); Map<String, PropertyDefinition<?>> p = types.get(BaseTypeId.CMIS_POLICY.value()) .getTypeDefinition().getPropertyDefinitions(); Map<String, PropertyDefinition<?>> i = types.get(BaseTypeId.CMIS_ITEM.value()) .getTypeDefinition().getPropertyDefinitions(); copyToPropertyDefinitionCore(d); copyToPropertyDefinitionCore(f); copyToPropertyDefinitionCore(r); copyToPropertyDefinitionCore(p); copyToPropertyDefinitionCore(i); // Subtype property cores(consequently includes secondary property // cores) List<NemakiPropertyDefinitionCore> subTypeCores = typeService .getPropertyDefinitionCores(repositoryId); if (CollectionUtils.isNotEmpty(subTypeCores)) { for (NemakiPropertyDefinitionCore sc : subTypeCores) { addPropertyDefinitionCore(sc.getPropertyId(), sc.getQueryName(), sc.getPropertyType(), sc.getCardinality()); } } } private void copyToPropertyDefinitionCore( Map<String, PropertyDefinition<?>> map) { for (Entry<String, PropertyDefinition<?>> e : map.entrySet()) { if (!propertyDefinitionCoresForQueryName.containsKey(e.getKey())) { PropertyDefinition<?> pdf = e.getValue(); addPropertyDefinitionCore(pdf.getId(), pdf.getQueryName(), pdf.getPropertyType(), pdf.getCardinality()); } } } private void addPropertyDefinitionCore(String propertyId, String queryName, PropertyType propertyType, Cardinality cardinality) { if (!propertyDefinitionCoresForQueryName.containsKey(propertyId)) { PropertyDefinition<?> core = DataUtil.createPropDefCore(propertyId, queryName, propertyType, cardinality); propertyDefinitionCoresForQueryName.put(queryName, core); } } // ///////////////////////////////////////////////// // Type Service Methods // ///////////////////////////////////////////////// @Override public TypeDefinitionContainer getTypeById(String repositoryId, String typeId) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); return types.get(typeId); } @Override public TypeDefinition getTypeByQueryName(String repositoryId, String typeQueryName) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); for (Entry<String, TypeDefinitionContainer> entry : types.entrySet()) { if (entry.getValue().getTypeDefinition().getQueryName() .equals(typeQueryName)) return entry.getValue().getTypeDefinition(); } return null; } @Override public Collection<TypeDefinitionContainer> getTypeDefinitionList(String repositoryId) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); List<TypeDefinitionContainer> typeRoots = new ArrayList<TypeDefinitionContainer>(); // iterate types map and return a list collecting the root types: for (TypeDefinitionContainer typeDef : types.values()) { if (typeDef.getTypeDefinition().getParentTypeId() == null) { typeRoots.add(typeDef); } } return typeRoots; } @Override public List<TypeDefinitionContainer> getRootTypes(String repositoryId) { List<TypeDefinitionContainer> rootTypes = new ArrayList<TypeDefinitionContainer>(); for (String key : basetypes.keySet()) { rootTypes.add(basetypes.get(key)); } return rootTypes; } @Override public String getPropertyIdForQueryName(String repositoryId, TypeDefinition typeDefinition, String propQueryName) { PropertyDefinition<?> def = getPropertyDefinitionForQueryName( repositoryId, typeDefinition, propQueryName); if (def == null) { return null; } else { return def.getQueryName(); } } @Override public PropertyDefinition<?> getPropertyDefinitionForQueryName( String repositoryId, TypeDefinition typeDefinition, String propQueryName) { Map<String, PropertyDefinition<?>> defs = typeDefinition .getPropertyDefinitions(); for (Entry<String, PropertyDefinition<?>> def : defs.entrySet()) { if (def.getValue().getQueryName().equals(propQueryName)) { return def.getValue(); } } return null; } @Override public PropertyDefinition<?> getPropertyDefinitionCoreForQueryName( String queryName) { return propertyDefinitionCoresForQueryName.get(queryName); } @Override public TypeDefinition getTypeDefinition(String repositoryId, String typeId) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); TypeDefinitionContainer tc = types.get(typeId); if (tc == null) { return null; } return tc.getTypeDefinition(); } @Override public List<PropertyDefinition<?>> getSpecificPropertyDefinitions( String typeId) { return subTypeProperties.get(typeId); } /** * CMIS getTypesChildren. If parent type id is not specified, return only * base types. */ @Override public TypeDefinitionList getTypesChildren(CallContext context, String repositoryId, String typeId, boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); TypeDefinitionListImpl result = new TypeDefinitionListImpl( new ArrayList<TypeDefinition>()); int skip = (skipCount == null ? 0 : skipCount.intValue()); if (skip < 0) { skip = 0; } int max = (maxItems == null ? Integer.MAX_VALUE : maxItems.intValue()); if (max < 1) { return result; } if (typeId == null) { int count = skip; for (String key : basetypes.keySet()) { count--; if (count >= 0) continue; TypeDefinitionContainer type = basetypes.get(key); result.getList().add( DataUtil.copyTypeDefinition(type.getTypeDefinition())); } result.setHasMoreItems((result.getList().size() + skip) < max); result.setNumItems(BigInteger.valueOf(basetypes.size())); } else { TypeDefinitionContainer tc = types.get(typeId); if ((tc == null) || (tc.getChildren() == null)) { return result; } for (TypeDefinitionContainer child : tc.getChildren()) { if (skip > 0) { skip--; continue; } result.getList().add( DataUtil.copyTypeDefinition(child.getTypeDefinition())); max--; if (max == 0) { break; } } result.setHasMoreItems((result.getList().size() + skip) < tc .getChildren().size()); result.setNumItems(BigInteger.valueOf(tc.getChildren().size())); } if (!includePropertyDefinitions) { for (TypeDefinition type : result.getList()) { try { if (type.getPropertyDefinitions() != null) { type.getPropertyDefinitions().clear(); } } catch (Exception e) { e.printStackTrace(); } } } return result; } /** * CMIS getTypesDescendants. */ @Override public List<TypeDefinitionContainer> getTypesDescendants(String repositoryId, String typeId, BigInteger depth, Boolean includePropertyDefinitions) { Map<String, TypeDefinitionContainer> types = TYPES.get(repositoryId); List<TypeDefinitionContainer> result = new ArrayList<TypeDefinitionContainer>(); // check depth int d = (depth == null ? -1 : depth.intValue()); if (d == 0) { throw new CmisInvalidArgumentException("Depth must not be 0!"); } else if (d < -1) { throw new CmisInvalidArgumentException( "Depth must be positive(except for -1, that means infinity!"); } // set property definition flag to default value if not set boolean ipd = (includePropertyDefinitions == null ? false : includePropertyDefinitions.booleanValue()); if (typeId == null) { flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_FOLDER.value()), result, d, ipd); flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_DOCUMENT.value()), result, d, ipd); flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_RELATIONSHIP.value()), result, d, ipd); flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_POLICY.value()), result, d, ipd); flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_ITEM.value()), result, d, ipd); flattenTypeDefinitionContainer(types.get(BaseTypeId.CMIS_SECONDARY.value()), result, d, ipd); } else { TypeDefinitionContainer tdc = types.get(typeId); flattenTypeDefinitionContainer(tdc, result, d, ipd); } return result; } private void flattenTypeDefinitionContainer(TypeDefinitionContainer tdc, List<TypeDefinitionContainer> result, int depth, boolean includePropertyDefinitions) { if (depth == 0) return; if (includePropertyDefinitions) { result.add(tdc); } else { result.add(removeProeprtyDefinition(tdc)); } List<TypeDefinitionContainer> children = tdc.getChildren(); if (CollectionUtils.isNotEmpty(children)) { for (TypeDefinitionContainer child : children) { flattenTypeDefinitionContainer(child, result, depth - 1, includePropertyDefinitions); } } } private TypeDefinitionContainer removeProeprtyDefinition( TypeDefinitionContainer tdc) { // Remove from its own typeDefinition TypeDefinition tdf = tdc.getTypeDefinition(); TypeDefinition copy = DataUtil.copyTypeDefinition(tdf); Map<String, PropertyDefinition<?>> propDefs = copy .getPropertyDefinitions(); if (MapUtils.isNotEmpty(propDefs)) { propDefs.clear(); } TypeDefinitionContainerImpl result = new TypeDefinitionContainerImpl( copy); // Remove from children recursively List<TypeDefinitionContainer> children = tdc.getChildren(); if (CollectionUtils.isNotEmpty(children)) { List<TypeDefinitionContainer> l = new ArrayList<TypeDefinitionContainer>(); for (TypeDefinitionContainer child : children) { l.add(removeProeprtyDefinition(child)); } result.setChildren(l); } return result; } /** * Get a type definition Internal Use * @param content * * @return */ @Override public TypeDefinition getTypeDefinition(String repositoryId, Content content) { String typeId = (content.getObjectType() == null) ? content.getType() : content.getObjectType(); return getTypeDefinition(repositoryId, typeId); } /** * List up specification-default property ids * * @return */ @Override public List<String> getSystemPropertyIds() { List<String> ids = new ArrayList<String>(); Field[] fields = PropertyIds.class.getDeclaredFields(); for (Field field : fields) { try { String cmisId = (String) (field.get(null)); ids.add(cmisId); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return ids; } public void addTypeDefinition(String repositoryId, TypeDefinition typeDefinition, boolean addInheritedProperties) { // TODO Auto-generated method stub } public void updateTypeDefinition(String repositoryId, TypeDefinition typeDefinition) { // TODO Auto-generated method stub } public void deleteTypeDefinition(String repositoryId, String typeId) { // TODO Auto-generated method stub } // ////////////////////////////////////////////////////////////////////////////// // Utility // ////////////////////////////////////////////////////////////////////////////// private void addTypeInternal(Map<String, TypeDefinitionContainer> types, AbstractTypeDefinition type) { if (type == null) { return; } if (types.containsKey(type.getId())) { // TODO Logging // log.warn("Can't overwrite a type"); return; } TypeDefinitionContainerImpl tc = new TypeDefinitionContainerImpl(); tc.setTypeDefinition(type); // add to parent if (type.getParentTypeId() != null) { TypeDefinitionContainerImpl tdc = (TypeDefinitionContainerImpl) types .get(type.getParentTypeId()); if (tdc != null) { if (tdc.getChildren() == null) { tdc.setChildren(new ArrayList<TypeDefinitionContainer>()); } if (!isDuplicateChild(tdc, type)) { tdc.getChildren().add(tc); } } } types.put(type.getId(), tc); } private boolean isDuplicateChild(TypeDefinitionContainer parent, TypeDefinition type) { for (TypeDefinitionContainer child : parent.getChildren()) { if (child.getTypeDefinition().getId().equals(type.getId())) { return true; } } return false; } @Override public Object getSingleDefaultValue(String propertyId, String typeId, String repositoryId) { TypeDefinition tdf = getTypeDefinition(repositoryId, typeId); PropertyDefinition<?> pdf = tdf.getPropertyDefinitions() .get(propertyId); return pdf.getDefaultValue().get(0); } public void setTypeService(TypeService typeService) { this.typeService = typeService; } public void setPropertyManager(PropertyManager propertyManager) { this.propertyManager = propertyManager; } public void setRepositoryInfoMap(RepositoryInfoMap repositoryInfoMap) { this.repositoryInfoMap = repositoryInfoMap; } }