package com.constellio.app.modules.rm.migrations;
import com.constellio.app.entities.modules.ComboMigrationScript;
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.reports.wrapper.Printable;
import com.constellio.app.modules.rm.RMEmailTemplateConstants;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.Email;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.PrintableLabel;
import com.constellio.app.modules.rm.wrappers.type.DocumentType;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.schemasDisplay.SchemaTypesDisplayTransactionBuilder;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration;
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.records.wrappers.UserDocument;
import com.constellio.model.entities.schemas.*;
import com.constellio.model.services.configs.SystemConfigurationsManager;
import com.constellio.model.services.contents.ContentManager;
import com.constellio.model.services.contents.ContentVersionDataSummary;
import com.constellio.model.services.emails.EmailTemplatesManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.migrations.ConstellioEIMConfigs;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
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.users.UserServices;
import org.apache.commons.io.IOUtils;
import java.io.*;
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 static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.entities.Language.French;
import static java.util.Arrays.asList;
public class RMMigrationCombo implements ComboMigrationScript {
@Override
public List<MigrationScript> getVersions() {
return asList(
new RMMigrationTo5_0_1(),
new RMMigrationTo5_0_2(),
new RMMigrationTo5_0_3(),
new RMMigrationTo5_0_4(),
new RMMigrationTo5_0_4_1(),
new RMMigrationTo5_0_5(),
new RMMigrationTo5_0_6(),
new RMMigrationTo5_0_7(),
new RMMigrationTo5_1_0_3(),
new RMMigrationTo5_1_0_4(),
new RMMigrationTo5_1_0_6(),
new RMMigrationTo5_1_2(),
new RMMigrationTo5_1_2_2(),
new RMMigrationTo5_1_3(),
new RMMigrationTo5_1_3(),
new RMMigrationTo5_1_4_1(),
new RMMigrationTo5_1_5(),
new RMMigrationTo5_1_7(),
new RMMigrationTo5_1_9(),
new RMMigrationTo6_1(),
new RMMigrationTo6_1_4(),
new RMMigrationTo6_2(),
new RMMigrationTo6_2_0_7(),
new RMMigrationTo6_3(),
new RMMigrationTo6_4(),
new RMMigrationTo6_5(),
new RMMigrationTo6_5_1(),
new RMMigrationTo6_5_7(),
new RMMigrationTo6_5_20(),
new RMMigrationTo6_5_21(),
new RMMigrationTo6_5_33(),
new RMMigrationTo6_5_34(),
new RMMigrationTo6_5_36(),
new RMMigrationTo6_5_37(),
new RMMigrationTo6_5_50(),
new RMMigrationTo6_5_54(),
new RMMigrationTo6_6(),
new RMMigrationTo6_7(),
new RMMigrationTo7_0_5(),
new RMMigrationTo7_0_10_5(),
new RMMigrationTo7_1()
);
}
@Override
public String getVersion() {
return getVersions().get(getVersions().size() - 1).getVersion();
}
GeneratedRMMigrationCombo generatedComboMigration;
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory)
throws Exception {
ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory();
generatedComboMigration = new GeneratedRMMigrationCombo(collection, appLayerFactory,
migrationResourcesProvider);
new SchemaAlteration(collection, migrationResourcesProvider, appLayerFactory).migrate();
generatedComboMigration.applyGeneratedRoles();
generatedComboMigration.applySchemasDisplay(appLayerFactory.getMetadataSchemasDisplayManager());
applySchemasDisplay2(collection, appLayerFactory.getMetadataSchemasDisplayManager());
RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices();
MetadataSchemaTypes types = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
RMMigrationTo5_0_1.setupClassificationPlanTaxonomies(collection, modelLayerFactory, migrationResourcesProvider);
RMMigrationTo5_0_1.setupStorageSpaceTaxonomy(collection, modelLayerFactory, migrationResourcesProvider);
RMMigrationTo5_0_1.setupAdminUnitTaxonomy(collection, modelLayerFactory, migrationResourcesProvider);
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection);
recordServices.execute(createRecordTransaction(collection, migrationResourcesProvider, appLayerFactory, types));
SystemConfigurationsManager configManager = modelLayerFactory.getSystemConfigurationsManager();
String defaultTaxonomy = modelLayerFactory.getSystemConfigs().getDefaultTaxonomy();
if (defaultTaxonomy == null) {
configManager.setValue(ConstellioEIMConfigs.DEFAULT_TAXONOMY, RMTaxonomies.ADMINISTRATIVE_UNITS);
}
modelLayerFactory.getMetadataSchemasManager().modify(collection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.MAIN_COPY_RULE).addLabel(French, "Exemplaire");
}
});
}
private void applySchemasDisplay2(String collection, SchemasDisplayManager manager) {
SchemaTypesDisplayTransactionBuilder transaction = manager.newTransactionBuilderFor(collection);
//transaction.add(manager.getSchema(collection, "cart_default").withRemovedFormMetadatas("cart_default_title"));
SchemaDisplayConfig userTask = manager.getSchema(collection, "userTask_default");
userTask = userTask.withNewDisplayMetadataBefore("userTask_default_administrativeUnit", "userTask_default_comments");
userTask = userTask.withNewDisplayMetadataBefore("userTask_default_linkedDocuments", "userTask_default_comments");
userTask = userTask.withNewDisplayMetadataBefore("userTask_default_linkedFolders", "userTask_default_comments");
userTask = userTask.withNewFormMetadata("userTask_default_linkedDocuments");
userTask = userTask.withNewFormMetadata("userTask_default_linkedFolders");
userTask = userTask.withTableMetadataCodes(
asList("userTask_default_title", "userTask_default_status", "userTask_default_dueDate",
"userTask_default_assignee"));
transaction.add(userTask);
SchemaDisplayConfig userDocument = manager.getSchema(collection, "userDocument_default");
transaction.add(userDocument.withRemovedDisplayMetadatas("userDocument_default_folder")
.withRemovedFormMetadatas("userDocument_default_folder"));
//userDocument.withNew
SchemaDisplayConfig container = manager.getSchema(collection, ContainerRecord.DEFAULT_SCHEMA);
container = container.withNewFormMetadata(ContainerRecord.DEFAULT_SCHEMA + "_" + ContainerRecord.FILL_RATIO_ENTRED);
transaction.add(container);
manager.execute(transaction.build());
}
private Transaction createRecordTransaction(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory, MetadataSchemaTypes types) {
Transaction transaction = new Transaction();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(types.getCollection(), appLayerFactory.getModelLayerFactory());
transaction.add(rm.newMediumType().setCode(migrationResourcesProvider.getDefaultLanguageString("MediumType.paperCode"))
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.paperTitle"))
.setAnalogical(true));
transaction.add(rm.newMediumType().setCode(migrationResourcesProvider.getDefaultLanguageString("MediumType.filmCode"))
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.filmTitle"))
.setAnalogical(true));
transaction.add(rm.newMediumType().setCode(migrationResourcesProvider.getDefaultLanguageString("MediumType.driveCode"))
.setTitle(migrationResourcesProvider.getDefaultLanguageString("MediumType.driveTitle"))
.setAnalogical(false));
transaction.add(rm.newDocumentType().setCode(DocumentType.EMAIL_DOCUMENT_TYPE)
.setTitle($("DocumentType.emailDocumentType")).setLinkedSchema(Email.SCHEMA));
transaction.add(rm.newVariableRetentionPeriod().setCode("888")
.setTitle(migrationResourcesProvider.getDefaultLanguageString("init.variablePeriod888")));
transaction.add(rm.newVariableRetentionPeriod().setCode("999")
.setTitle(migrationResourcesProvider.getDefaultLanguageString("init.variablePeriod999")));
transaction.add(rm.newFacetField().setOrder(2).setFieldDataStoreCode("administrativeUnitId_s")
.setTitle(migrationResourcesProvider.get("init.facet.administrativeUnit")));
transaction.add(rm.newFacetField().setOrder(2).setFieldDataStoreCode("categoryId_s")
.setTitle(migrationResourcesProvider.get("init.facet.category")));
transaction.add(rm.newFacetField().setOrder(2).setFieldDataStoreCode("archivisticStatus_s")
.setTitle(migrationResourcesProvider.get("init.facet.archivisticStatus")));
transaction.add(rm.newFacetField().setOrder(3).setFieldDataStoreCode("copyStatus_s")
.setTitle(migrationResourcesProvider.get("init.facet.copyStatus")));
transaction.add(rm.newFacetField().setTitle(migrationResourcesProvider.getDefaultLanguageString("facets.folderType"))
.setFieldDataStoreCode(rm.folder.folderType().getDataStoreCode()).setActive(false));
transaction.add(rm.newFacetField().setTitle(migrationResourcesProvider.getDefaultLanguageString("facets.documentType"))
.setFieldDataStoreCode(rm.documentDocumentType().getDataStoreCode()).setActive(false));
try {
transaction = createDefaultLabel(collection, appLayerFactory, migrationResourcesProvider, transaction);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return transaction;
}
public Transaction createDefaultLabel(String collection, AppLayerFactory factory, MigrationResourcesProvider provider, Transaction trans) throws FileNotFoundException {
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();
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);
ContentVersionDataSummary upload = contentManager.upload(new FileInputStream(fi), 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);
}
return 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;
}
class SchemaAlteration extends MetadataSchemasAlterationHelper {
protected SchemaAlteration(String collection,
MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
//This module is fixing problems in other module
for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) {
for (MetadataBuilder metadata : typeBuilder.getAllMetadatas()) {
if (metadata.getLocalCode().equals("comments")) {
metadata.setTypeWithoutValidation(MetadataValueType.STRUCTURE);
}
}
}
for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) {
MetadataSchemaBuilder schemaBuilder = typeBuilder.getDefaultSchema();
if (schemaBuilder.hasMetadata("description")) {
schemaBuilder.get("description").setEnabled(true).setEssentialInSummary(true);
}
}
for (MetadataSchemaTypeBuilder typeBuilder : typesBuilder.getTypes()) {
for (MetadataBuilder metadataBuilder : typeBuilder.getDefaultSchema().getMetadatas()) {
if ("code".equals(metadataBuilder.getLocalCode())) {
metadataBuilder.setUniqueValue(true);
metadataBuilder.setDefaultRequirement(true);
}
}
}
generatedComboMigration.applyGeneratedSchemaAlteration(typesBuilder);
typesBuilder.getDefaultSchema(UserDocument.SCHEMA_TYPE).getMetadata(Schemas.TITLE_CODE).getPopulateConfigsBuilder()
.addProperty("subject").addProperty("title");
typesBuilder.getSchema(Email.SCHEMA).getMetadata(Schemas.TITLE_CODE).getPopulateConfigsBuilder()
.addProperty("subject");
}
}
private void addEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider,
String collection) {
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, "remindReturnBorrowedFolderTemplate.html",
RMEmailTemplateConstants.REMIND_BORROW_TEMPLATE_ID);
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, "approvalRequestForDecomListTemplate.html",
RMEmailTemplateConstants.APPROVAL_REQUEST_TEMPLATE_ID);
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, "validationRequestForDecomListTemplate.html",
RMEmailTemplateConstants.VALIDATION_REQUEST_TEMPLATE_ID);
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, "alertAvailableTemplate.html",
RMEmailTemplateConstants.ALERT_AVAILABLE_ID);
addEmailTemplates(appLayerFactory, migrationResourcesProvider, collection, "alertWhenDecommissioningListCreatedTemplate.html",
RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID);
}
private void addEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider,
String collection,
String templateFileName, String templateId) {
InputStream templateInputStream = migrationResourcesProvider.getStream(templateFileName);
EmailTemplatesManager emailTemplateManager = appLayerFactory.getModelLayerFactory()
.getEmailTemplatesManager();
try {
emailTemplateManager.addCollectionTemplateIfInexistent(templateId, collection, templateInputStream);
} catch (IOException | OptimisticLockingConfiguration e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(templateInputStream);
}
}
}