package com.constellio.app.ui.framework.builders;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.constellio.app.entities.schemasDisplay.enums.MetadataDisplayType;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.entities.schemasDisplay.MetadataDisplayConfig;
import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.AllowedReferences;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.StructureFactory;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.users.UserServices;
@SuppressWarnings("serial")
public class MetadataToVOBuilder implements Serializable {
@Deprecated
public MetadataVO build(Metadata metadata) {
return build(metadata, (MetadataSchemaVO) null);
}
public MetadataVO build(Metadata metadata, SessionContext sessionContext) {
return build(metadata, null, sessionContext);
}
@Deprecated
public MetadataVO build(Metadata metadata, MetadataSchemaVO schemaVO) {
return build(metadata, schemaVO, ConstellioUI.getCurrentSessionContext());
}
public MetadataVO build(Metadata metadata, MetadataSchemaVO schemaVO, SessionContext sessionContext) {
String metadataCode = metadata.getCode();
String collection = metadata.getCollection();
String datastoreCode = metadata.getDataStoreCode();
MetadataValueType type = metadata.getType();
boolean required = metadata.isDefaultRequirement();
boolean multivalue = metadata.isMultivalue();
boolean readOnly = false;
boolean enabled = metadata.isEnabled();
StructureFactory structureFactory = metadata.getStructureFactory();
String schemaTypeCode;
if (type == MetadataValueType.REFERENCE) {
schemaTypeCode = metadata.getAllowedReferences().getTypeWithAllowedSchemas();
} else {
schemaTypeCode = null;
}
String[] taxonomyCodes;
MetadataInputType metadataInputType;
MetadataDisplayType metadataDisplayType;
String metadataGroup;
if (collection != null) {
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
if (schemaTypeCode != null) {
// SessionContext sessionContext = ConstellioUI.getCurrentSessionContext();
UserVO userVO = sessionContext.getCurrentUser();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
TaxonomiesManager taxonomiesManager = modelLayerFactory.getTaxonomiesManager();
UserServices userServices = modelLayerFactory.newUserServices();
if (userVO != null) {
User user = userServices.getUserInCollection(userVO.getUsername(), collection);
List<Taxonomy> taxonomies = taxonomiesManager
.getAvailableTaxonomiesForSelectionOfType(schemaTypeCode, user, metadataSchemasManager);
taxonomyCodes = new String[taxonomies.size()];
for (int i = 0; i < taxonomies.size(); i++) {
Taxonomy taxonomy = taxonomies.get(i);
taxonomyCodes[i] = taxonomy.getCode();
}
} else {
taxonomyCodes = new String[0];
}
} else {
taxonomyCodes = new String[0];
}
AppLayerFactory appLayerFactory = constellioFactories.getAppLayerFactory();
SchemasDisplayManager schemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager();
MetadataDisplayConfig metadataDisplayConfig = schemasDisplayManager.getMetadata(collection, metadataCode);
metadataInputType = metadataDisplayConfig.getInputType();
metadataDisplayType = metadataDisplayConfig.getDisplayType();
Language language = Language.withCode(sessionContext.getCurrentLocale().getLanguage());
metadataGroup = metadataDisplayConfig.getMetadataGroupCode();
String typeCode = new SchemaUtils().getSchemaTypeCode(metadataCode);
Map<String, Map<Language, String>> groups = schemasDisplayManager.getType(collection, typeCode)
.getMetadataGroup();
if (StringUtils.isBlank(metadataGroup)) {
if (groups.keySet().isEmpty()) {
metadataGroup = null;
} else {
metadataGroup = groups.entrySet().iterator().next().getValue().get(language);
for (Map.Entry<String, Map<Language, String>> entry : groups.entrySet()) {
if (entry.getKey().startsWith("default")) {
metadataGroup = entry.getValue().get(language);
}
}
}
} else if (groups.get(metadataGroup) != null && !metadataGroup.equals(groups.get(metadataGroup).get(language))) {
metadataGroup = groups.get(metadataGroup).get(language);
}
} else {
taxonomyCodes = new String[0];
metadataInputType = null;
metadataDisplayType = null;
metadataGroup = null;
}
Map<Locale, String> labels = new HashMap<Locale, String>();
labels.put(sessionContext.getCurrentLocale(), metadata.getLabel(
Language.withCode(sessionContext.getCurrentLocale().getLanguage())));
Class<? extends Enum<?>> enumClass = metadata.getEnumClass(); // EnumWithSmallCode
AllowedReferences allowedReferences = metadata.getAllowedReferences();
return newMetadataVO(metadataCode, datastoreCode, type, collection, schemaVO, required, multivalue, readOnly, labels,
enumClass, taxonomyCodes, schemaTypeCode, metadataInputType, metadataDisplayType, allowedReferences, enabled, structureFactory,
metadataGroup, metadata.getDefaultValue(), metadata.getInputMask());
}
protected MetadataVO newMetadataVO(
String metadataCode,
String datastoreCode,
MetadataValueType type,
String collection,
MetadataSchemaVO schemaVO,
boolean required,
boolean multivalue,
boolean readOnly,
Map<Locale, String> labels,
Class<? extends Enum<?>> enumClass,
String[] taxonomyCodes,
String schemaTypeCode,
MetadataInputType metadataInputType,
MetadataDisplayType metadataDisplayType,
AllowedReferences allowedReferences,
boolean enabled,
StructureFactory structureFactory,
String metadataGroup,
Object defaultValue,
String inputMask) {
return new MetadataVO(metadataCode, datastoreCode, type, collection, schemaVO, required, multivalue, readOnly, labels,
enumClass, taxonomyCodes, schemaTypeCode, metadataInputType, metadataDisplayType, allowedReferences, enabled, structureFactory,
metadataGroup, defaultValue, inputMask);
}
}