package com.constellio.app.modules.robots.migrations; import static com.constellio.data.utils.LangUtils.withoutDuplicates; import static java.util.Arrays.asList; import java.util.ArrayList; import java.util.List; import com.constellio.app.entities.modules.MetadataSchemasAlterationHelper; import com.constellio.app.entities.modules.MigrationHelper; import com.constellio.app.entities.modules.MigrationResourcesProvider; import com.constellio.app.entities.modules.MigrationScript; import com.constellio.app.entities.schemasDisplay.SchemaTypeDisplayConfig; import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType; import com.constellio.app.modules.robots.constants.RobotsPermissionsTo; import com.constellio.app.modules.robots.model.wrappers.ActionParameters; import com.constellio.app.modules.robots.model.wrappers.Robot; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.migrations.CoreRoles; import com.constellio.app.services.schemasDisplay.SchemaDisplayManagerTransaction; import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.app.ui.pages.search.criteria.CriterionFactory; import com.constellio.model.entities.Language; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.entities.security.Role; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.schemas.builders.CommonMetadataBuilder; 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; public class RobotsMigrationTo5_1_2 extends MigrationHelper implements MigrationScript { @Override public String getVersion() { return "5.1.2"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) throws Exception { new SchemaAlterationFor5_1_2(collection, migrationResourcesProvider, appLayerFactory).migrate(); setupDisplayConfig(collection, appLayerFactory, migrationResourcesProvider); setupRoles(collection, appLayerFactory.getModelLayerFactory()); } private void setupDisplayConfig(String collection, AppLayerFactory appLayerFactory, MigrationResourcesProvider provider) { SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction(); Language language = provider.getLanguage(); String definition = "default:init.robot.tabs.definition"; String criteria = "init.robot.tabs.criteria"; String action = "init.robot.tabs.action"; SchemaTypeDisplayConfig type = manager.getType(collection, Robot.SCHEMA_TYPE); transaction.add(type.withMetadataGroup(provider.getLanguageMap(asList(definition, criteria, action)))); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.PARENT) .withInputType(MetadataInputType.HIDDEN)); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.SCHEMA_FILTER).withMetadataGroup(criteria)); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.SEARCH_CRITERIA).withMetadataGroup(criteria)); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.ACTION).withMetadataGroup(action)); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.ACTION_PARAMETERS).withMetadataGroup(action)); transaction.add(manager.getMetadata(collection, Robot.DEFAULT_SCHEMA, Robot.EXCLUDE_PROCESSED_BY_CHILDREN) .withMetadataGroup(action)); manager.execute(transaction); SchemaTypesDisplayTransactionBuilder transactionBuilder = manager.newTransactionBuilderFor(collection); transactionBuilder.in(Robot.SCHEMA_TYPE) .addToForm(Robot.ACTION, Robot.ACTION_PARAMETERS, Robot.EXCLUDE_PROCESSED_BY_CHILDREN).atTheEnd(); transactionBuilder.in(ActionParameters.SCHEMA_TYPE).removeFromDisplay( CommonMetadataBuilder.CREATED_BY, CommonMetadataBuilder.CREATED_ON, CommonMetadataBuilder.MODIFIED_BY, CommonMetadataBuilder.MODIFIED_ON); manager.execute(transactionBuilder.build()); } private void setupRoles(String collection, ModelLayerFactory modelLayerFactory) { RolesManager rolesManager = modelLayerFactory.getRolesManager(); Role administrator = rolesManager.getRole(collection, CoreRoles.ADMINISTRATOR); List<String> newAdministratorPermissions = new ArrayList<>(administrator.getOperationPermissions()); newAdministratorPermissions.addAll(RobotsPermissionsTo.PERMISSIONS.getAll()); rolesManager.updateRole(administrator.withPermissions(withoutDuplicates(newAdministratorPermissions))); } static class SchemaAlterationFor5_1_2 extends MetadataSchemasAlterationHelper { protected SchemaAlterationFor5_1_2(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder actionParameters = createActionParametersSchemaType(typesBuilder); createRobotSchemaType(typesBuilder, actionParameters); } private MetadataSchemaTypeBuilder createActionParametersSchemaType(MetadataSchemaTypesBuilder types) { MetadataSchemaTypeBuilder type = types.createNewSchemaType(ActionParameters.SCHEMA_TYPE); type.getDefaultSchema().get(Schemas.TITLE_CODE).setEnabled(false).setDefaultRequirement(false); return type; } private void createRobotSchemaType(MetadataSchemaTypesBuilder types, MetadataSchemaTypeBuilder actionParameters) { MetadataSchemaTypeBuilder robots = types.createNewSchemaType(Robot.SCHEMA_TYPE); MetadataSchemaBuilder schema = robots.getDefaultSchema(); schema.get(Schemas.TITLE_CODE).setDefaultRequirement(true); schema.createUniqueCodeMetadata(); schema.create(Robot.DESCRIPTION).setType(MetadataValueType.TEXT); schema.createUndeletable(Robot.PARENT).defineChildOfRelationshipToType(robots).setEssential(true); schema.createUndeletable(Robot.SCHEMA_FILTER).setType(MetadataValueType.STRING).setEssential(true).required(); schema.createUndeletable(Robot.SEARCH_CRITERIA).setMultivalue(true).setEssential(true).required() .defineStructureFactory(CriterionFactory.class); schema.createUndeletable(Robot.ACTION).setType(MetadataValueType.STRING).setEssential(true); schema.createUndeletable(Robot.ACTION_PARAMETERS).defineReferencesTo(actionParameters).setEssential(true); schema.createUndeletable(Robot.EXCLUDE_PROCESSED_BY_CHILDREN).setType(MetadataValueType.BOOLEAN) .setEssential(true).setDefaultValue(false).required(); } } }