package com.constellio.app.modules.tasks.migrations; import static com.constellio.app.modules.tasks.model.wrappers.TaskStatusType.CLOSED; import static com.constellio.app.modules.tasks.model.wrappers.TaskStatusType.FINISHED; import static com.constellio.app.modules.tasks.model.wrappers.TaskStatusType.IN_PROGRESS; import static com.constellio.app.modules.tasks.model.wrappers.TaskStatusType.STANDBY; import static com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus.CLOSED_CODE; import static com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus.STANDBY_CODE; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.IOUtils; import com.constellio.app.entities.modules.ComboMigrationScript; 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.modules.tasks.TasksEmailTemplates; import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.emails.EmailTemplatesManager; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; public class TasksMigrationCombo implements ComboMigrationScript { @Override public List<MigrationScript> getVersions() { List<MigrationScript> scripts = new ArrayList<>(); scripts.add(new TasksMigrationTo5_0_7()); scripts.add(new TasksMigrationTo5_1_2()); scripts.add(new TasksMigrationTo5_1_3()); scripts.add(new TasksMigrationTo6_0()); return scripts; } @Override public String getVersion() { return getVersions().get(getVersions().size() - 1).getVersion(); } GeneratedTasksMigrationCombo generatedComboMigration; @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) throws Exception { ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory(); generatedComboMigration = new GeneratedTasksMigrationCombo(collection, appLayerFactory, migrationResourcesProvider); new SchemaAlteration(collection, migrationResourcesProvider, appLayerFactory).migrate(); generatedComboMigration.applyGeneratedRoles(); generatedComboMigration.applySchemasDisplay(appLayerFactory.getMetadataSchemasDisplayManager()); RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices(); MetadataSchemaTypes types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection); Transaction transaction = new Transaction(); final String standById = createRecordTransaction( collection, migrationResourcesProvider, appLayerFactory, types, transaction); recordServices.execute(transaction); //TODO Uncomment after supporting up to 7.2 in migration combo // modelLayerFactory.getMetadataSchemasManager().modify(collection, new MetadataSchemaTypesAlteration() { // @Override // public void alter(MetadataSchemaTypesBuilder types) { // types.getMetadata(Task.DEFAULT_SCHEMA + "_" + Task.STATUS).setDefaultValue(standById); // } // }); } private String createRecordTransaction(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory, MetadataSchemaTypes types, Transaction transaction) { TasksSchemasRecordsServices schemas = new TasksSchemasRecordsServices(collection, appLayerFactory); String standByCode = STANDBY_CODE; String inProcessCode = migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.I"); String finishedCode = migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.F"); String closedCode = CLOSED_CODE; String standbyId = transaction.add(schemas.newTaskStatus().setCode(standByCode) .setTitle(migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.STitle")) .setStatusType(STANDBY)).getId(); transaction.add(schemas.newTaskStatus().setCode(inProcessCode) .setTitle(migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.ITitle")) .setStatusType(IN_PROGRESS)); transaction.add(schemas.newTaskStatus().setCode(finishedCode) .setTitle(migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.FTitle")) .setStatusType(FINISHED)); transaction.add(schemas.newTaskStatus().setCode(closedCode) .setTitle(migrationResourcesProvider.getDefaultLanguageString("TaskStatusType.CTitle")) .setStatusType(CLOSED)); return standbyId; } class SchemaAlteration extends MetadataSchemasAlterationHelper { protected SchemaAlteration(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { //This module is fixing problems in other module // for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) { // for (MetadataBuilder metadata : typeBuilder.getAllMetadatas()) { // if (metadata.getLocalCode().equals("comments")) { // metadata.setTypeWithoutValidation(MetadataValueType.STRUCTURE); // } // } // } // // for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) { // MetadataSchemaBuilder schemaBuilder = typeBuilder.getDefaultSchema(); // if (schemaBuilder.hasMetadata("description")) { // schemaBuilder.get("description").setEnabled(true).setEssentialInSummary(true); // } // } // // for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) { // for (MetadataBuilder metadataBuilder : typeBuilder.getDefaultSchema().getMetadatas()) { // if ("code".equals(metadataBuilder.getLocalCode())) { // metadataBuilder.setUniqueValue(true); // metadataBuilder.setDefaultRequirement(true); // } // } // } generatedComboMigration.applyGeneratedSchemaAlteration(typesBuilder); } } private void addEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider, String collection) { String taskReminderTemplate; String subTasksModificationTemplate; String taskAssigneeModificationTemplate; String taskAssigneeToYouTemplate; String taskDeletionTemplate; String taskStatusModificationTemplate; String taskStatusModificationToCompletedTemplate; if (appLayerFactory.getModelLayerFactory().getCollectionsListManager().getCollectionLanguages(collection).get(0) .equals("en")) { taskReminderTemplate = "taskReminderTemplate_en.html"; subTasksModificationTemplate = "subTasksModificationTemplate_en.html"; taskAssigneeModificationTemplate = "taskAssigneeModificationTemplate_en.html"; taskAssigneeToYouTemplate = "taskAssigneeToYouTemplate_en.html"; taskStatusModificationTemplate = "taskStatusModificationTemplate_en.html"; taskStatusModificationToCompletedTemplate = "taskStatusModificationToCompletedTemplate_en.html"; taskDeletionTemplate = "taskDeletionTemplate_en.html"; } else { taskReminderTemplate = "taskReminderTemplate.html"; subTasksModificationTemplate = "subTasksModificationTemplate.html"; taskAssigneeModificationTemplate = "taskAssigneeModificationTemplate.html"; taskAssigneeToYouTemplate = "taskAssigneeToYouTemplate.html"; taskStatusModificationTemplate = "taskStatusModificationTemplate.html"; taskStatusModificationToCompletedTemplate = "taskStatusModificationToCompletedTemplate.html"; taskDeletionTemplate = "taskDeletionTemplate.html"; } addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskAssigneeModificationTemplate, TasksEmailTemplates.TASK_ASSIGNEE_MODIFIED); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskStatusModificationToCompletedTemplate, TasksEmailTemplates.TASK_COMPLETED); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskDeletionTemplate, TasksEmailTemplates.TASK_DELETED); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskStatusModificationTemplate, TasksEmailTemplates.TASK_STATUS_MODIFIED); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, subTasksModificationTemplate, TasksEmailTemplates.TASK_SUB_TASKS_MODIFIED); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskReminderTemplate, TasksEmailTemplates.TASK_REMINDER); addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, taskAssigneeToYouTemplate, TasksEmailTemplates.TASK_ASSIGNED_TO_YOU); } private void addEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider, String collection, String templateFileName, String templateId) { InputStream templateInputStream = migrationResourcesProvider.getStream(templateFileName); EmailTemplatesManager emailTemplateManager = appLayerFactory.getModelLayerFactory() .getEmailTemplatesManager(); try { emailTemplateManager.addCollectionTemplateIfInexistent(templateId, collection, templateInputStream); } catch (IOException | OptimisticLockingConfiguration e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(templateInputStream); } } }