package com.constellio.app.api.cmis.builders.objectType; import java.util.HashMap; import java.util.Map; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.definitions.MutableDocumentTypeDefinition; import org.apache.chemistry.opencmis.commons.definitions.MutableFolderTypeDefinition; import org.apache.chemistry.opencmis.commons.definitions.MutablePropertyDefinition; import org.apache.chemistry.opencmis.commons.definitions.MutableTypeDefinition; import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition; import org.apache.chemistry.opencmis.commons.enums.CmisVersion; import org.apache.chemistry.opencmis.server.support.TypeDefinitionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.extensions.api.cmis.params.IsSchemaTypeSupportedParams; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.Taxonomy; import com.constellio.model.entities.records.wrappers.Collection; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.taxonomies.TaxonomiesManager; public class CollectionRepositoryTypesDefinitionBuilder { private static final String COLLECTION = "collection"; private static final String TAXONOMY = "taxonomy"; private static final Logger LOGGER = LoggerFactory.getLogger(CollectionRepositoryTypesDefinitionBuilder.class); AppLayerFactory appLayerFactory; MetadataSchemaTypes types; TypeDefinitionFactory typeDefinitionFactory; TaxonomiesManager taxonomiesManager; public CollectionRepositoryTypesDefinitionBuilder(MetadataSchemaTypes types, TypeDefinitionFactory typeDefinitionFactory, AppLayerFactory appLayerFactory) { this.appLayerFactory = appLayerFactory; this.taxonomiesManager = appLayerFactory.getModelLayerFactory().getTaxonomiesManager(); this.types = types; this.typeDefinitionFactory = typeDefinitionFactory; } public Map<String, TypeDefinition> build() { Map<String, TypeDefinition> typeDefinitions = new HashMap<String, TypeDefinition>(); // add base folder type MutableFolderTypeDefinition baseFolderType = typeDefinitionFactory.createBaseFolderTypeDefinition(CmisVersion.CMIS_1_1); removeQueryableAndOrderableFlags(baseFolderType); typeDefinitions.put(baseFolderType.getId(), baseFolderType); // add base document type MutableDocumentTypeDefinition documentType = typeDefinitionFactory.createBaseDocumentTypeDefinition(CmisVersion.CMIS_1_1); removeQueryableAndOrderableFlags(documentType); PropertyDefinition<?> documentContentMetadataProperty = PropertyBuilderFactory .newStringProperty("metadata").setName("metadata") .setMultivalue(false).setRequired(true).setUpdatability(true).build(); PropertyDefinition<?> documentContentParentProperty = PropertyBuilderFactory .newStringProperty(PropertyIds.PARENT_ID).setName(PropertyIds.PARENT_ID) .setMultivalue(false).setRequired(false).setUpdatability(true).build(); documentType.addPropertyDefinition(documentContentMetadataProperty); documentType.addPropertyDefinition(documentContentParentProperty); documentType.setIsVersionable(true); typeDefinitions.put(documentType.getId(), documentType); MutableFolderTypeDefinition taxoType = typeDefinitionFactory.createFolderTypeDefinition(CmisVersion.CMIS_1_1, baseFolderType.getId()); taxoType.setId(TAXONOMY); taxoType.setLocalName(TAXONOMY); taxoType.setDisplayName(TAXONOMY); taxoType.setDescription(TAXONOMY); typeDefinitions.put(taxoType.getId(), taxoType); Taxonomy principalTaxonomy = taxonomiesManager.getPrincipalTaxonomy(types.getCollection()); for (MetadataSchemaType schemaType : types.getSchemaTypes()) { Taxonomy taxonomy = taxonomiesManager.getTaxonomyFor(schemaType.getCollection(), schemaType.getCode()); boolean isPrincipalTaxonomy = taxonomy != null && taxonomy.hasSameCode(principalTaxonomy); boolean supported = schemaType.getCode().equals(Collection.SCHEMA_TYPE) || appLayerFactory.getExtensions().forCollection(schemaType.getCollection()) .isSchemaTypeSupported(new IsSchemaTypeSupportedParams(schemaType), taxonomy != null); if (supported) { for (MetadataSchema metadataSchema : schemaType.getAllSchemas()) { MutableFolderTypeDefinition folder = typeDefinitionFactory.createFolderTypeDefinition(CmisVersion.CMIS_1_1, baseFolderType.getId()); folder.setIsControllableAcl(isPrincipalTaxonomy || schemaType.hasSecurity()); folder.setId(metadataSchema.getCode()); folder.setLocalName(metadataSchema.getCode()); folder.setDisplayName(metadataSchema.getCode()); folder.setQueryName(metadataSchema.getCode()); folder.setDescription(metadataSchema.getCode()); // folder.setParentTypeId(schemaType.getLocalCode()); PropertyDefinition<?> propertiesSchema = PropertyBuilderFactory .newStringProperty(metadataSchema.getCode()).setName(metadataSchema.getCode()) .setMultivalue(false).setRequired(true).setUpdatability(true).build(); folder.addPropertyDefinition(propertiesSchema); for (Metadata metadata : metadataSchema.getMetadatas()) { PropertyDefinition<?> propertiesMetadata = PropertyBuilderFactory.getPropertyFor(metadata); folder.addPropertyDefinition(propertiesMetadata); } typeDefinitions.put(folder.getId(), folder); } } } return typeDefinitions; } /** * Removes the queryable and orderable flags from the property definitions of a type definition because this implementations * does neither support queries nor can order objects. */ private void removeQueryableAndOrderableFlags(MutableTypeDefinition type) { for (PropertyDefinition<?> propDef : type.getPropertyDefinitions().values()) { MutablePropertyDefinition<?> mutablePropDef = (MutablePropertyDefinition<?>) propDef; mutablePropDef.setIsQueryable(false); mutablePropDef.setIsOrderable(false); } } }