package com.constellio.app.ui.framework.data;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.search.cache.SerializableSearchCache;
import com.constellio.model.services.search.cache.SerializedCacheSearchService;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
// AFTER: Rename to MultitypeRecordVoDataProvider
@SuppressWarnings("serial")
public abstract class RecordVOWithDistinctSchemasDataProvider implements DataProvider {
SerializableSearchCache queryCache = new SerializableSearchCache();
transient LogicalSearchQuery query;
transient Integer size = null;
transient Map<Integer, Record> cache;
transient List<MetadataSchemaVO> schemas;
protected transient ModelLayerFactory modelLayerFactory;
RecordToVOBuilder voBuilder;
private List<DataRefreshListener> dataRefreshListeners = new ArrayList<>();
SessionContext sessionContext;
public RecordVOWithDistinctSchemasDataProvider(List<MetadataSchemaVO> schemas, RecordToVOBuilder voBuilder,
ModelLayerFactory modelLayerFactory,
SessionContext sessionContext) {
this.schemas = schemas;
this.voBuilder = voBuilder;
this.sessionContext = sessionContext;
init(modelLayerFactory);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init(ConstellioFactories.getInstance().getModelLayerFactory());
}
void init(ModelLayerFactory modelLayerFactory) {
this.modelLayerFactory = modelLayerFactory;
query = getQuery();
cache = new HashMap<>();
}
public void addDataRefreshListener(DataRefreshListener dataRefreshListener) {
this.dataRefreshListeners.add(dataRefreshListener);
}
public List<DataRefreshListener> getDataRefreshListeners() {
return dataRefreshListeners;
}
public void removeDataRefreshListener(DataRefreshListener dataRefreshListener) {
dataRefreshListeners.remove(dataRefreshListener);
}
public void fireDataRefreshEvent() {
size = null;
cache.clear();
queryCache.clear();
for (DataRefreshListener dataRefreshListener : dataRefreshListeners) {
dataRefreshListener.dataRefresh();
}
}
public List<MetadataSchemaVO> getSchemas() {
return schemas;
}
public RecordVO getRecordVO(int index) {
Record record = cache.get(index);
if (record == null) {
SerializedCacheSearchService searchServices = new SerializedCacheSearchService(modelLayerFactory, queryCache, false);
List<Record> recordList = searchServices.search(query);
if (!recordList.isEmpty()) {
record = recordList.get(index);
cache.put(index, record);
} else {
record = null;
}
}
record.getSchemaCode();
return record != null ? voBuilder.build(record, VIEW_MODE.TABLE, null, sessionContext) : null;
}
public int size() {
SerializedCacheSearchService searchServices = new SerializedCacheSearchService(modelLayerFactory, queryCache, false);
if (size == null) {
size = searchServices.search(query).size();
}
return size;
}
public List<RecordVO> listRecordVOs(int startIndex, int numberOfItems) {
List<RecordVO> recordVOs = new ArrayList<>();
SerializedCacheSearchService searchServices = new SerializedCacheSearchService(modelLayerFactory, queryCache, false);
List<Record> recordList = searchServices.search(query);
for (int i = startIndex; i < startIndex + numberOfItems && i < recordList.size(); i++) {
Record record = recordList.get(i);
RecordVO recordVO = voBuilder.build(record, VIEW_MODE.TABLE, null, sessionContext);
recordVOs.add(recordVO);
}
return recordVOs;
}
public void sort(MetadataVO[] propertyId, boolean[] ascending) {
query.clearSort();
for (int i = 0; i < propertyId.length; i++) {
MetadataVO metadataVO = propertyId[i];
Metadata metadata = modelLayerFactory.getMetadataSchemasManager()
.getSchemaTypes(metadataVO.getCollection())
.getMetadata(metadataVO.getCode());
if (ascending[i]) {
query = query.sortAsc(metadata);
} else {
query = query.sortDesc(metadata);
}
}
}
protected abstract LogicalSearchQuery getQuery();
}