package com.constellio.app.modules.rm.migrations; import static com.constellio.model.entities.schemas.MetadataValueType.DATE; import static com.constellio.model.entities.schemas.MetadataValueType.ENUM; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; 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.model.calculators.FolderArchivisticStatusCalculator2; import com.constellio.app.modules.rm.model.calculators.FolderExpectedDepositDateCalculator2; import com.constellio.app.modules.rm.model.calculators.FolderExpectedDestructionDateCalculator2; import com.constellio.app.modules.rm.model.calculators.FolderExpectedTransferDateCalculator2; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.MetadataSchemasRuntimeException; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.builders.MetadataBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilderRuntimeException; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderRuntimeException; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; public class RMMigrationTo6_5_1 implements MigrationScript { @Override public String getVersion() { return "6.5.1"; } @Override public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) throws Exception { new SchemaAlterationsFor6_5_1(collection, provider, factory).migrate(); modifyArchivisticCalculators(collection, factory); makeArchivisticDatesBasedOnNumbers(collection, factory); } private void makeArchivisticDatesBasedOnNumbers(String collection, AppLayerFactory appLayerFactory) { deleteIfPossibleOrDisableFolderCalendarYearMetadata(collection, appLayerFactory); deleteIfPossibleOrDisableFolderCalendarYearEntredMetadata(collection, appLayerFactory); deleteIfPossibleOrDisableDocumentCalendarYearMetadata(collection, appLayerFactory); deleteIfPossibleOrDisableDocuemntCalendarYearEntredMetadata(collection, appLayerFactory); //2. TODO change archivistic calculators } private void deleteIfPossibleOrDisableDocuemntCalendarYearEntredMetadata(String collection, AppLayerFactory appLayerFactory) { Migration6_5_1_Helper .deleteIfPossibleOrDisableMetadata("calendarYearEntered", Document.SCHEMA_TYPE, collection, appLayerFactory); } private void deleteIfPossibleOrDisableDocumentCalendarYearMetadata(String collection, AppLayerFactory appLayerFactory) { Migration6_5_1_Helper .deleteIfPossibleOrDisableMetadata("calendarYear", Document.SCHEMA_TYPE, collection, appLayerFactory); } private void deleteIfPossibleOrDisableFolderCalendarYearEntredMetadata(String collection, AppLayerFactory appLayerFactory) { Migration6_5_1_Helper .deleteIfPossibleOrDisableMetadata("calendarYearEntered", Folder.SCHEMA_TYPE, collection, appLayerFactory); } private void deleteIfPossibleOrDisableFolderCalendarYearMetadata(String collection, AppLayerFactory appLayerFactory) { Migration6_5_1_Helper .deleteIfPossibleOrDisableMetadata("calendarYear", Folder.SCHEMA_TYPE, collection, appLayerFactory); } private void modifyArchivisticCalculators(String collection, AppLayerFactory factory) { factory.getModelLayerFactory().getMetadataSchemasManager().modify(collection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { MetadataSchemaBuilder folderSchemaBuilder = types.getDefaultSchema(Folder.SCHEMA_TYPE); folderSchemaBuilder.getMetadata(Folder.EXPECTED_TRANSFER_DATE).defineDataEntry() .asCalculated(FolderExpectedTransferDateCalculator2.class); folderSchemaBuilder.getMetadata(Folder.EXPECTED_DEPOSIT_DATE).defineDataEntry() .asCalculated(FolderExpectedDepositDateCalculator2.class); folderSchemaBuilder.getMetadata(Folder.EXPECTED_DESTRUCTION_DATE).defineDataEntry() .asCalculated(FolderExpectedDestructionDateCalculator2.class); folderSchemaBuilder.getMetadata(Folder.ARCHIVISTIC_STATUS).defineDataEntry() .asCalculated(FolderArchivisticStatusCalculator2.class); } }); } public static class SchemaAlterationsFor6_5_1 extends MetadataSchemasAlterationHelper { protected SchemaAlterationsFor6_5_1(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) { super(collection, provider, factory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaBuilder folderDefaultSchema = types().getDefaultSchema(Folder.SCHEMA_TYPE); folderDefaultSchema.get(Folder.RETENTION_RULE_ADMINISTRATIVE_UNITS).setMarkedForDeletion(true); createArchivisticManualMetadata(folderDefaultSchema); createFolderTimeRangeMetadata(folderDefaultSchema); } private void createFolderTimeRangeMetadata(MetadataSchemaBuilder folderDefaultSchema) { folderDefaultSchema.create(Folder.TIME_RANGE).setType(STRING) .setInputMask("9999-9999").setEnabled(false); } private void createArchivisticManualMetadata(MetadataSchemaBuilder folderDefaultSchema) { folderDefaultSchema.createUndeletable(Folder.MANUAL_ARCHIVISTIC_STATUS).setType(ENUM).defineAsEnum(FolderStatus.class) .setEnabled(false); folderDefaultSchema.createUndeletable(Folder.MANUAL_EXPECTED_DESTRUCTION_DATE).setType(DATE).setEnabled(false); folderDefaultSchema.createUndeletable(Folder.MANUAL_EXPECTED_DEPOSIT_DATE).setType(DATE).setEnabled(false); folderDefaultSchema.createUndeletable(Folder.MANUAL_EXPECTED_TRANSFER_DATE).setType(DATE).setEnabled(false); } } public static class Migration6_5_1_Helper { public static void deleteIfPossibleOrDisableMetadata(String metadataLocalCode, String schemaTypeCode, String collection, AppLayerFactory appLayerFactory) { if (isUsed(metadataLocalCode, schemaTypeCode, collection, appLayerFactory)) { disableMetadta(metadataLocalCode, schemaTypeCode, collection, appLayerFactory); } else { deleteMetadata(metadataLocalCode, schemaTypeCode, collection, appLayerFactory); } } private static void deleteMetadata(final String metadataLocalCode, final String schemaTypeCode, String collection, AppLayerFactory appLayerFactory) { MetadataSchemasManager schemaManager = appLayerFactory.getModelLayerFactory() .getMetadataSchemasManager(); try { final Metadata metadata = schemaManager.getSchemaTypes(collection).getDefaultSchema(schemaTypeCode) .getMetadata(metadataLocalCode); schemaManager.modify(collection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { MetadataSchemaBuilder schemaBuilder = types.getDefaultSchema(schemaTypeCode); MetadataBuilder metadataBuilder = schemaBuilder.getMetadata(metadata.getLocalCode()); schemaBuilder.deleteMetadataWithoutValidation(metadataBuilder); } } ); } catch (MetadataSchemasRuntimeException.NoSuchMetadata | MetadataSchemasRuntimeException.NoSuchSchemaType e) { //OK metadat does not exist any more } } private static void disableMetadta(final String metadataLocalCode, final String schemaTypeCode, String collection, AppLayerFactory appLayerFactory) { MetadataSchemasManager schemaManager = appLayerFactory.getModelLayerFactory() .getMetadataSchemasManager(); schemaManager.modify(collection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { try { types.getDefaultSchema(schemaTypeCode).getMetadata(metadataLocalCode).setEnabled(false); } catch (MetadataSchemaBuilderRuntimeException.NoSuchMetadata | MetadataSchemaTypesBuilderRuntimeException.NoSuchSchemaType e) { //OK metadat does not exist any more } } }); } public static boolean isUsed(String metadataLocalCode, String schemaTypeCode, String collection, AppLayerFactory appLayerFactory) { MetadataSchemasManager schemaManager = appLayerFactory.getModelLayerFactory() .getMetadataSchemasManager(); MetadataSchemaTypes types = schemaManager.getSchemaTypes(collection); try { Metadata metadata = types.getDefaultSchema(schemaTypeCode) .getMetadata(metadataLocalCode); LogicalSearchCondition query = LogicalSearchQueryOperators.from(types.getSchemaType(schemaTypeCode)) .where(metadata).isNotNull(); SearchServices searchServices = appLayerFactory.getModelLayerFactory().newSearchServices(); return searchServices.hasResults(new LogicalSearchQuery(query)); } catch (MetadataSchemasRuntimeException.NoSuchSchemaType | MetadataSchemasRuntimeException.NoSuchMetadata e) { //ok return false; } } } }