package com.constellio.app.modules.rm.migrations;
import static com.constellio.app.ui.i18n.i18n.$;
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.entities.schemasDisplay.SchemaDisplayConfig;
import com.constellio.app.modules.rm.model.calculators.ContainerRecordTreeVisibilityCalculator;
import com.constellio.app.modules.rm.model.calculators.FolderTreeVisibilityCalculator;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
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.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.StorageSpace;
import com.constellio.app.modules.rm.wrappers.UniformSubdivision;
import com.constellio.app.modules.rm.wrappers.type.ContainerRecordType;
import com.constellio.app.modules.rm.wrappers.type.DocumentType;
import com.constellio.app.modules.rm.wrappers.type.FolderType;
import com.constellio.app.modules.rm.wrappers.type.MediumType;
import com.constellio.app.modules.rm.wrappers.type.StorageSpaceType;
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.records.Transaction;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.builders.CommonMetadataBuilder;
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;
public class RMMigrationTo5_0_4 extends MigrationHelper implements MigrationScript {
@Override
public String getVersion() {
return "5.0.4";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
new SchemaAlterationFor5_0_4(collection, migrationResourcesProvider, appLayerFactory).migrate();
createEmailDocumentType(collection, appLayerFactory.getModelLayerFactory(), migrationResourcesProvider);
setupDisplayConfigForEmail(collection, appLayerFactory);
}
private void setupDisplayConfigForEmail(String collection, AppLayerFactory appLayerFactory) {
SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager();
SchemaDisplayManagerTransaction transaction = new SchemaDisplayManagerTransaction();
SchemaDisplayConfig schemaFormEmailConfig = order(collection, appLayerFactory, "form",
manager.getSchema(collection, Email.SCHEMA),
Document.TYPE,
Schemas.TITLE.getLocalCode(),
Document.CONTENT,
Document.FOLDER,
Document.KEYWORDS,
Email.EMAIL_TO,
Email.EMAIL_FROM,
Email.EMAIL_IN_NAME_OF,
Email.EMAIL_CC_TO,
Email.EMAIL_BCC_TO,
Email.EMAIL_OBJECT,
Email.EMAIL_ATTACHMENTS_LIST,
Email.EMAIL_SENT_ON,
Email.EMAIL_RECEIVED_ON,
Document.COMPANY,
Email.SUBJECT_TO_BROADCAST_RULE,
Document.AUTHOR,
Document.COMMENTS);
SchemaDisplayConfig schemaDisplayEmailConfig = order(collection, appLayerFactory, "display",
manager.getSchema(collection, Email.SCHEMA),
Document.TYPE,
Schemas.TITLE.getLocalCode(),
Document.CONTENT,
Document.TYPE,
Document.FOLDER,
Document.KEYWORDS,
Email.EMAIL_TO,
Email.EMAIL_FROM,
Email.EMAIL_IN_NAME_OF,
Email.EMAIL_CC_TO,
Email.EMAIL_BCC_TO,
Email.EMAIL_OBJECT,
Email.EMAIL_ATTACHMENTS_LIST,
Email.EMAIL_SENT_ON,
Email.EMAIL_RECEIVED_ON,
Document.COMPANY,
Email.SUBJECT_TO_BROADCAST_RULE,
Document.AUTHOR,
Email.EMAIL_CONTENT,
Document.COMMENTS);
transaction.add(
schemaDisplayEmailConfig.withFormMetadataCodes(schemaFormEmailConfig.getFormMetadataCodes()));
manager.execute(transaction);
}
private void createEmailDocumentType(String collection, ModelLayerFactory modelLayerFactory,
MigrationResourcesProvider migrationResourcesProvider) {
Transaction transaction = new Transaction();
RMSchemasRecordsServices schemas = new RMSchemasRecordsServices(collection, modelLayerFactory);
if (schemas.getDocumentTypeByCode(DocumentType.EMAIL_DOCUMENT_TYPE) == null) {
transaction.add(schemas.newDocumentType().setCode(DocumentType.EMAIL_DOCUMENT_TYPE)
.setTitle($("DocumentType.emailDocumentType")).setLinkedSchema(Email.SCHEMA));
}
try {
modelLayerFactory.newRecordServices().execute(transaction);
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
class SchemaAlterationFor5_0_4 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationFor5_0_4(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
}
public String getVersion() {
return "5.0.4";
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
createCustomSchemaEmail(typesBuilder);
enableCodeMetadata(typesBuilder);
enableTitleMetadata(typesBuilder);
}
private void createCustomSchemaEmail(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaTypeBuilder documentType = typesBuilder.getSchemaType(Email.SCHEMA_TYPE);
MetadataSchemaBuilder emailSchema = documentType.createCustomSchema("email");
emailSchema.createUndeletable(Email.EMAIL_TO).setType(MetadataValueType.STRING).setMultivalue(true);
emailSchema.createUndeletable(Email.EMAIL_FROM).setType(MetadataValueType.STRING);
emailSchema.createUndeletable(Email.EMAIL_IN_NAME_OF).setType(MetadataValueType.STRING);
emailSchema.createUndeletable(Email.EMAIL_CC_TO).setType(MetadataValueType.STRING).setMultivalue(true);
emailSchema.createUndeletable(Email.EMAIL_BCC_TO).setType(MetadataValueType.STRING).setMultivalue(true);
emailSchema.createUndeletable(Email.EMAIL_ATTACHMENTS_LIST).setType(MetadataValueType.STRING).setMultivalue(true);
emailSchema.createUndeletable(Email.EMAIL_OBJECT).setType(MetadataValueType.STRING);
emailSchema.createUndeletable(Email.EMAIL_COMPANY).setType(MetadataValueType.STRING);
emailSchema.createUndeletable(Email.EMAIL_CONTENT).setType(MetadataValueType.TEXT);
emailSchema.createUndeletable(Email.EMAIL_SENT_ON).setType(MetadataValueType.DATE_TIME);
emailSchema.createUndeletable(Email.EMAIL_RECEIVED_ON).setType(MetadataValueType.DATE_TIME);
emailSchema.createUndeletable(Email.SUBJECT_TO_BROADCAST_RULE).setType(MetadataValueType.BOOLEAN);
activateVisibilityCalculator(typesBuilder);
}
private void enableCodeMetadata(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder schema = typesBuilder.getSchemaType(FolderType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(FolderType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(DocumentType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(DocumentType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(MediumType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(MediumType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(StorageSpaceType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(StorageSpaceType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(ContainerRecordType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(ContainerRecordType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(ContainerRecordType.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(ContainerRecordType.CODE).setEnabled(true);
schema = typesBuilder.getSchemaType(FilingSpace.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(FilingSpace.CODE).setEnabled(true).setUniqueValue(false);
}
private void enableTitleMetadata(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder schema = typesBuilder.getSchemaType(AdministrativeUnit.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(Schemas.TITLE_CODE).setDefaultRequirement(true);
schema = typesBuilder.getSchemaType(Category.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(Schemas.TITLE_CODE).setDefaultRequirement(true);
schema = typesBuilder.getSchemaType(FilingSpace.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(Schemas.TITLE_CODE).setDefaultRequirement(true);
schema = typesBuilder.getSchemaType(StorageSpace.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(Schemas.TITLE_CODE).setDefaultRequirement(true);
schema = typesBuilder.getSchemaType(UniformSubdivision.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(Schemas.TITLE_CODE).setDefaultRequirement(true);
}
private void activateVisibilityCalculator(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder schema = typesBuilder.getSchemaType(Folder.SCHEMA_TYPE).getDefaultSchema();
MetadataBuilder folderVisibility = schema.getMetadata(CommonMetadataBuilder.VISIBLE_IN_TREES)
.defineDataEntry().asCalculated(FolderTreeVisibilityCalculator.class);
schema = typesBuilder.getSchemaType(Document.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(CommonMetadataBuilder.VISIBLE_IN_TREES)
.defineDataEntry().asCopied(schema.getMetadata(Document.FOLDER), folderVisibility);
schema = typesBuilder.getSchemaType(ContainerRecord.SCHEMA_TYPE).getDefaultSchema();
schema.getMetadata(CommonMetadataBuilder.VISIBLE_IN_TREES)
.defineDataEntry().asCalculated(ContainerRecordTreeVisibilityCalculator.class);
}
}
}