package com.constellio.app.ui.framework.builders;
import com.constellio.app.extensions.records.params.BuildRecordVOParams;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.MetadataValueVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.data.event.EventTypeUtils;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.Event;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by Constellio on 2016-12-13.
*/
public class EventToVOBuilder extends RecordToVOBuilder {
@Override
public RecordVO build(Record record, RecordVO.VIEW_MODE viewMode, MetadataSchemaVO schemaVO,
SessionContext sessionContext) {
String id = record.getId();
String schemaCode = record.getSchemaCode();
String collection = record.getCollection();
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
MetadataSchema schema = metadataSchemasManager.getSchemaTypes(collection).getSchema(schemaCode);
if (schemaVO == null) {
schemaVO = new MetadataSchemaToVOBuilder().build(schema, viewMode, sessionContext);
}
ContentVersionToVOBuilder contentVersionVOBuilder = new ContentVersionToVOBuilder(modelLayerFactory);
List<MetadataValueVO> metadataValueVOs = new ArrayList<MetadataValueVO>();
List<MetadataVO> metadatas = schemaVO.getMetadatas();
for (MetadataVO metadataVO : metadatas) {
String metadataCode = metadataVO.getCode();
Metadata metadata = schema.getMetadata(metadataCode);
Object recordVOValue = getValue(record, metadata);
if((Event.DEFAULT_SCHEMA + "_" + Event.TYPE).equals(metadataCode)) {
recordVOValue = EventTypeUtils.getEventTypeCaption(recordVOValue.toString());
}
else if (recordVOValue instanceof Content) {
recordVOValue = contentVersionVOBuilder.build((Content) recordVOValue, sessionContext);
} else if (recordVOValue instanceof List) {
List<Object> listRecordVOValue = new ArrayList<Object>();
List<Object> listRecordValue = (List<Object>) recordVOValue;
for (Iterator<Object> it = listRecordValue.iterator(); it.hasNext(); ) {
Object listVOValueElement = it.next();
if (listVOValueElement instanceof Content) {
listVOValueElement = contentVersionVOBuilder.build((Content) listVOValueElement);
}
if (listVOValueElement != null) {
listRecordVOValue.add(listVOValueElement);
}
}
recordVOValue = listRecordVOValue;
}
MetadataValueVO metadataValueVO = new MetadataValueVO(metadataVO, recordVOValue);
metadataValueVOs.add(metadataValueVO);
}
RecordVO recordVO = newRecordVO(id, metadataValueVOs, viewMode);
BuildRecordVOParams buildRecordVOParams = new BuildRecordVOParams(record, recordVO);
constellioFactories.getAppLayerFactory().getExtensions()
.forCollection(record.getCollection()).buildRecordVO(buildRecordVOParams);
return recordVO;
}
}