package com.constellio.app.modules.rm.migrations;
import static com.constellio.model.entities.Language.French;
import static com.constellio.model.entities.schemas.MetadataTransiency.TRANSIENT_EAGER;
import static com.constellio.model.entities.schemas.MetadataValueType.STRING;
import static java.util.Arrays.asList;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.constellio.app.entities.modules.MetadataSchemasAlterationHelper;
import com.constellio.app.entities.modules.MigrationHelper;
import com.constellio.app.entities.modules.MigrationResourcesProvider;
import com.constellio.app.entities.modules.MigrationScript;
import com.constellio.app.modules.reports.wrapper.Printable;
import com.constellio.app.modules.rm.constants.RMRoles;
import com.constellio.app.modules.rm.model.calculators.container.ContainerRecordLocalizationCalculator;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.PrintableLabel;
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.CorePermissions;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.Report;
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.contents.ContentManager;
import com.constellio.model.services.contents.ContentVersionDataSummary;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.security.roles.RolesManager;
import com.constellio.model.services.users.UserServices;
public class RMMigrationTo7_1 extends MigrationHelper implements MigrationScript {
public static final String MANAGE_LABELS_PERMISSION = "manageLabels";
@Override
public String getVersion() {
return "7.1";
}
@Override
public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory factory)
throws Exception {
SchemaAlterationsFor6_7 s = new SchemaAlterationsFor6_7(collection, provider, factory);
s.migrate();
s.setupRoles(collection, factory.getModelLayerFactory().getRolesManager(), provider);
SchemasDisplayManager displayManager = factory.getMetadataSchemasDisplayManager();
SchemaTypesDisplayTransactionBuilder transaction = displayManager.newTransactionBuilderFor(collection);
transaction.add(displayManager.getSchema(collection, PrintableLabel.DEFAULT_SCHEMA)
.withNewTableMetadatas(PrintableLabel.DEFAULT_SCHEMA + "_" + PrintableLabel.TITLE)
.withRemovedDisplayMetadatas(PrintableLabel.DEFAULT_SCHEMA + "_" + PrintableLabel.ISDELETABLE)
.withRemovedFormMetadatas(PrintableLabel.DEFAULT_SCHEMA + "_" + PrintableLabel.ISDELETABLE)
);
displayManager.execute(transaction.build());
createDefaultLabel(collection, factory, provider);
givenNewPermissionsToRGDandADMRoles(collection, factory.getModelLayerFactory());
}
private void givenNewPermissionsToRGDandADMRoles(String collection, ModelLayerFactory modelLayerFactory) {
Role rgdRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.RGD);
List<String> newRgdPermissions = new ArrayList<>();
newRgdPermissions.add(CorePermissions.MANAGE_LABELS);
modelLayerFactory.getRolesManager().updateRole(rgdRole.withNewPermissions(newRgdPermissions));
}
public void createDefaultLabel(String collection, AppLayerFactory factory, MigrationResourcesProvider provider)
throws Exception {
Map<String, Integer> map = new HashMap<>();
map.put("5159", 7);
map.put("5161", 10);
map.put("5162", 7);
map.put("5163", 5);
ModelLayerFactory model = factory.getModelLayerFactory();
RecordServices rs = model.newRecordServices();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, factory);
MetadataSchemaType metaBuilder = factory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection)
.getSchemaType(Printable.SCHEMA_TYPE);
MetadataSchema typeBuilder = metaBuilder.getSchema(PrintableLabel.SCHEMA_LABEL);
ContentManager contentManager = model.getContentManager();
UserServices userServices = model.newUserServices();
Transaction trans = new Transaction();
File f = provider.getFile("defaultJasperFiles");
List<File> files = getFolders(f, provider);
for (File fi : files) {
Record record = rs.newRecordWithSchema(metaBuilder.getSchema(PrintableLabel.SCHEMA_LABEL));
String type = fi.getName().matches("(.)+_(Container.jasper)") ? ContainerRecord.SCHEMA_TYPE : Folder.SCHEMA_TYPE;
String titre = "Code de plan justifié ";
Matcher m = Pattern.compile("(.)+_(\\d{4})_(.)+").matcher(fi.getName());
m.find();
String format = m.group(2);
record.set(typeBuilder.getMetadata(PrintableLabel.TYPE_LABEL), type);
record.set(typeBuilder.getMetadata(PrintableLabel.LIGNE), map.get(format));
if (type.equals(Folder.SCHEMA_TYPE)) {
titre += provider.getDefaultLanguageString("Migration.typeSchemaDossier") + " " + (fi.getName().contains("_D_") ?
provider.getDefaultLanguageString("Migration.typeAveryDroite") :
provider.getDefaultLanguageString("Migration.typeAveryGauche"));
} else {
titre += provider.getDefaultLanguageString("Migration.typeSchemaConteneur");
}
String etiquetteName = provider.getDefaultLanguageString("Migration.etiquetteName");
String extension = provider.getDefaultLanguageString("Migration.fileExtension");
titre += " (" + etiquetteName + " " + format + ")";
record.set(typeBuilder.getMetadata(PrintableLabel.COLONNE), 2);
record.set(typeBuilder.getMetadata(Printable.ISDELETABLE), false);
FileInputStream fileInputStream = new FileInputStream(fi);
try {
ContentVersionDataSummary upload = contentManager
.upload(fileInputStream, etiquetteName + " " + format + " " + type);
record.set(typeBuilder.getMetadata(Report.TITLE), titre);
record.set(typeBuilder.getMetadata(Printable.JASPERFILE),
contentManager.createFileSystem(etiquetteName + "-" + format + "-" + type + extension, upload));
trans.add(record);
} finally {
fileInputStream.close();
}
}
rs.execute(trans);
}
public List<File> getFolders(File file, MigrationResourcesProvider provider) {
List<File> temp = new ArrayList<>();
ArrayList<File> files = new ArrayList<>(asList(file.listFiles()));
String extension = provider.getDefaultLanguageString("Migration.fileExtension");
for (File f : files) {
if (f.isDirectory()) {
temp.addAll(getFolders(f, provider));
} else if (f.getName().endsWith(extension)) {
temp.add(f);
}
}
return temp;
}
public static class SchemaAlterationsFor6_7 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationsFor6_7(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) {
super(collection, provider, factory);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder builder = typesBuilder.getSchemaType(Printable.SCHEMA_TYPE)
.createCustomSchema(PrintableLabel.SCHEMA_LABEL);
builder.create(PrintableLabel.TYPE_LABEL).setType(STRING).setUndeletable(true).setEssential(true).defineDataEntry()
.asManual();
builder.create(PrintableLabel.LIGNE).setType(MetadataValueType.NUMBER).setUndeletable(true).setEssential(true)
.defineDataEntry().asManual();
builder.create(PrintableLabel.COLONNE).setType(MetadataValueType.NUMBER).setUndeletable(true).setEssential(true)
.defineDataEntry().asManual();
typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.MAIN_COPY_RULE).addLabel(French, "Exemplaire");
migrateContainerRecord(typesBuilder);
typesBuilder.getDefaultSchema(Document.SCHEMA_TYPE).get(Document.MIME_TYPE).setEssentialInSummary(true);
MetadataSchemaBuilder folderSchema = typesBuilder.getSchema(Folder.DEFAULT_SCHEMA);
folderSchema.getMetadata(Folder.ACTIVE_RETENTION_CODE).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.SEMIACTIVE_RETENTION_CODE).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.SEMIACTIVE_RETENTION_TYPE).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.COPY_RULES_EXPECTED_TRANSFER_DATES).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.COPY_RULES_EXPECTED_DEPOSIT_DATES).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.COPY_RULES_EXPECTED_DESTRUCTION_DATES).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.MAIN_COPY_RULE).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.DECOMMISSIONING_DATE).setTransiency(TRANSIENT_EAGER);
folderSchema.getMetadata(Folder.ADMINISTRATIVE_UNIT).setTaxonomyRelationship(false);
folderSchema.getMetadata(Folder.ADMINISTRATIVE_UNIT_ENTERED).setTaxonomyRelationship(true);
}
private void migrateContainerRecord(MetadataSchemaTypesBuilder typesBuilder) {
typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).create(ContainerRecord.LOCALIZATION).setType(STRING)
.defineDataEntry().asCalculated(ContainerRecordLocalizationCalculator.class);
typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).get(ContainerRecord.TEMPORARY_IDENTIFIER)
.setDefaultRequirement(false);
typesBuilder.getSchema(ContainerRecord.DEFAULT_SCHEMA).get(ContainerRecord.IDENTIFIER).setDefaultRequirement(false);
}
private void setupRoles(String collection, RolesManager manager, MigrationResourcesProvider provider) {
manager.updateRole(
manager.getRole(collection, RMRoles.MANAGER).withNewPermissions(asList(MANAGE_LABELS_PERMISSION)));
}
}
}