package com.constellio.app.modules.rm.services; import static com.constellio.app.ui.i18n.i18n.$; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.constellio.app.modules.rm.wrappers.structures.CommentFactory; import com.constellio.model.entities.Language; import com.constellio.model.entities.records.wrappers.HierarchicalValueListItem; import com.constellio.model.entities.records.wrappers.ValueListItem; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; 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 ValueListItemSchemaTypeBuilder { public enum ValueListItemSchemaTypeCodeMode {REQUIRED_AND_UNIQUE, FACULTATIVE, DISABLED} MetadataSchemaTypesBuilder metadataSchemaTypesBuilder; public ValueListItemSchemaTypeBuilder( MetadataSchemaTypesBuilder metadataSchemaTypesBuilder) { this.metadataSchemaTypesBuilder = metadataSchemaTypesBuilder; } public MetadataSchemaTypeBuilder createValueListItemSchema(String code, Map<Language, String> labels, ValueListItemSchemaTypeBuilderOptions options) { MetadataSchemaTypeBuilder typeBuilder = metadataSchemaTypesBuilder.createNewSchemaType(code); typeBuilder.setLabels(labels); typeBuilder.setSecurity(false); MetadataSchemaBuilder defaultSchemaBuilder = typeBuilder.getDefaultSchema().setLabels(labels); defaultSchemaBuilder.getMetadata(Schemas.TITLE_CODE).setUniqueValue(options.titleUnique).setDefaultRequirement(true); MetadataBuilder codeMetadata = defaultSchemaBuilder.create(ValueListItem.CODE).setType( MetadataValueType.STRING).setSearchable(true).setUndeletable(true).setSchemaAutocomplete(true); List<Language> languages = metadataSchemaTypesBuilder.getLanguages(); for (Language language : languages) { codeMetadata.addLabel(language, $("init.valuelist.default.code")); } codeMetadata.setSchemaAutocomplete(true); if (options.codeMode == ValueListItemSchemaTypeCodeMode.REQUIRED_AND_UNIQUE) { codeMetadata.setUniqueValue(true).setDefaultRequirement(true); } else if (options.codeMode == ValueListItemSchemaTypeCodeMode.DISABLED) { codeMetadata.setEnabled(false); } MetadataBuilder descriptionMetadata = defaultSchemaBuilder.create(ValueListItem.DESCRIPTION) .setType(MetadataValueType.TEXT).setSearchable(true) .setUndeletable(true); for (Language language : languages) { descriptionMetadata.addLabel(language, $("init.valuelist.default.description")); } defaultSchemaBuilder.create(ValueListItem.COMMENTS).setMultivalue(true) .setType(MetadataValueType.ENUM).defineStructureFactory(CommentFactory.class); MetadataBuilder titleMetadata = defaultSchemaBuilder.getMetadata(Schemas.TITLE.getLocalCode()).setSearchable(true); for (Language language : languages) { if(labels.containsKey(language)) titleMetadata.addLabel(language, $("init.valuelist.default.title")); } return typeBuilder; } public MetadataSchemaTypeBuilder createValueListItemSchema(String code, String label, ValueListItemSchemaTypeBuilderOptions options) { Map<Language, String> labels = new HashMap<>(); for (Language language : metadataSchemaTypesBuilder.getLanguages()) { if (StringUtils.isBlank(label)) { labels.put(language, $("init." + code)); } else { labels.put(language, label); } } return createValueListItemSchema(code, labels, options); } public MetadataSchemaTypeBuilder createHierarchicalValueListItemSchema(String code, String label, ValueListItemSchemaTypeBuilderOptions options) { List<Language> languages = metadataSchemaTypesBuilder.getLanguages(); MetadataSchemaTypeBuilder typeBuilder = createValueListItemSchema(code, label, options); MetadataSchemaBuilder defaultSchemaBuilder = typeBuilder.getDefaultSchema(); MetadataBuilder parentMetadata = defaultSchemaBuilder.create(HierarchicalValueListItem.PARENT) .defineChildOfRelationshipToType(typeBuilder) .setUndeletable(true); for (Language language : languages) { parentMetadata.addLabel(language, $("init.valuelist.default.parent")); } return typeBuilder; } public static class ValueListItemSchemaTypeBuilderOptions { ValueListItemSchemaTypeCodeMode codeMode; boolean titleUnique = true; private ValueListItemSchemaTypeBuilderOptions(ValueListItemSchemaTypeCodeMode codeMode) { this.codeMode = codeMode; } public static ValueListItemSchemaTypeBuilderOptions codeMetadataRequiredAndUnique() { return new ValueListItemSchemaTypeBuilderOptions(ValueListItemSchemaTypeCodeMode.REQUIRED_AND_UNIQUE); } public static ValueListItemSchemaTypeBuilderOptions codeMetadataDisabled() { return new ValueListItemSchemaTypeBuilderOptions(ValueListItemSchemaTypeCodeMode.DISABLED); } public static ValueListItemSchemaTypeBuilderOptions codeMetadataFacultative() { return new ValueListItemSchemaTypeBuilderOptions(ValueListItemSchemaTypeCodeMode.FACULTATIVE); } public static ValueListItemSchemaTypeBuilderOptions codeMode(ValueListItemSchemaTypeCodeMode codeMode) { return new ValueListItemSchemaTypeBuilderOptions(codeMode); } public ValueListItemSchemaTypeBuilderOptions titleUnique(boolean titleUnique) { this.titleUnique = titleUnique; return this; } } }