package com.constellio.app.ui.framework.builders; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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.entities.RecordVO.VIEW_MODE; 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.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.schemas.MetadataSchemasManager; @SuppressWarnings("serial") public class RecordToVOBuilder implements Serializable { public RecordVO build(Record record, VIEW_MODE viewMode, SessionContext sessionContext) { return build(record, viewMode, null, sessionContext); } @SuppressWarnings("unchecked") public RecordVO build(Record record, 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 (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); if (recordVO.getSchema() != null) { BuildRecordVOParams buildRecordVOParams = new BuildRecordVOParams(record, recordVO); constellioFactories.getAppLayerFactory().getExtensions() .forCollection(record.getCollection()).buildRecordVO(buildRecordVOParams); } else { recordVO = null; } return recordVO; } protected Object getValue(Record record, Metadata metadata) { return record.get(metadata); } protected RecordVO newRecordVO(String id, List<MetadataValueVO> metadataValueVOs, VIEW_MODE viewMode) { return new RecordVO(id, metadataValueVOs, viewMode); } protected int getIndexOfMetadataCode(String metadataCode, List<MetadataValueVO> metadataValueVOs) { int index = -1; for (int i = 0; i < metadataValueVOs.size(); i++) { MetadataValueVO metadataValueVO = metadataValueVOs.get(i); MetadataVO metadataVO = metadataValueVO.getMetadata(); if (metadataVO.codeMatches(metadataCode)) { index = i; break; } } return index; } }