package com.constellio.app.modules.rm.migrations;
import static com.constellio.data.utils.LangUtils.withoutDuplicates;
import static java.util.Arrays.asList;
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.enums.MetadataInputType;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMRoles;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.model.enums.DecommissioningMonth;
import com.constellio.app.modules.rm.wrappers.AdministrativeUnit;
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.Email;
import com.constellio.app.modules.rm.wrappers.FilingSpace;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.modules.rm.wrappers.StorageSpace;
import com.constellio.app.modules.rm.wrappers.UniformSubdivision;
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.Taxonomy;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
public class RMMigrationTo5_0_5 implements MigrationScript {
@Override
public String getVersion() {
return "5.0.5";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
new SchemaAlterationFor5_0_5(collection, migrationResourcesProvider, appLayerFactory).migrate();
setupDisplayConfig(collection, appLayerFactory);
setupRoles(collection, appLayerFactory.getModelLayerFactory());
setAdminUnitLabel(collection, appLayerFactory.getModelLayerFactory(), migrationResourcesProvider);
}
private void setAdminUnitLabel(String collection, ModelLayerFactory modelLayerFactory,
MigrationResourcesProvider migrationResourcesProvider) {
TaxonomiesManager manager = modelLayerFactory.getTaxonomiesManager();
Taxonomy adminUnitsTaxo = manager.getEnabledTaxonomyWithCode(collection, RMTaxonomies.ADMINISTRATIVE_UNITS);
adminUnitsTaxo = adminUnitsTaxo.withTitle(migrationResourcesProvider.getDefaultLanguageString("taxo.admUnits"));
manager.editTaxonomy(adminUnitsTaxo);
}
class SchemaAlterationFor5_0_5 extends MetadataSchemasAlterationHelper {
MetadataSchemaTypes types;
protected SchemaAlterationFor5_0_5(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
}
public String getVersion() {
return "5.0.5";
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
//AdministrativeUnit
typesBuilder.getSchema(AdministrativeUnit.DEFAULT_SCHEMA).createUndeletable(
AdministrativeUnit.DECOMMISSIONING_MONTH).defineAsEnum(DecommissioningMonth.class);
//Document
typesBuilder.getSchema(Document.DEFAULT_SCHEMA).createUndeletable(Document.FOLDER_BORROWED)
.setType(MetadataValueType.BOOLEAN);
//Folder
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROWED)
.setType(MetadataValueType.BOOLEAN);
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROW_DATE)
.setType(MetadataValueType.DATE_TIME);
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROW_PREVIEW_RETURN_DATE)
.setType(MetadataValueType.DATE);
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROW_RETURN_DATE)
.setType(MetadataValueType.DATE_TIME);
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROW_USER)
.setType(MetadataValueType.REFERENCE).defineReferencesTo(typesBuilder.getSchemaType(User.SCHEMA_TYPE));
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).createUndeletable(Folder.BORROW_USER_ENTERED)
.setType(MetadataValueType.REFERENCE).defineReferencesTo(typesBuilder.getSchemaType(User.SCHEMA_TYPE));
//Container
typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).createUndeletable(ContainerRecord.BORROWED)
.setType(MetadataValueType.BOOLEAN);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(AdministrativeUnit.DEFAULT_SCHEMA),
AdministrativeUnit.ADRESS, AdministrativeUnit.COMMENTS, AdministrativeUnit.DECOMMISSIONING_MONTH,
AdministrativeUnit.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(Category.DEFAULT_SCHEMA),
Category.COMMENTS, Category.KEYWORDS, Category.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA),
ContainerRecord.COMMENTS, ContainerRecord.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(DecommissioningList.DEFAULT_SCHEMA),
DecommissioningList.COMMENTS, DecommissioningList.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(Document.DEFAULT_SCHEMA),
Document.COMMENTS, Document.DESCRIPTION, Document.KEYWORDS);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(Email.SCHEMA));
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(FilingSpace.DEFAULT_SCHEMA),
FilingSpace.COMMENTS, FilingSpace.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(Folder.DEFAULT_SCHEMA),
Category.COMMENTS, Category.KEYWORDS, Category.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(RetentionRule.DEFAULT_SCHEMA),
RetentionRule.CONFIDENTIAL_DOCUMENTS, RetentionRule.CORPUS, RetentionRule.CORPUS_RULE_NUMBER,
RetentionRule.DESCRIPTION, RetentionRule.ESSENTIAL_DOCUMENTS, RetentionRule.GENERAL_COMMENT,
RetentionRule.HISTORY, RetentionRule.JURIDIC_REFERENCE, RetentionRule.KEYWORDS);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(StorageSpace.DEFAULT_SCHEMA),
StorageSpace.COMMENTS, StorageSpace.DESCRIPTION);
makeAllMetadatasEssentialsInTypeExcept(typesBuilder.getSchema(UniformSubdivision.DEFAULT_SCHEMA),
UniformSubdivision.COMMENTS, UniformSubdivision.DESCRIPTION);
// setEmailLabelsToDefaultValueInsteadOfInit(typesBuilder.getSchema("document_email"));
}
// private void setEmailLabelsToDefaultValueInsteadOfInit(MetadataSchemaBuilder emailSchemaBuilder) {
//
// for (MetadataBuilder metadata : emailSchemaBuilder.getMetadatas()) {
// if (metadata.getTitle() != null && metadata.getTitle().startsWith("init.") && metadata.getInheritance() != null) {
// metadata.setTitle(null);
// }
// }
// }
private void makeAllMetadatasEssentialsInTypeExcept(MetadataSchemaBuilder schemaBuilder, String... except) {
MetadataSchema schema = types.getSchema(schemaBuilder.getCode());
List<String> exceptList = asList(except);
for (Metadata metadata : schema.getMetadatas()) {
if (!metadata.getLocalCode().startsWith("USR") && !exceptList.contains(metadata.getLocalCode())
&& metadata.getInheritance() == null) {
if (!Schemas.ERROR_ON_PHYSICAL_DELETION.hasSameCode(metadata)
&& !Schemas.LOGICALLY_DELETED_ON.hasSameCode(metadata)) {
schemaBuilder.getMetadata(metadata.getLocalCode()).setEnabled(true);
schemaBuilder.getMetadata(metadata.getLocalCode()).setEssential(true);
}
}
}
}
}
private void setupDisplayConfig(String collection, AppLayerFactory appLayerFactory) {
SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager();
ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory();
manager.enableAllMetadatasInAdvancedSearch(collection, Folder.SCHEMA_TYPE);
manager.enableAllMetadatasInAdvancedSearch(collection, Document.SCHEMA_TYPE);
manager.enableAllMetadatasInAdvancedSearch(collection, ContainerRecord.SCHEMA_TYPE);
SchemaTypesDisplayTransactionBuilder transactionBuilder = manager.newTransactionBuilderFor(collection);
transactionBuilder.in(AdministrativeUnit.SCHEMA_TYPE)
.addToDisplay(AdministrativeUnit.DECOMMISSIONING_MONTH, AdministrativeUnit.FILING_SPACES_ADMINISTRATORS)
.atTheEnd();
transactionBuilder.in(AdministrativeUnit.SCHEMA_TYPE)
.addToForm(AdministrativeUnit.DECOMMISSIONING_MONTH)
.afterMetadata(AdministrativeUnit.PARENT);
transactionBuilder.in(Folder.SCHEMA_TYPE)
.addToDisplay(Folder.BORROWED, Folder.BORROW_DATE, Folder.BORROW_USER_ENTERED, Folder.BORROW_PREVIEW_RETURN_DATE)
.beforeTheHugeCommentMetadata();
transactionBuilder.in(Folder.SCHEMA_TYPE)
.addToForm(Folder.BORROW_PREVIEW_RETURN_DATE)
.atTheEnd();
manager.execute(transactionBuilder.build());
SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction();
transaction.add(manager.getMetadata(collection, Folder.DEFAULT_SCHEMA + "_" + Folder.MEDIUM_TYPES)
.withInputType(MetadataInputType.CHECKBOXES));
manager.execute(transaction);
}
private void setupRoles(String collection, ModelLayerFactory modelLayerFactory) {
Role userRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.USER);
Role managerRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.MANAGER);
Role rgdRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.RGD);
List<String> userPermissions = new ArrayList<>(userRole.getOperationPermissions());
userPermissions.add(RMPermissionsTo.BORROW_FOLDER);
userPermissions.add(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER);
List<String> managerPermissions = new ArrayList<>(managerRole.getOperationPermissions());
managerPermissions.add(RMPermissionsTo.BORROW_FOLDER);
managerPermissions.add(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER);
List<String> newRgdPermissions = new ArrayList<>(rgdRole.getOperationPermissions());
newRgdPermissions.add(RMPermissionsTo.BORROW_FOLDER);
newRgdPermissions.add(RMPermissionsTo.MODIFY_SEMIACTIVE_BORROWED_FOLDER);
newRgdPermissions.add(RMPermissionsTo.MODIFY_INACTIVE_BORROWED_FOLDER);
modelLayerFactory.getRolesManager().updateRole(userRole.withPermissions(withoutDuplicates(userPermissions)));
modelLayerFactory.getRolesManager().updateRole(managerRole.withPermissions(withoutDuplicates(managerPermissions)));
modelLayerFactory.getRolesManager().updateRole(rgdRole.withPermissions(withoutDuplicates(newRgdPermissions)));
}
}