package com.constellio.app.ui.framework.builders;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.constellio.app.entities.schemasDisplay.MetadataDisplayConfig;
import com.constellio.app.entities.schemasDisplay.SchemaTypeDisplayConfig;
import com.constellio.app.entities.schemasDisplay.SchemaTypesDisplayConfig;
import com.constellio.app.entities.schemasDisplay.enums.MetadataDisplayType;
import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.app.ui.entities.FormMetadataVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
@SuppressWarnings("serial")
public class MetadataToFormVOBuilder implements Serializable {
private SessionContext sessionContext;
public MetadataToFormVOBuilder(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
public FormMetadataVO build(Metadata metadata, SchemasDisplayManager configManager, String schemaTypeCode,
SessionContext sessionContext) {
return build(metadata, null, configManager, schemaTypeCode, sessionContext);
}
public FormMetadataVO build(Metadata metadata, MetadataSchemaVO schemaVO, SchemasDisplayManager configManager,
String schemaTypeCode, SessionContext sessionContext) {
MetadataDisplayConfig config = configManager.getMetadata(metadata.getCollection(), metadata.getCode());
SchemaTypesDisplayConfig types = configManager.getTypes(metadata.getCollection());
this.sessionContext = sessionContext;
String code = metadata.getCode();
MetadataValueType type = metadata.getType();
boolean required = metadata.isDefaultRequirement();
boolean multivalue = metadata.isMultivalue();
Map<Language, String> labels = metadata.getLabels();
MetadataInputType entry = config.getInputType();
MetadataDisplayType displayType = config.getDisplayType();
boolean sortable = metadata.isSortable();
boolean searchable = metadata.isSearchable();
boolean advancedSearch = config.isVisibleInAdvancedSearch();
boolean highlight = config.isHighlight();
boolean enabled = metadata.isEnabled();
boolean facet = false;
String metadataGroup = getValidMetadataGroup(config.getMetadataGroupCode(),
configManager.getType(metadata.getCollection(), schemaTypeCode));
for (String codeFacet : types.getFacetMetadataCodes()) {
if (codeFacet.equals(metadata.getCode())) {
facet = true;
break;
}
}
String reference = null;
if (metadata.getType().equals(MetadataValueType.REFERENCE)) {
reference = metadata.getAllowedReferences().getAllowedSchemaType();
}
boolean autocomplete = metadata.isSchemaAutocomplete();
Object defaultValue = metadata.getDefaultValue();
String inputMask = metadata.getInputMask();
Map<String, String> newLabels = new HashMap<>();
for (Entry<Language, String> entryLabels : labels.entrySet()) {
newLabels.put(entryLabels.getKey().getCode(), entryLabels.getValue());
}
boolean duplicable = metadata.isDuplicable();
return new FormMetadataVO(code, type, required, schemaVO, reference, newLabels, searchable, multivalue, sortable,
advancedSearch, facet, entry, displayType, highlight, autocomplete, enabled, metadataGroup, defaultValue, inputMask,
duplicable,
sessionContext);
}
private String getValidMetadataGroup(String metadataGroupCode, SchemaTypeDisplayConfig config) {
String validGroup = metadataGroupCode;
boolean found = config.getMetadataGroup().keySet().contains(metadataGroupCode);
if (!found) {
validGroup = config.getMetadataGroup().keySet().iterator().next();
for (String aGroup : config.getMetadataGroup().keySet()) {
if (aGroup.startsWith("default")) {
validGroup = aGroup;
}
}
}
return validGroup;
}
}