package com.constellio.app.api.cmis.binding.collection; import java.math.BigInteger; import java.util.Collection; import java.util.List; import java.util.Map; 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.server.CallContext; import org.apache.chemistry.opencmis.server.support.TypeDefinitionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.api.cmis.CmisExceptions.CmisExceptions_ObjectNotFound; import com.constellio.app.api.cmis.builders.objectType.CollectionRepositoryTypesDefinitionBuilder; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.MetadataSchemasManagerListener; /** * Manages the type definitions for all FileShare repositories. */ public class ConstellioCollectionTypeDefinitionsManager implements MetadataSchemasManagerListener { private static final Logger LOGGER = LoggerFactory.getLogger(ConstellioCollectionTypeDefinitionsManager.class); private static final String NAMESPACE = "http://chemistry.apache.org/opencmis/fileshare"; private final AppLayerFactory appLayerFactory; private final TypeDefinitionFactory typeDefinitionFactory; private final MetadataSchemasManager metadataSchemasManager; private String collection; private Map<String, TypeDefinition> typeDefinitions; public ConstellioCollectionTypeDefinitionsManager(AppLayerFactory appLayerFactory, String collection) { this.collection = collection; this.appLayerFactory = appLayerFactory; this.metadataSchemasManager = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager(); this.metadataSchemasManager.registerListener(this); this.typeDefinitionFactory = setupTypeDefinitionFactory(); MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection); typeDefinitions = newCollectionRepositoryTypesDefinitionBuilder(types); } private static TypeDefinitionFactory setupTypeDefinitionFactory() { TypeDefinitionFactory typeDefinitionFactory = TypeDefinitionFactory.newInstance(); typeDefinitionFactory.setDefaultNamespace(NAMESPACE); typeDefinitionFactory.setDefaultControllableAcl(false); typeDefinitionFactory.setDefaultControllablePolicy(false); typeDefinitionFactory.setDefaultQueryable(false); typeDefinitionFactory.setDefaultFulltextIndexed(false); typeDefinitionFactory.setDefaultTypeMutability(typeDefinitionFactory.createTypeMutability(false, false, false)); return typeDefinitionFactory; } public Map<String, TypeDefinition> newCollectionRepositoryTypesDefinitionBuilder(MetadataSchemaTypes types) { return new CollectionRepositoryTypesDefinitionBuilder(types, typeDefinitionFactory, appLayerFactory).build(); } public synchronized TypeDefinition getInternalTypeDefinition(String typeId) { return typeDefinitions.get(typeId); } public synchronized Collection<TypeDefinition> getInternalTypeDefinitions() { return typeDefinitions.values(); } public TypeDefinition getTypeDefinition(CallContext context, String typeId) { TypeDefinition type = typeDefinitions.get(typeId); if (type == null) { throw new CmisExceptions_ObjectNotFound("type", typeId); } return typeDefinitionFactory.copy(type, true, context.getCmisVersion()); } public TypeDefinitionList getTypeChildren(CallContext context, String typeId, Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount) { return typeDefinitionFactory.createTypeDefinitionList(typeDefinitions, typeId, includePropertyDefinitions, maxItems, skipCount, context.getCmisVersion()); } public List<TypeDefinitionContainer> getTypeDescendants(CallContext context, String typeId, BigInteger depth, Boolean includePropertyDefinitions) { return typeDefinitionFactory.createTypeDescendants(typeDefinitions, typeId, depth, includePropertyDefinitions, context.getCmisVersion()); } @Override public void onCollectionSchemasModified(String collection) { if (collection.equals(this.collection)) { MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection); typeDefinitions = newCollectionRepositoryTypesDefinitionBuilder(types); } } public boolean hasTypeDefinition(String schemaCode) { return typeDefinitions.containsKey(schemaCode); } }