package com.constellio.app.modules.tasks.migrations; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import java.util.ArrayList; import java.util.List; 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.TasksPermissionsTo; import com.constellio.app.modules.tasks.model.calculators.DecisionsTasksCalculator; import com.constellio.app.modules.tasks.model.calculators.WorkflowTaskSortCalculator; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.model.wrappers.TaskStatusType; import com.constellio.app.modules.tasks.model.wrappers.Workflow; import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstance; import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstanceStatus; import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.migrations.CoreRoles; import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.security.Role; import com.constellio.model.entities.structures.MapStringListStringStructureFactory; import com.constellio.model.entities.structures.MapStringStringStructureFactory; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.security.roles.RolesManager; import com.constellio.model.services.security.roles.RolesManagerRuntimeException.RolesManagerRuntimeException_Validation; public class TasksMigrationTo6_0 implements MigrationScript { @Override public String getVersion() { return "6.0"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) throws Exception { new SchemaAlterationsFor6_0(collection, migrationResourcesProvider, appLayerFactory).migrate(); configureDisplayConfig(collection, appLayerFactory); updatePermissions(collection, appLayerFactory); } private void configureDisplayConfig(String collection, AppLayerFactory appLayerFactory) { SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypesDisplayTransactionBuilder transactionBuilder = manager.newTransactionBuilderFor(collection) .in(Task.SCHEMA_TYPE) .addToForm(Task.DECISION, Task.RELATIVE_DUE_DATE) .atTheEnd() .in(Task.SCHEMA_TYPE) .addToDisplay(Task.DECISION, Task.WORKFLOW, Task.WORKFLOW_INSTANCE, Task.RELATIVE_DUE_DATE) .atTheEnd(); manager.execute(transactionBuilder.build()); } private void updatePermissions(String collection, AppLayerFactory factory) { RolesManager roleManager = factory.getModelLayerFactory().getRolesManager(); Role administrator; try { administrator = roleManager.getRole(collection, CoreRoles.ADMINISTRATOR); } catch (RolesManagerRuntimeException_Validation e) { administrator = roleManager.addRole( new Role(collection, CoreRoles.ADMINISTRATOR, CoreRoles.ADMINISTRATOR, CorePermissions.PERMISSIONS.getAll())); } List<String> permissions = new ArrayList<>(administrator.getOperationPermissions()); permissions.add(TasksPermissionsTo.MANAGE_WORKFLOWS); roleManager.updateRole(administrator.withPermissions(permissions)); } private class SchemaAlterationsFor6_0 extends MetadataSchemasAlterationHelper { public SchemaAlterationsFor6_0(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder userSchemaType = typesBuilder.getSchemaType(User.SCHEMA_TYPE); MetadataSchemaTypeBuilder workflowSchemaType = typesBuilder.createNewSchemaType(Workflow.SCHEMA_TYPE); workflowSchemaType.setSecurity(false); MetadataSchemaBuilder workflowSchema = workflowSchemaType.getDefaultSchema(); workflowSchema.create(Workflow.CODE).setType(STRING).setUniqueValue(true); MetadataSchemaTypeBuilder workflowInstanceSchemaType = typesBuilder.createNewSchemaType(WorkflowInstance.SCHEMA_TYPE); workflowInstanceSchemaType.setSecurity(false); MetadataSchemaBuilder workflowInstanceSchema = workflowInstanceSchemaType.getDefaultSchema(); workflowInstanceSchema.create(WorkflowInstance.STARTED_BY).defineReferencesTo(userSchemaType); workflowInstanceSchema.create(WorkflowInstance.STARTED_ON).setType(MetadataValueType.DATE_TIME); workflowInstanceSchema.create(WorkflowInstance.STATUS).defineAsEnum(WorkflowInstanceStatus.class); workflowInstanceSchema.create(WorkflowInstance.WORKFLOW).defineReferencesTo(workflowSchemaType); workflowInstanceSchema.create(WorkflowInstance.EXTRA_FIELDS) .defineStructureFactory(MapStringListStringStructureFactory.class); MetadataSchemaTypeBuilder taskSchemaType = typesBuilder.getSchemaType(Task.SCHEMA_TYPE); MetadataSchemaBuilder taskSchema = taskSchemaType.getDefaultSchema(); taskSchema.create(Task.STATUS_TYPE).defineAsEnum(TaskStatusType.class).defineDataEntry().asCopied( taskSchema.getMetadata(Task.STATUS), typesBuilder.getDefaultSchema(TaskStatus.SCHEMA_TYPE).getMetadata(TaskStatus.STATUS_TYPE) ); taskSchema.create(Task.WORKFLOW).defineReferencesTo(workflowSchemaType); taskSchema.create(Task.MODEL_TASK).defineReferencesTo(taskSchemaType); taskSchema.create(Task.DECISION).setType(MetadataValueType.STRING); taskSchema.create(Task.WORKFLOW_INSTANCE).defineReferencesTo(workflowInstanceSchemaType); taskSchema.create(Task.IS_MODEL).setType(MetadataValueType.BOOLEAN); taskSchema.create(Task.NEXT_TASK_CREATED).setType(MetadataValueType.BOOLEAN); taskSchema.create(Task.WORKFLOW_TASK_SORT).setType(MetadataValueType.NUMBER) .defineDataEntry().asCalculated(WorkflowTaskSortCalculator.class); taskSchema.create(Task.NEXT_TASKS).setType(MetadataValueType.REFERENCE).setMultivalue(true) .defineReferencesTo(taskSchemaType) .defineDataEntry().asCalculated(DecisionsTasksCalculator.class); taskSchema.create(Task.NEXT_TASKS_DECISIONS).defineStructureFactory(MapStringStringStructureFactory.class); taskSchema.create(Task.RELATIVE_DUE_DATE).setType(MetadataValueType.NUMBER); } } }