package com.constellio.app.modules.rm.migrations; import static com.constellio.model.entities.CorePermissions.USE_EXTERNAL_APIS_FOR_COLLECTION; import static java.util.Arrays.asList; 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.rm.constants.RMRoles; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.schemas.builders.MetadataBuilder; 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 RMMigrationTo6_5_54 implements MigrationScript { @Override public String getVersion() { return "6.5.54"; } @Override public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory appLayerFactory) throws Exception { new SchemaAlterationsFor6_5_54(collection, provider, appLayerFactory).migrate(); SchemasDisplayManager schemaDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypesDisplayTransactionBuilder transaction = schemaDisplayManager.newTransactionBuilderFor(collection); transaction.in(ContainerRecord.SCHEMA_TYPE).addToDisplay(ContainerRecord.ADMINISTRATIVE_UNITS) .afterMetadata(ContainerRecord.ADMINISTRATIVE_UNITS); schemaDisplayManager.execute(transaction.build()); setupRoles(collection, appLayerFactory.getModelLayerFactory().getRolesManager(), provider); } private void setupRoles(String collection, RolesManager manager, MigrationResourcesProvider provider) { manager.updateRole( manager.getRole(collection, RMRoles.RGD).withNewPermissions(asList(USE_EXTERNAL_APIS_FOR_COLLECTION))); } public static class SchemaAlterationsFor6_5_54 extends MetadataSchemasAlterationHelper { protected SchemaAlterationsFor6_5_54(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) { super(collection, provider, factory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder schemaType = types().getSchemaType(Folder.SCHEMA_TYPE); MetadataSchemaTypeBuilder adminUnitSchemaType = types().getSchemaType(AdministrativeUnit.SCHEMA_TYPE); copy(adminUnitSchemaType, schemaType, Folder.ADMINISTRATIVE_UNIT, AdministrativeUnit.CODE, Folder.ADMINISTRATIVE_UNIT_CODE); } private MetadataBuilder copy(MetadataSchemaTypeBuilder sourceSchemaType, MetadataSchemaTypeBuilder destinationSchemaType, String referenceLocalCode, String sourceMetadataLocalCode, String destinationMetadataLocalCode) { MetadataSchemaBuilder sourceDefaultSchema = sourceSchemaType.getDefaultSchema(); MetadataSchemaBuilder destinationDefaultSchema = destinationSchemaType.getDefaultSchema(); MetadataBuilder refMetadata = destinationDefaultSchema.getMetadata(referenceLocalCode); MetadataBuilder sourceMetadata = sourceDefaultSchema.getMetadata(sourceMetadataLocalCode); MetadataBuilder destinationMetadata = destinationDefaultSchema.createUndeletable(destinationMetadataLocalCode); destinationMetadata.setMultivalue(sourceMetadata.isMultivalue() || refMetadata.isMultivalue()); destinationMetadata.setType(sourceMetadata.getType()); destinationMetadata.defineDataEntry().asCopied(refMetadata, sourceMetadata); if (sourceMetadata.getType() == MetadataValueType.REFERENCE) { String referenceSchemaType = sourceMetadata.getAllowedReferencesBuilder().getSchemaType(); destinationMetadata.defineReferences().setCompleteSchemaTypeCode(referenceSchemaType); } else if (sourceMetadata.getType() == MetadataValueType.ENUM) { destinationMetadata.defineAsEnum(sourceMetadata.getEnumClass()); } return destinationMetadata; } } }