package com.constellio.app.modules.rm.migrations; import com.constellio.app.entities.modules.MetadataSchemasAlterationHelper; import com.constellio.app.entities.modules.MigrationResourcesProvider; import com.constellio.app.entities.modules.MigrationScript; import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType; import com.constellio.app.modules.rm.RMEmailTemplateConstants; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.model.calculators.container.ContainerRecordAvailableSizeCalculator; import com.constellio.app.modules.rm.model.calculators.container.ContainerRecordLinearSizeCalculator; import com.constellio.app.modules.rm.model.calculators.storageSpace.StorageSpaceAvailableSizeCalculator; import com.constellio.app.modules.rm.model.calculators.storageSpace.StorageSpaceLinearSizeCalculator; import com.constellio.app.modules.rm.model.validators.ContainerRecordValidator; import com.constellio.app.modules.rm.model.validators.StorageSpaceValidator; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.StorageSpace; import com.constellio.app.modules.rm.wrappers.type.ContainerRecordType; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.data.dao.managers.config.ConfigManagerException; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.security.Role; import com.constellio.model.services.schemas.builders.MetadataBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.security.roles.RolesManager; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.util.List; import static java.util.Arrays.asList; public class RMMigrationTo6_7 implements MigrationScript { AppLayerFactory appLayerFactory; String collection; MigrationResourcesProvider migrationResourcesProvider; @Override public String getVersion() { return "6.7"; } @Override public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) throws Exception { this.appLayerFactory = factory; this.collection = collection; migrationResourcesProvider = provider; new SchemaAlterationsFor6_7(collection, provider, factory).migrate(); migrateDisplayConfigs(factory, collection); reloadEmailTemplates(); updatePermissions(); } public static class SchemaAlterationsFor6_7 extends MetadataSchemasAlterationHelper { protected SchemaAlterationsFor6_7(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) { super(collection, provider, factory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { migrateContainerRecordMetadatas(typesBuilder); migrateStorageSpaceMetadatas(typesBuilder); } private void migrateContainerRecordMetadatas(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).defineValidators().add(ContainerRecordValidator.class); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).create(ContainerRecord.LINEAR_SIZE_ENTERED) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).create(ContainerRecord.LINEAR_SIZE_SUM) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true).defineDataEntry().asSum( typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).getMetadata(Folder.CONTAINER), typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).getMetadata(Folder.LINEAR_SIZE) ); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).create(ContainerRecord.LINEAR_SIZE) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true) .defineDataEntry().asCalculated(ContainerRecordLinearSizeCalculator.class); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).create(ContainerRecord.AVAILABLE_SIZE) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true) .defineDataEntry().asCalculated(ContainerRecordAvailableSizeCalculator.class); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).getMetadata(ContainerRecord.FILL_RATIO_ENTRED).setEnabled(false); } private void migrateStorageSpaceMetadatas(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getSchema(StorageSpace.DEFAULT_SCHEMA).defineValidators().add(StorageSpaceValidator.class); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.LINEAR_SIZE_ENTERED) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.LINEAR_SIZE_SUM) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true).defineDataEntry().asSum( typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).getMetadata(ContainerRecord.STORAGE_SPACE), typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).getMetadata(ContainerRecord.CAPACITY) ); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.CHILD_LINEAR_SIZE_SUM) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true).defineDataEntry().asSum( typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).getMetadata(StorageSpace.PARENT_STORAGE_SPACE), typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).getMetadata(StorageSpace.CAPACITY) ); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.LINEAR_SIZE) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true) .defineDataEntry().asCalculated(StorageSpaceLinearSizeCalculator.class); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.AVAILABLE_SIZE) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true) .defineDataEntry().asCalculated(StorageSpaceAvailableSizeCalculator.class); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.CONTAINER_TYPE) .setType(MetadataValueType.REFERENCE).setMultivalue(true).setEssential(false).setUndeletable(true) .defineReferencesTo(typesBuilder.getSchemaType(ContainerRecordType.SCHEMA_TYPE)); MetadataBuilder parentStorage = typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).get(StorageSpace.PARENT_STORAGE_SPACE); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).create(StorageSpace.NUMBER_OF_CHILD) .setType(MetadataValueType.NUMBER).setEssential(false).setUndeletable(true) .defineDataEntry().asReferenceCount(parentStorage); } } public void migrateDisplayConfigs(AppLayerFactory appLayerFactory, String collection) { SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypesDisplayTransactionBuilder transactionBuilder = manager.newTransactionBuilderFor(collection); transactionBuilder.add(manager.getMetadata(collection, StorageSpace.DEFAULT_SCHEMA + "_" + StorageSpace.CONTAINER_TYPE) .withInputType(MetadataInputType.LOOKUP)); transactionBuilder.add(manager.getMetadata(collection, StorageSpace.DEFAULT_SCHEMA + "_" + StorageSpace.AVAILABLE_SIZE).withVisibleInAdvancedSearchStatus(true)); transactionBuilder.add(manager.getSchema(collection, StorageSpace.DEFAULT_SCHEMA).withNewFormAndDisplayMetadatas(StorageSpace.DEFAULT_SCHEMA + "_" + StorageSpace.CONTAINER_TYPE)); transactionBuilder.add(manager.getMetadata(collection, ContainerRecord.DEFAULT_SCHEMA + "_" + ContainerRecord.AVAILABLE_SIZE).withVisibleInAdvancedSearchStatus(true)); manager.execute(transactionBuilder.build()); } private void reloadEmailTemplates() { if (appLayerFactory.getModelLayerFactory().getCollectionsListManager().getCollectionLanguages(collection).get(0).equals("en")) { reloadEmailTemplate("alertWhenDecommissioningListCreatedTemplate_en.html", RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID); } else { reloadEmailTemplate("alertWhenDecommissioningListCreatedTemplate.html", RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID); } } private void reloadEmailTemplate(final String templateFileName, final String templateId) { final InputStream templateInputStream = migrationResourcesProvider.getStream(templateFileName); try { appLayerFactory.getModelLayerFactory().getEmailTemplatesManager().addCollectionTemplateIfInexistent(templateId, collection, templateInputStream); } catch (IOException | ConfigManagerException.OptimisticLockingConfiguration e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(templateInputStream); } } private void updatePermissions() { RolesManager roleManager = appLayerFactory.getModelLayerFactory().getRolesManager(); List<Role> allRoles = roleManager.getAllRoles(collection); for (Role role: allRoles) { if(roleManager.hasPermission(collection, role.getCode(), RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST)) { roleManager.updateRole(role.withNewPermissions(asList(RMPermissionsTo.CREATE_TRANSFER_DECOMMISSIONING_LIST, RMPermissionsTo.EDIT_TRANSFER_DECOMMISSIONING_LIST))); } } } }