package com.constellio.app.modules.rm.migrations; import static com.constellio.app.modules.rm.services.ValueListItemSchemaTypeBuilder.ValueListItemSchemaTypeCodeMode.REQUIRED_AND_UNIQUE; import static com.constellio.model.entities.schemas.MetadataValueType.STRUCTURE; import static com.constellio.model.entities.schemas.MetadataValueType.TEXT; import static java.util.Arrays.asList; 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.rm.RMConfigs; import com.constellio.app.modules.rm.model.calculators.folder.FolderRetentionPeriodCodeCalculator.FolderActiveRetentionPeriodCodeCalculator; import com.constellio.app.modules.rm.model.calculators.folder.FolderRetentionPeriodCodeCalculator.FolderSemiActiveRetentionPeriodCodeCalculator; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.ValueListItemSchemaTypeBuilder; import com.constellio.app.modules.rm.services.ValueListItemSchemaTypeBuilder.ValueListItemSchemaTypeBuilderOptions; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.type.VariableRetentionPeriod; 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.records.Transaction; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.records.wrappers.UserDocument; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServicesException; 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.schemas.validators.metadatas.IntegerStringValidator; public class RMMigrationTo5_0_6 implements MigrationScript { @Override public String getVersion() { return "5.0.6"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory(); RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); if (!rm.folder.schema().hasMetadataWithCode(Folder.LINEAR_SIZE)) { new SchemaAlterationFor5_0_6(collection, migrationResourcesProvider, appLayerFactory).migrate(); updateFormAndDisplayConfigs(collection, appLayerFactory); } if (rm.getVariableRetentionPeriodWithCode("888") == null) { addVariablePeriod888And999(collection, migrationResourcesProvider, appLayerFactory); } modelLayerFactory.getSystemConfigurationsManager() .signalDefaultValueModification(RMConfigs.LINKABLE_CATEGORY_MUST_NOT_BE_ROOT, true); //Reindexation that was planned in 5.0.6, moved to 5.0.7 // ReindexingServices reindexingServices = appLayerFactory.getModelLayerFactory().newReindexingServices(); // reindexingServices.reindexCollection(collection, recalculateSchemaTypes(asList(Folder.SCHEMA_TYPE))); modelLayerFactory.getBatchProcessesManager().waitUntilAllFinished(); } private void updateFormAndDisplayConfigs(String collection, AppLayerFactory appLayerFactory) { SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypesDisplayTransactionBuilder transactionBuilder = manager.newTransactionBuilderFor(collection); transactionBuilder .in(ContainerRecord.SCHEMA_TYPE) .addToForm(ContainerRecord.CAPACITY, ContainerRecord.FILL_RATIO_ENTRED) .atTheEnd(); transactionBuilder .in(ContainerRecord.SCHEMA_TYPE) .addToDisplay(ContainerRecord.CAPACITY) .atTheEnd(); transactionBuilder .in(Folder.SCHEMA_TYPE) .addToForm(Folder.LINEAR_SIZE) .atTheEnd(); transactionBuilder .in(Folder.SCHEMA_TYPE) .addToDisplay(Folder.LINEAR_SIZE) .beforeTheHugeCommentMetadata(); transactionBuilder .in(User.SCHEMA_TYPE) .addToDisplay(User.ALL_ROLES) .atTheEnd(); transactionBuilder .in(VariableRetentionPeriod.SCHEMA_TYPE) .addToSearchResult(VariableRetentionPeriod.CODE) .atFirstPosition(); transactionBuilder .in(ContainerRecord.SCHEMA_TYPE) .addToForm(ContainerRecord.STORAGE_SPACE) .afterMetadata(ContainerRecord.IDENTIFIER); transactionBuilder .in(Folder.SCHEMA_TYPE) .removeFromDisplay(Folder.RETENTION_RULE_ADMINISTRATIVE_UNITS); manager.execute(transactionBuilder.build()); } private void addVariablePeriod888And999(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); VariableRetentionPeriod period888 = rm.newVariableRetentionPeriod().setCode("888") .setTitle(migrationResourcesProvider.getDefaultLanguageString("init.variablePeriod888")); VariableRetentionPeriod period999 = rm.newVariableRetentionPeriod().setCode("999") .setTitle(migrationResourcesProvider.getDefaultLanguageString("init.variablePeriod999")); try { appLayerFactory.getModelLayerFactory().newRecordServices().execute(new Transaction().addAll(period888, period999)); } catch (RecordServicesException e) { throw new RuntimeException(e); } } class SchemaAlterationFor5_0_6 extends MetadataSchemasAlterationHelper { MetadataSchemaTypes types; protected SchemaAlterationFor5_0_6(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection); } public String getVersion() { return "5.0.6"; } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { //Folder MetadataSchemaBuilder folderSchema = typesBuilder.getSchema(Folder.DEFAULT_SCHEMA); folderSchema.createUndeletable(Folder.LINEAR_SIZE).setType(MetadataValueType.NUMBER).setEssential(true); folderSchema.createUndeletable(Folder.ACTIVE_RETENTION_CODE).setType(MetadataValueType.STRING) .defineDataEntry().asCalculated(FolderActiveRetentionPeriodCodeCalculator.class); folderSchema.createUndeletable(Folder.SEMIACTIVE_RETENTION_CODE).setType(MetadataValueType.STRING) .defineDataEntry().asCalculated(FolderSemiActiveRetentionPeriodCodeCalculator.class); //Container typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).createUndeletable(ContainerRecord.CAPACITY) .setType(MetadataValueType.NUMBER); typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).createUndeletable(ContainerRecord.FILL_RATIO_ENTRED) .setType(MetadataValueType.NUMBER); ValueListItemSchemaTypeBuilder builder = new ValueListItemSchemaTypeBuilder(typesBuilder); builder.createValueListItemSchema(VariableRetentionPeriod.SCHEMA_TYPE, (String) null, ValueListItemSchemaTypeBuilderOptions.codeMetadataRequiredAndUnique()); typesBuilder.getSchema(VariableRetentionPeriod.DEFAULT_SCHEMA) .get(VariableRetentionPeriod.CODE).setUnmodifiable(true).addValidator(IntegerStringValidator.class); modifyTextContentStructureAndUSRMetadatasToDontWriteNullValues(typesBuilder); MetadataSchemaBuilder userDocumentSchema = typesBuilder.getSchema(UserDocument.DEFAULT_SCHEMA); userDocumentSchema.create("folder").defineReferencesTo(typesBuilder.getSchema(Folder.DEFAULT_SCHEMA)); } private void modifyTextContentStructureAndUSRMetadatasToDontWriteNullValues(MetadataSchemaTypesBuilder typesBuilder) { List<MetadataValueType> typesWithoutNullValues = asList(STRUCTURE, TEXT); for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) { for (MetadataBuilder metadata : typeBuilder.getAllMetadatas()) { if (metadata.getLocalCode().equals("comments")) { //Vaults started in version 5.0.1 has a CONTENTS type instead of STRUCTURE metadata.setTypeWithoutValidation(MetadataValueType.STRUCTURE); } } } } } }