package com.constellio.app.modules.rm.migrations;
import static com.constellio.model.entities.schemas.MetadataValueType.BOOLEAN;
import static com.constellio.model.entities.schemas.MetadataValueType.CONTENT;
import static com.constellio.model.entities.schemas.MetadataValueType.STRUCTURE;
import java.util.ArrayList;
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.entities.schemasDisplay.SchemaDisplayConfig;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMRoles;
import com.constellio.app.modules.rm.model.CopyRetentionRuleFactory;
import com.constellio.app.modules.rm.model.CopyRetentionRuleInRuleFactory;
import com.constellio.app.modules.rm.model.calculators.FolderCopyStatusCalculator3;
import com.constellio.app.modules.rm.model.calculators.category.CategoryCopyRetentionRulesOnDocumentTypesCalculator;
import com.constellio.app.modules.rm.model.calculators.category.CategoryLevelCalculator;
import com.constellio.app.modules.rm.model.calculators.decommissioningList.DecomListUniformCategoryCalculator2;
import com.constellio.app.modules.rm.model.calculators.decommissioningList.DecomListUniformCopyRuleCalculator2;
import com.constellio.app.modules.rm.model.calculators.decommissioningList.DecomListUniformCopyTypeCalculator2;
import com.constellio.app.modules.rm.model.calculators.decommissioningList.DecomListUniformRuleCalculator2;
import com.constellio.app.modules.rm.model.calculators.document.DocumentActualDepositDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentActualDestructionDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentActualTransferDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentApplicableCopyRulesCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentArchivisticStatusCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentExpectedDepositDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentExpectedDestructionDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentExpectedTransferDateCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentIsSameInactiveFateAsFolderCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentIsSameSemiActiveFateAsFolderCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentMainCopyRuleCalculator;
import com.constellio.app.modules.rm.model.calculators.document.DocumentRetentionRuleCalculator;
import com.constellio.app.modules.rm.model.enums.CopyType;
import com.constellio.app.modules.rm.model.enums.RetentionRuleScope;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
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.services.factories.AppLayerFactory;
import com.constellio.app.services.schemasDisplay.SchemaDisplayManagerTransaction;
import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.security.Role;
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.MetadataSchemaTypeBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.security.roles.RolesManager;
public class RMMigrationTo5_1_9 implements MigrationScript {
@Override
public String getVersion() {
return "5.1.9";
}
@Override
public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory factory)
throws Exception {
new SchemaAlterationsFor5_1_9(collection, provider, factory).migrate();
setupDisplayConfigs(collection, factory);
updateDecommissioningPermissions(collection, factory);
}
private void setupDisplayConfigs(String collection, AppLayerFactory factory) {
SchemasDisplayManager schemaDisplayManager = factory.getMetadataSchemasDisplayManager();
SchemaTypesDisplayTransactionBuilder transaction = schemaDisplayManager.newTransactionBuilderFor(collection);
transaction.in(RetentionRule.SCHEMA_TYPE).addToDisplay(
RetentionRule.SCOPE,
RetentionRule.PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE,
RetentionRule.SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE,
RetentionRule.DOCUMENT_COPY_RETENTION_RULES
).beforeTheHugeCommentMetadata();
transaction.in(RetentionRule.SCHEMA_TYPE)
.addToForm(RetentionRule.SCOPE).atFirstPosition()
.in(RetentionRule.SCHEMA_TYPE).addToForm(
RetentionRule.PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE,
RetentionRule.SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE,
RetentionRule.DOCUMENT_COPY_RETENTION_RULES).afterMetadata(RetentionRule.COPY_RETENTION_RULES);
transaction.in(Document.SCHEMA_TYPE).removeFromDisplay(
Document.ACTUAL_DEPOSIT_DATE_ENTERED,
Document.ACTUAL_DESTRUCTION_DATE_ENTERED,
Document.ACTUAL_TRANSFER_DATE_ENTERED);
transaction.in(Document.SCHEMA_TYPE).removeFromForm(
Document.ACTUAL_DEPOSIT_DATE_ENTERED,
Document.ACTUAL_DESTRUCTION_DATE_ENTERED,
Document.ACTUAL_TRANSFER_DATE_ENTERED);
transaction.in(Document.SCHEMA_TYPE).addToDisplay(
Document.COPY_STATUS,
Document.FOLDER_ARCHIVISTIC_STATUS,
Document.FOLDER_CATEGORY,
Document.FOLDER_RETENTION_RULE,
Document.MAIN_COPY_RULE,
Document.FOLDER_ACTUAL_TRANSFER_DATE,
Document.FOLDER_EXPECTED_TRANSFER_DATE,
Document.FOLDER_ACTUAL_DEPOSIT_DATE,
Document.FOLDER_ACTUAL_DESTRUCTION_DATE,
Document.FOLDER_EXPECTED_DEPOSIT_DATE,
Document.FOLDER_EXPECTED_DESTRUCTION_DATE
).beforeTheHugeCommentMetadata();
schemaDisplayManager.execute(transaction.build());
}
private void updateDecommissioningPermissions(String collection, AppLayerFactory factory) {
RolesManager roleManager = factory.getModelLayerFactory().getRolesManager();
Role manager = roleManager.getRole(collection, RMRoles.MANAGER);
List<String> permissions = new ArrayList<>(manager.getOperationPermissions());
permissions.remove(RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST);
permissions.remove(RMPermissionsTo.EDIT_DECOMMISSIONING_LIST);
roleManager.updateRole(manager.withPermissions(permissions));
}
public static class SchemaAlterationsFor5_1_9 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationsFor5_1_9(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) {
super(collection, provider, factory);
configureTableMetadatas(collection, factory);
}
private void configureTableMetadatas(String collection, AppLayerFactory factory) {
SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction();
MetadataSchemasManager metadataSchemasManager = factory.getModelLayerFactory().getMetadataSchemasManager();
List<MetadataSchemaType> schemaTypes = metadataSchemasManager
.getSchemaTypes(collection).getSchemaTypes();
SchemasDisplayManager manager = factory.getMetadataSchemasDisplayManager();
for (MetadataSchemaType metadataSchemaType : schemaTypes) {
for (MetadataSchema metadataSchema : metadataSchemaType.getCustomSchemas()) {
SchemaDisplayConfig customConfig = manager.getSchema(collection, metadataSchema.getCode());
SchemaDisplayConfig newCustomConfig = customConfig.withTableMetadataCodes(new ArrayList<String>());
transaction.add(newCustomConfig);
}
SchemaDisplayConfig config = manager.getSchema(collection, metadataSchemaType.getDefaultSchema().getCode());
SchemaDisplayConfig newConfig = config.withTableMetadataCodes(config.getSearchResultsMetadataCodes());
transaction.add(newConfig);
}
manager.execute(transaction);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder builder) {
createNewRetentionRulesMetadatas();
setupCategoryMetadatasCalculators();
setupFoldersMetadatasCalculators();
setupDocumentsMetadatasCalculators();
alterContainerSchema();
createNewDecommissioningListMetadata();
for (MetadataSchemaTypeBuilder typeBuilder : builder.getTypes()) {
MetadataSchemaBuilder schemaBuilder = typeBuilder.getDefaultSchema();
if (schemaBuilder.hasMetadata("description")) {
schemaBuilder.get("description").setEnabled(true).setEssentialInSummary(true);
}
}
}
private void createNewDecommissioningListMetadata() {
MetadataSchemaBuilder schema = types().getSchemaType(DecommissioningList.SCHEMA_TYPE)
.getDefaultSchema();
MetadataSchemaTypeBuilder document = types().getSchemaType(Document.SCHEMA_TYPE);
schema.createUndeletable(DecommissioningList.DOCUMENTS_REPORT_CONTENT).setType(CONTENT);
schema.createUndeletable(DecommissioningList.FOLDERS_REPORT_CONTENT).setType(CONTENT);
schema.createUndeletable(DecommissioningList.DOCUMENTS).defineReferencesTo(document).setMultivalue(true);
schema.get(DecommissioningList.UNIFORM_CATEGORY).defineDataEntry().asCalculated(
DecomListUniformCategoryCalculator2.class);
schema.get(DecommissioningList.UNIFORM_COPY_RULE).defineDataEntry().asCalculated(
DecomListUniformCopyRuleCalculator2.class);
schema.get(DecommissioningList.UNIFORM_RULE).defineDataEntry().asCalculated(
DecomListUniformRuleCalculator2.class);
schema.get(DecommissioningList.UNIFORM_COPY_TYPE).defineDataEntry().asCalculated(
DecomListUniformCopyTypeCalculator2.class);
schema.get(DecommissioningList.TYPE).setDefaultRequirement(true);
}
private void setupCategoryMetadatasCalculators() {
MetadataSchemaBuilder defaultSchema = types().getSchemaType(Category.SCHEMA_TYPE)
.getDefaultSchema();
defaultSchema.create(Category.LEVEL).setType(MetadataValueType.NUMBER)
.defineDataEntry().asCalculated(CategoryLevelCalculator.class);
defaultSchema.create(Category.COPY_RETENTION_RULES_ON_DOCUMENT_TYPES)
.defineStructureFactory(CopyRetentionRuleInRuleFactory.class).setMultivalue(true)
.defineDataEntry().asCalculated(CategoryCopyRetentionRulesOnDocumentTypesCalculator.class);
}
private void setupFoldersMetadatasCalculators() {
MetadataSchemaBuilder defaultSchema = types().getSchemaType(Folder.SCHEMA_TYPE)
.getDefaultSchema();
defaultSchema.get(Folder.COPY_STATUS)
.defineDataEntry().asCalculated(FolderCopyStatusCalculator3.class);
}
private void setupDocumentsMetadatasCalculators() {
MetadataSchemaTypeBuilder retentionRuleSchemaType = types().getSchemaType(RetentionRule.SCHEMA_TYPE);
MetadataSchemaTypeBuilder folderSchemaType = types().getSchemaType(Folder.SCHEMA_TYPE);
MetadataBuilder folderRetentionRule = folderSchemaType.getDefaultSchema().getMetadata(Folder.RETENTION_RULE);
MetadataBuilder folderCopyStatus = folderSchemaType.getDefaultSchema().getMetadata(Folder.COPY_STATUS);
MetadataSchemaBuilder defaultSchema = types().getSchemaType(Document.SCHEMA_TYPE)
.getDefaultSchema();
defaultSchema.create(Document.INHERITED_FOLDER_RETENTION_RULE)
.defineReferencesTo(retentionRuleSchemaType)
.defineDataEntry().asCopied(defaultSchema.get(Document.FOLDER), folderRetentionRule);
defaultSchema.create(Document.COPY_STATUS).defineAsEnum(CopyType.class)
.defineDataEntry().asCopied(defaultSchema.get(Document.FOLDER), folderCopyStatus);
defaultSchema.getMetadata(Document.FOLDER_RETENTION_RULE)
.defineDataEntry().asCalculated(DocumentRetentionRuleCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_ARCHIVISTIC_STATUS)
.defineDataEntry().asCalculated(DocumentArchivisticStatusCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_ACTUAL_DEPOSIT_DATE)
.defineDataEntry().asCalculated(DocumentActualDepositDateCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_ACTUAL_DESTRUCTION_DATE)
.defineDataEntry().asCalculated(DocumentActualDestructionDateCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_ACTUAL_TRANSFER_DATE)
.defineDataEntry().asCalculated(DocumentActualTransferDateCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_EXPECTED_DEPOSIT_DATE)
.defineDataEntry().asCalculated(DocumentExpectedDepositDateCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_EXPECTED_DESTRUCTION_DATE)
.defineDataEntry().asCalculated(DocumentExpectedDestructionDateCalculator.class);
defaultSchema.getMetadata(Document.FOLDER_EXPECTED_TRANSFER_DATE)
.defineDataEntry().asCalculated(DocumentExpectedTransferDateCalculator.class);
defaultSchema.createUndeletable(Document.APPLICABLE_COPY_RULES)
.defineStructureFactory(CopyRetentionRuleInRuleFactory.class).setMultivalue(true)
.defineDataEntry().asCalculated(DocumentApplicableCopyRulesCalculator.class);
defaultSchema.createUndeletable(Document.SAME_SEMI_ACTIVE_FATE_AS_FOLDER).setType(BOOLEAN)
.defineDataEntry().asCalculated(DocumentIsSameSemiActiveFateAsFolderCalculator.class);
defaultSchema.createUndeletable(Document.SAME_INACTIVE_FATE_AS_FOLDER).setType(BOOLEAN)
.defineDataEntry().asCalculated(DocumentIsSameInactiveFateAsFolderCalculator.class);
defaultSchema.createUndeletable(Document.MAIN_COPY_RULE)
.defineStructureFactory(CopyRetentionRuleFactory.class)
.defineDataEntry().asCalculated(DocumentMainCopyRuleCalculator.class);
defaultSchema.createUndeletable(Document.ACTUAL_DEPOSIT_DATE_ENTERED).setType(MetadataValueType.DATE);
defaultSchema.createUndeletable(Document.ACTUAL_DESTRUCTION_DATE_ENTERED).setType(MetadataValueType.DATE);
defaultSchema.createUndeletable(Document.ACTUAL_TRANSFER_DATE_ENTERED).setType(MetadataValueType.DATE);
}
private void createNewRetentionRulesMetadatas() {
MetadataSchemaBuilder defaultSchema = types().getSchemaType(RetentionRule.SCHEMA_TYPE)
.getDefaultSchema();
defaultSchema.createUndeletable(RetentionRule.DOCUMENT_COPY_RETENTION_RULES)
.setMultivalue(true)
.setType(STRUCTURE)
.defineStructureFactory(CopyRetentionRuleFactory.class);
defaultSchema.createUndeletable(RetentionRule.PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE)
.setType(STRUCTURE)
.defineStructureFactory(CopyRetentionRuleFactory.class);
defaultSchema.createUndeletable(RetentionRule.SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE)
.setType(STRUCTURE)
.defineStructureFactory(CopyRetentionRuleFactory.class);
defaultSchema.createUndeletable(RetentionRule.SCOPE)
.defineAsEnum(RetentionRuleScope.class);
defaultSchema.get(RetentionRule.COPY_RETENTION_RULES).setDefaultRequirement(false);
}
private void alterContainerSchema() {
MetadataSchemaBuilder defaultSchema = types().getSchemaType(ContainerRecord.SCHEMA_TYPE).getDefaultSchema();
defaultSchema.getMetadata(ContainerRecord.POSITION).setEssential(false);
}
}
}