package com.constellio.app.modules.rm.migrations;
import java.util.Set;
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.modules.rm.model.validators.FolderValidator;
import com.constellio.app.modules.rm.wrappers.Cart;
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.SchemaTypesDisplayTransactionBuilder;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.records.wrappers.UserDocument;
import com.constellio.model.entities.schemas.entries.DataEntryType;
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.MetadataSchemaTypesBuilder;
public class RMMigrationTo6_4 implements MigrationScript {
@Override
public String getVersion() {
return "6.4";
}
@Override
public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory factory)
throws Exception {
new SchemaAlterationsFor6_4(collection, provider, factory).migrate();
SchemasDisplayManager displayManager = factory.getMetadataSchemasDisplayManager();
SchemaTypesDisplayTransactionBuilder transaction = displayManager.newTransactionBuilderFor(collection);
transaction.add(displayManager.getSchema(collection, "cart_default"));
transaction.add(displayManager.getSchema(collection, "userDocument_default")
.withRemovedDisplayMetadatas("userDocument_default_folder")
.withRemovedFormMetadatas("userDocument_default_folder"));
displayManager.execute(transaction.build());
}
public static class SchemaAlterationsFor6_4 extends MetadataSchemasAlterationHelper {
protected SchemaAlterationsFor6_4(String collection, MigrationResourcesProvider provider, AppLayerFactory factory) {
super(collection, provider, factory);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).defineValidators().add(FolderValidator.class);
updateCartSchema(typesBuilder);
updateFolderSchema(typesBuilder);
setEnabledNonSystemReservedManuallyValuedMetadataAsDuplicable(typesBuilder);
typesBuilder.getDefaultSchema(UserDocument.SCHEMA_TYPE).getMetadata(UserDocument.FOLDER).defineReferences().clearSchemas();
typesBuilder.getDefaultSchema(UserDocument.SCHEMA_TYPE).getMetadata(UserDocument.FOLDER).defineReferencesTo(schemaType(Folder.SCHEMA_TYPE));
}
private void updateCartSchema(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder cart = typesBuilder.getSchemaType(Cart.SCHEMA_TYPE).getDefaultSchema();
if (!cart.hasMetadata(Cart.SHARED_WITH_USERS)) {
cart.getMetadata(CommonMetadataBuilder.TITLE).defineDataEntry().asManual();
cart.getMetadata(Cart.OWNER).setUniqueValue(false);
cart.createUndeletable(Cart.SHARED_WITH_USERS).setMultivalue(true)
.defineReferencesTo(typesBuilder.getSchemaType(User.SCHEMA_TYPE));
}
}
private void setEnabledNonSystemReservedManuallyValuedMetadataAsDuplicable(
final MetadataSchemaTypesBuilder typesBuilder) {
final Set<MetadataBuilder> metadataBuilders = typesBuilder.getSchemaType(Folder.SCHEMA_TYPE).getAllMetadatas();
metadataBuilders.addAll(typesBuilder.getSchemaType(Document.SCHEMA_TYPE).getAllMetadatas());
for (final MetadataBuilder metadataBuilder : metadataBuilders) {
if ((metadataBuilder != null) && metadataBuilder.getEnabled() && !metadataBuilder.isSystemReserved() && (
(metadataBuilder.getDataEntry() != null) && DataEntryType.MANUAL
.equals(metadataBuilder.getDataEntry().getType()))) {
metadataBuilder.setDuplicable(true);
}
}
}
private void updateFolderSchema(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaBuilder folder = typesBuilder.getSchemaType(Folder.SCHEMA_TYPE).getDefaultSchema();
folder.getMetadata(Folder.CATEGORY_ENTERED).setTaxonomyRelationship(false);
folder.getMetadata(Folder.CATEGORY).setTaxonomyRelationship(true);
folder.getMetadata(Folder.ADMINISTRATIVE_UNIT_ENTERED).setTaxonomyRelationship(false);
folder.getMetadata(Folder.ADMINISTRATIVE_UNIT).setTaxonomyRelationship(true);
}
}
}