package com.constellio.app.modules.rm.migrations;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
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.model.CopyRetentionRuleBuilder;
import com.constellio.app.modules.rm.model.calculators.FolderCalendarYearCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentCalendarYearCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentMainCopyRuleCalculator2;
import com.constellio.app.modules.rm.model.calculators.folder.FolderMainCopyRuleCalculator2;
import com.constellio.app.modules.rm.model.calculators.rule.RuleDocumentTypesCalculator2;
import com.constellio.app.modules.rm.model.calculators.rule.RuleFolderTypesCalculator;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.modules.rm.wrappers.type.FolderType;
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.ActionExecutorInBatch;
import com.constellio.model.entities.records.Record;
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.UnhandledRecordModificationImpactHandler;
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.search.SearchServices;
public class RMMigrationTo6_2 implements MigrationScript {
@Override
public String getVersion() {
return "6.2";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory)
throws Exception {
new SchemaAlterationsFor6_2(collection, migrationResourcesProvider, appLayerFactory).migrate();
setupDisplayConfigs(collection, appLayerFactory);
addIdsToCopyRetentionRules(collection, appLayerFactory);
}
private void setupDisplayConfigs(String collection, AppLayerFactory factory) {
SchemasDisplayManager schemaDisplayManager = factory.getMetadataSchemasDisplayManager();
SchemaTypesDisplayTransactionBuilder transaction = schemaDisplayManager.newTransactionBuilderFor(collection);
transaction
.in(Folder.SCHEMA_TYPE).addToForm(Folder.MAIN_COPY_RULE_ID_ENTERED).afterMetadata(Folder.COPY_STATUS_ENTERED)
.in(Document.SCHEMA_TYPE).addToForm(Document.MAIN_COPY_RULE_ID_ENTERED).afterMetadata(Document.TITLE);
schemaDisplayManager.execute(transaction.build());
}
private void addIdsToCopyRetentionRules(String collection, final AppLayerFactory appLayerFactory)
throws Exception {
SearchServices searchServices = appLayerFactory.getModelLayerFactory().newSearchServices();
final RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices();
final RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory);
new ActionExecutorInBatch(searchServices, "Set copy retention rule ids", 250) {
@Override
public void doActionOnBatch(List<Record> records)
throws Exception {
Transaction transaction = new Transaction();
for (RetentionRule rule : rm.wrapRetentionRules(records)) {
CopyRetentionRuleBuilder builder = CopyRetentionRuleBuilder.sequential(appLayerFactory);
builder.addIdsTo(rule.getDocumentCopyRetentionRules());
builder.addIdsTo(rule.getSecondaryCopy());
builder.addIdsTo(rule.getPrincipalCopies());
builder.addIdsTo(rule.getPrincipalDefaultDocumentCopyRetentionRule());
builder.addIdsTo(rule.getSecondaryDefaultDocumentCopyRetentionRule());
transaction.add(rule);
}
transaction.setSkippingRequiredValuesValidation(true);
recordServices.executeWithImpactHandler(transaction, new UnhandledRecordModificationImpactHandler());
}
}.execute(from(rm.retentionRule.schemaType()).returnAll());
}
public static class SchemaAlterationsFor6_2 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationsFor6_2(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) {
super(collection, provider, factory);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
updateDocumentSchema(typesBuilder.getSchemaType(Document.SCHEMA_TYPE).getDefaultSchema());
updateFolderSchema(typesBuilder.getSchemaType(Folder.SCHEMA_TYPE).getDefaultSchema());
updateRetentionRuleSchema(typesBuilder.getSchema(RetentionRule.DEFAULT_SCHEMA));
}
private void updateRetentionRuleSchema(MetadataSchemaBuilder schema) {
MetadataSchemaTypeBuilder folderTypeSchemaType = types().getSchemaType(FolderType.SCHEMA_TYPE);
schema.get(RetentionRule.DESCRIPTION).setSchemaAutocomplete(true);
schema.get(RetentionRule.DOCUMENT_TYPES).defineDataEntry().asCalculated(RuleDocumentTypesCalculator2.class);
schema.create(RetentionRule.FOLDER_TYPES).setMultivalue(true)
.defineReferencesTo(folderTypeSchemaType)
.defineDataEntry().asCalculated(RuleFolderTypesCalculator.class);
}
private void updateDocumentSchema(MetadataSchemaBuilder documentSchemaType) {
documentSchemaType.createUndeletable(Document.MAIN_COPY_RULE_ID_ENTERED).setType(MetadataValueType.STRING);
documentSchemaType.get(Document.MAIN_COPY_RULE).defineDataEntry().asCalculated(DocumentMainCopyRuleCalculator2.class)
.setDefaultRequirement(true);
//TODO remove in new script
documentSchemaType.createUndeletable("calendarYearEntered").setType(MetadataValueType.STRING);
documentSchemaType.createUndeletable("calendarYear").setType(MetadataValueType.DATE).defineDataEntry()
.asCalculated(DocumentCalendarYearCalculator.class);
}
private void updateFolderSchema(MetadataSchemaBuilder folderSchemaType) {
folderSchemaType.createUndeletable(Folder.MAIN_COPY_RULE_ID_ENTERED).setType(MetadataValueType.STRING);
folderSchemaType.get(Folder.MAIN_COPY_RULE).defineDataEntry().asCalculated(FolderMainCopyRuleCalculator2.class);
//FIXME remove in another
folderSchemaType.createUndeletable("calendarYearEntered").setType(MetadataValueType.STRING);
folderSchemaType.createUndeletable("calendarYear").setType(MetadataValueType.DATE).defineDataEntry()
.asCalculated(FolderCalendarYearCalculator.class);
}
}
}