package com.constellio.app.ui.framework.builders;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.constellio.app.entities.schemasDisplay.SchemaDisplayConfig;
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.RecordVO.VIEW_MODE;
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.MetadataSchema;
@SuppressWarnings("serial")
public class MetadataSchemaToVOBuilder implements Serializable {
static final List<String> DISPLAYED_SYSTEM_RESERVED_METADATA_CODES = Arrays.asList(
// "id",
"createdOn",
"createdBy",
"modifiedOn",
"modifiedBy");
@Deprecated
public MetadataSchemaVO build(MetadataSchema schema, VIEW_MODE viewMode) {
return build(schema, viewMode, null, ConstellioUI.getCurrentSessionContext());
}
public MetadataSchemaVO build(MetadataSchema schema, VIEW_MODE viewMode, SessionContext sessionContext) {
return build(schema, viewMode, null, sessionContext);
}
@Deprecated
public MetadataSchemaVO build(MetadataSchema schema, VIEW_MODE viewMode, List<String> metadataCodes) {
return build(schema, viewMode, metadataCodes, ConstellioUI.getCurrentSessionContext());
}
public MetadataSchemaVO build(MetadataSchema schema, VIEW_MODE viewMode, List<String> metadataCodes,
SessionContext sessionContext, boolean addMetadataCodes) {
String code = schema.getCode();
String collection = schema.getCollection();
Map<Locale, String> labels = new HashMap<Locale, String>();
Language language = Language.withCode(sessionContext.getCurrentLocale().getLanguage());
labels.put(sessionContext.getCurrentLocale(), schema.getLabel(language));
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
AppLayerFactory appLayerFactory = constellioFactories.getAppLayerFactory();
SchemasDisplayManager schemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager();
SchemaDisplayConfig schemaDisplayConfig = schemasDisplayManager.getSchema(collection, code);
List<String> formMetadataCodes = new ArrayList<>();
List<String> displayMetadataCodes = new ArrayList<>();
List<String> searchMetadataCodes = new ArrayList<>();
List<String> tableMetadataCodes = new ArrayList<>();
if (viewMode == VIEW_MODE.FORM) {
if (metadataCodes != null) {
if (addMetadataCodes) {
formMetadataCodes.addAll(schemaDisplayConfig.getFormMetadataCodes());
}
formMetadataCodes.addAll(metadataCodes);
} else {
formMetadataCodes.addAll(schemaDisplayConfig.getFormMetadataCodes());
}
displayMetadataCodes.addAll(schemaDisplayConfig.getDisplayMetadataCodes());
searchMetadataCodes.addAll(schemaDisplayConfig.getSearchResultsMetadataCodes());
tableMetadataCodes.addAll(schemaDisplayConfig.getTableMetadataCodes());
} else if (viewMode == VIEW_MODE.DISPLAY) {
if (metadataCodes != null) {
if (addMetadataCodes) {
displayMetadataCodes.addAll(schemaDisplayConfig.getDisplayMetadataCodes());
}
displayMetadataCodes.addAll(metadataCodes);
} else {
displayMetadataCodes.addAll(schemaDisplayConfig.getDisplayMetadataCodes());
}
formMetadataCodes.addAll(schemaDisplayConfig.getFormMetadataCodes());
searchMetadataCodes.addAll(schemaDisplayConfig.getSearchResultsMetadataCodes());
tableMetadataCodes.addAll(schemaDisplayConfig.getTableMetadataCodes());
} else if (viewMode == VIEW_MODE.TABLE) {
if (metadataCodes != null) {
if (addMetadataCodes) {
tableMetadataCodes.addAll(schemaDisplayConfig.getTableMetadataCodes());
}
tableMetadataCodes.addAll(metadataCodes);
} else {
tableMetadataCodes.addAll(schemaDisplayConfig.getTableMetadataCodes());
}
formMetadataCodes.addAll(schemaDisplayConfig.getFormMetadataCodes());
displayMetadataCodes.addAll(schemaDisplayConfig.getDisplayMetadataCodes());
searchMetadataCodes.addAll(schemaDisplayConfig.getSearchResultsMetadataCodes());
} else if (viewMode == VIEW_MODE.SEARCH) {
if (metadataCodes != null) {
if (addMetadataCodes) {
searchMetadataCodes.addAll(schemaDisplayConfig.getSearchResultsMetadataCodes());
}
searchMetadataCodes.addAll(metadataCodes);
} else {
searchMetadataCodes.addAll(schemaDisplayConfig.getSearchResultsMetadataCodes());
}
formMetadataCodes.addAll(schemaDisplayConfig.getFormMetadataCodes());
displayMetadataCodes.addAll(schemaDisplayConfig.getDisplayMetadataCodes());
tableMetadataCodes.addAll(schemaDisplayConfig.getTableMetadataCodes());
} else {
throw new IllegalArgumentException("Invalid view mode : " + viewMode);
}
MetadataToVOBuilder metadataToVOBuilder = newMetadataToVOBuilder();
MetadataSchemaVO schemaVO = new MetadataSchemaVO(code, collection, formMetadataCodes, displayMetadataCodes,
tableMetadataCodes, searchMetadataCodes, labels);
for (Metadata metadata : schema.getMetadatas()) {
// String metadataCode = metadata.getCode();
// boolean systemReserved = metadata.isSystemReserved();
// boolean ignored;
// if (viewMode == VIEW_MODE.FORM) {
// ignored = systemReserved;
// } else if (!systemReserved) {
// ignored = false;
// } else {
// String metadataCodeWithoutPrefix = MetadataVO.getCodeWithoutPrefix(metadataCode);
// ignored = !DISPLAYED_SYSTEM_RESERVED_METADATA_CODES.contains(metadataCodeWithoutPrefix);
// }
// if (!ignored && metadata.getEnabled()) {
metadataToVOBuilder.build(metadata, schemaVO, sessionContext);
// }
}
return schemaVO;
}
public MetadataSchemaVO build(MetadataSchema schema, VIEW_MODE viewMode, List<String> metadataCodes,
SessionContext sessionContext) {
return build(schema, viewMode, metadataCodes, sessionContext, false);
}
protected MetadataToVOBuilder newMetadataToVOBuilder() {
return new MetadataToVOBuilder();
}
}