package com.constellio.app.modules.rm.migrations;
import static java.util.Arrays.asList;
import java.util.ArrayList;
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.entities.schemasDisplay.SchemaTypeDisplayConfig;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMRoles;
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.services.factories.AppLayerFactory;
import com.constellio.app.services.schemasDisplay.SchemaDisplayManagerTransaction;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.builders.MetadataBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
public class RMMigrationTo5_0_2 implements MigrationScript {
@Override
public String getVersion() {
return "5.0.2";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
new SchemaAlterationFor5_0_2(collection, migrationResourcesProvider, appLayerFactory).migrate();
createMediumTypes(collection, appLayerFactory.getModelLayerFactory(), migrationResourcesProvider);
MetadataSchemaTypes types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
SchemasDisplayManager schemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager();
setAllMetadatasInDefaultGroup(types, schemasDisplayManager, migrationResourcesProvider);
givenNewPermissionsToExistingRMRoles(collection, appLayerFactory.getModelLayerFactory());
}
private void createMediumTypes(String collection, ModelLayerFactory modelLayerFactory,
MigrationResourcesProvider migrationResourcesProvider) {
Transaction transaction = new Transaction();
RMSchemasRecordsServices schemas = new RMSchemasRecordsServices(collection, modelLayerFactory);
String paperCode = migrationResourcesProvider.getDefaultLanguageString("MediumType.paperCode");
String filmCode = migrationResourcesProvider.getDefaultLanguageString("MediumType.filmCode");
String driveCode = migrationResourcesProvider.getDefaultLanguageString("MediumType.driveCode");
if (schemas.getMediumTypeByCode(paperCode) == null) {
transaction.add(schemas.newMediumType().setCode(paperCode)
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.paperTitle"))
.setAnalogical(true));
}
if (schemas.getMediumTypeByCode(filmCode) == null) {
transaction.add(schemas.newMediumType().setCode(filmCode)
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.filmTitle"))
.setAnalogical(true));
}
if (schemas.getMediumTypeByCode(driveCode) == null) {
transaction.add(schemas.newMediumType().setCode(driveCode)
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.driveTitle"))
.setAnalogical(false));
}
try {
modelLayerFactory.newRecordServices().execute(transaction);
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
private void givenNewPermissionsToExistingRMRoles(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> newUserPermissions = new ArrayList<>(userRole.getOperationPermissions());
newUserPermissions.add(RMPermissionsTo.SHARE_A_SEMIACTIVE_DOCUMENT);
newUserPermissions.add(RMPermissionsTo.SHARE_A_SEMIACTIVE_FOLDER);
newUserPermissions.add(RMPermissionsTo.UPLOAD_SEMIACTIVE_DOCUMENT);
newUserPermissions.add(RMPermissionsTo.DELETE_SEMIACTIVE_DOCUMENT);
newUserPermissions.add(RMPermissionsTo.DELETE_SEMIACTIVE_FOLDERS);
List<String> newManagerPermissions = new ArrayList<>(managerRole.getOperationPermissions());
newManagerPermissions.add(RMPermissionsTo.SHARE_A_SEMIACTIVE_DOCUMENT);
newManagerPermissions.add(RMPermissionsTo.SHARE_A_SEMIACTIVE_FOLDER);
newManagerPermissions.add(RMPermissionsTo.UPLOAD_SEMIACTIVE_DOCUMENT);
newManagerPermissions.add(RMPermissionsTo.DELETE_SEMIACTIVE_DOCUMENT);
newManagerPermissions.add(RMPermissionsTo.DELETE_SEMIACTIVE_FOLDERS);
List<String> newRgdPermissions = new ArrayList<>();
newRgdPermissions.addAll(RMPermissionsTo.PERMISSIONS.getAll());
newRgdPermissions.addAll(CorePermissions.PERMISSIONS.getAll());
modelLayerFactory.getRolesManager().updateRole(userRole.withPermissions(newUserPermissions));
modelLayerFactory.getRolesManager().updateRole(managerRole.withPermissions(newManagerPermissions));
modelLayerFactory.getRolesManager().updateRole(rgdRole.withPermissions(newRgdPermissions));
}
private void setAllMetadatasInDefaultGroup(MetadataSchemaTypes types, SchemasDisplayManager schemasDisplayManager,
MigrationResourcesProvider migrationResourcesProvider) {
String groupLabel = migrationResourcesProvider.getDefaultLanguageString("defaultGroupLabel");
String classifiedInLabel = migrationResourcesProvider.getDefaultLanguageString("classifiedInGroupLabel");
List<MetadataSchemaType> rmTypes = new ArrayList<>();
rmTypes.add(types.getSchemaType("collection"));
rmTypes.add(types.getSchemaType("event"));
rmTypes.add(types.getSchemaType("user"));
rmTypes.add(types.getSchemaType("folder"));
rmTypes.add(types.getSchemaType("ddvFolderType"));
rmTypes.add(types.getSchemaType("containerRecord"));
rmTypes.add(types.getSchemaType("filingSpace"));
rmTypes.add(types.getSchemaType("userDocument"));
rmTypes.add(types.getSchemaType("decommissioningList"));
rmTypes.add(types.getSchemaType("ddvMediumType"));
rmTypes.add(types.getSchemaType("ddvStorageSpaceType"));
rmTypes.add(types.getSchemaType("task"));
rmTypes.add(types.getSchemaType("document"));
rmTypes.add(types.getSchemaType("ddvDocumentType"));
rmTypes.add(types.getSchemaType("retentionRule"));
rmTypes.add(types.getSchemaType("storageSpace"));
rmTypes.add(types.getSchemaType("uniformSubdivision"));
rmTypes.add(types.getSchemaType("group"));
rmTypes.add(types.getSchemaType("category"));
rmTypes.add(types.getSchemaType("administrativeUnit"));
rmTypes.add(types.getSchemaType("ddvContainerRecordType"));
SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction();
for (MetadataSchemaType schemaType : rmTypes) {
SchemaTypeDisplayConfig typeConfig = schemasDisplayManager.getType(types.getCollection(), schemaType.getCode());
Map<String, Map<Language, String>> groups;
if (schemaType.getCode().equals(Folder.SCHEMA_TYPE) || schemaType.getCode().equals(Document.SCHEMA_TYPE)) {
groups = migrationResourcesProvider.getLanguageMap(asList("default:defaultGroupLabel", "classifiedInGroupLabel"));
} else {
groups = migrationResourcesProvider.getLanguageMap(asList("default:defaultGroupLabel"));
}
transaction.getModifiedTypes().add(typeConfig.withMetadataGroup(groups));
}
schemasDisplayManager.execute(transaction);
}
class SchemaAlterationFor5_0_2 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationFor5_0_2(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
}
public String getVersion() {
return "5.0.2";
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) {
for (MetadataBuilder metadataBuilder : typeBuilder.getDefaultSchema().getMetadatas()) {
if ("code".equals(metadataBuilder.getLocalCode())) {
metadataBuilder.setUniqueValue(true);
metadataBuilder.setDefaultRequirement(true);
}
}
}
typesBuilder.getSchemaType("collection").setSecurity(false);
typesBuilder.getSchemaType("event").setSecurity(false);
typesBuilder.getSchemaType("user").setSecurity(false);
typesBuilder.getSchemaType("folder").setSecurity(true);
typesBuilder.getSchemaType("ddvFolderType").setSecurity(false);
typesBuilder.getSchemaType("containerRecord").setSecurity(true);
typesBuilder.getSchemaType("filingSpace").setSecurity(false);
typesBuilder.getSchemaType("userDocument").setSecurity(false);
typesBuilder.getSchemaType("decommissioningList").setSecurity(false);
typesBuilder.getSchemaType("ddvMediumType").setSecurity(false);
typesBuilder.getSchemaType("ddvStorageSpaceType").setSecurity(false);
typesBuilder.getSchemaType("task").setSecurity(false);
typesBuilder.getSchemaType("document").setSecurity(true);
typesBuilder.getSchemaType("ddvDocumentType").setSecurity(false);
typesBuilder.getSchemaType("retentionRule").setSecurity(false);
typesBuilder.getSchemaType("storageSpace").setSecurity(false);
typesBuilder.getSchemaType("uniformSubdivision").setSecurity(false);
typesBuilder.getSchemaType("group").setSecurity(false);
typesBuilder.getSchemaType("category").setSecurity(false);
typesBuilder.getSchemaType("administrativeUnit").setSecurity(true);
typesBuilder.getSchemaType("ddvContainerRecordType").setSecurity(false);
//
// for (MetadataSchemaTypeBuilder schemaTypeBuilder : typesBuilder.getTypes()) {
//
// String code = schemaTypeBuilder.getCode();
// schemaTypeBuilder.setSecurity(
// code.equals(Folder.SCHEMA_TYPE)
// || code.equals(Document.SCHEMA_TYPE)
// || code.equals(AdministrativeUnit.SCHEMA_TYPE)
// || code.equals(ContainerRecord.SCHEMA_TYPE));
// }
}
}
}