package com.constellio.app.modules.rm.migrations; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import java.util.HashMap; import java.util.List; import java.util.Map; 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.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.RMUser; import com.constellio.app.modules.rm.wrappers.UniformSubdivision; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.utils.BatchBuilderIterator; import com.constellio.model.entities.records.RecordUpdateOptions; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; /** * Created by Charles Blanchette on 2017-03-22. */ public class RMMigrationTo7_2_0_1 implements MigrationScript { @Override public String getVersion() { return "7.2.0.1"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices(); List<UniformSubdivision> uniformSubdivisions = rm .wrapUniformSubdivisions(appLayerFactory.getModelLayerFactory().newSearchServices().search( new LogicalSearchQuery().setCondition(from(rm.uniformSubdivision.schemaType()).returnAll()))); Map<String, String> descriptions = new HashMap<>(); for (UniformSubdivision uniformSubdivision : uniformSubdivisions) { descriptions.put(uniformSubdivision.getId(), uniformSubdivision.getDescription()); uniformSubdivision.setDescription(null); } BatchBuilderIterator<UniformSubdivision> batchIterator = new BatchBuilderIterator<>(uniformSubdivisions.iterator(), 100); while (batchIterator.hasNext()) { Transaction transaction = new Transaction(); transaction.addAll(batchIterator.next()); transaction.setOptions(RecordUpdateOptions.validationExceptionSafeOptions()); try { recordServices.executeWithoutImpactHandling(transaction); } catch (RecordServicesException e) { e.printStackTrace(); throw new RuntimeException("Failed to set uniformSubdivision descriptions to null in RMMigration7_2_0_1"); } } new SchemaAlterationFor7_2_0_1(collection, migrationResourcesProvider, appLayerFactory).migrate(); new SchemaAlterationFor7_2_0_1_step2(collection, migrationResourcesProvider, appLayerFactory).migrate(); uniformSubdivisions = rm.wrapUniformSubdivisions(appLayerFactory.getModelLayerFactory().newSearchServices().search( new LogicalSearchQuery().setCondition(from(rm.uniformSubdivision.schemaType()).returnAll()))); for (UniformSubdivision uniformSubdivision : uniformSubdivisions) { uniformSubdivision.setDescription(descriptions.get(uniformSubdivision.getId())); } batchIterator = new BatchBuilderIterator<>(uniformSubdivisions.iterator(), 100); while (batchIterator.hasNext()) { Transaction transaction = new Transaction(); transaction.addAll(batchIterator.next()); transaction.setOptions(RecordUpdateOptions.validationExceptionSafeOptions()); try { recordServices.executeWithoutImpactHandling(transaction); } catch (RecordServicesException e) { e.printStackTrace(); throw new RuntimeException("Failed to set uniformSubdivision descriptions to null in RMMigration7_2_0_1"); } } } class SchemaAlterationFor7_2_0_1 extends MetadataSchemasAlterationHelper { protected SchemaAlterationFor7_2_0_1(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } public String getVersion() { return "7.2.0.1"; } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getDefaultSchema(RMUser.SCHEMA_TYPE).createUndeletable(RMUser.DEFAULT_ADMINISTRATIVE_UNIT) .setType(MetadataValueType.STRING).setSystemReserved(true); typesBuilder.getDefaultSchema(UniformSubdivision.SCHEMA_TYPE) .deleteMetadataWithoutValidation( typesBuilder.getMetadata(UniformSubdivision.DEFAULT_SCHEMA + "_" + UniformSubdivision.DESCRIPTION)); } } class SchemaAlterationFor7_2_0_1_step2 extends MetadataSchemasAlterationHelper { protected SchemaAlterationFor7_2_0_1_step2(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } public String getVersion() { return "7.2.0.1"; } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getDefaultSchema(UniformSubdivision.SCHEMA_TYPE).create(UniformSubdivision.DESCRIPTION) .setType(MetadataValueType.TEXT); } } }