package com.constellio.app.ui.framework.containers; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition; import org.vaadin.addons.lazyquerycontainer.Query; import org.vaadin.addons.lazyquerycontainer.QueryDefinition; import org.vaadin.addons.lazyquerycontainer.QueryFactory; 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.framework.data.DataProvider.DataRefreshListener; import com.constellio.app.ui.framework.data.RecordVOWithDistinctSchemasDataProvider; import com.vaadin.data.Item; import com.vaadin.data.util.BeanItem; import com.vaadin.data.util.ObjectProperty; // AFTER: Rename to MultitypeRecordVOContainer @SuppressWarnings("serial") public class RecordVOWithDistinctSchemaTypesLazyContainer extends LazyQueryContainer { private RecordVOWithDistinctSchemasDataProvider dataProvider; public RecordVOWithDistinctSchemaTypesLazyContainer(RecordVOWithDistinctSchemasDataProvider dataProvider, List<String> reportMetadata) { super(new RecordVOLazyQueryDefinition(dataProvider, reportMetadata), new RecordVOLazyQueryFactory(dataProvider, reportMetadata)); this.dataProvider = dataProvider; dataProvider.addDataRefreshListener(new DataRefreshListener() { @Override public void dataRefresh() { RecordVOWithDistinctSchemaTypesLazyContainer.this.refresh(); } }); } public RecordVO getRecordVO(int index) { return dataProvider.getRecordVO(index); } public static class RecordVOLazyQueryDefinition extends LazyQueryDefinition { RecordVOWithDistinctSchemasDataProvider dataProvider; /** * final boolean compositeItems, final int batchSize, final Object idPropertyId * * //@param dataProvider * //@param compositeItems * //@param batchSize * //@param idPropertyId */ public RecordVOLazyQueryDefinition(RecordVOWithDistinctSchemasDataProvider dataProvider, List<String> reportMetadataList) { super(true, 100, null); this.dataProvider = dataProvider; List<String> propertiesIds = new ArrayList<>(); for (String reportMetadata : reportMetadataList) { if (!propertiesIds.contains(reportMetadata)) { for (MetadataSchemaVO metadataSchemaVO : dataProvider.getSchemas()) { MetadataVO metadata = metadataSchemaVO.getMetadata(reportMetadata); propertiesIds.add(metadata.getLocalCode()); super.addProperty(metadata.getLocalCode(), metadata.getJavaType(), null, true, true); } } } } } public static class RecordVOLazyQueryFactory implements QueryFactory, Serializable { RecordVOWithDistinctSchemasDataProvider dataProvider; List<String> reportMetadataList; public RecordVOLazyQueryFactory(RecordVOWithDistinctSchemasDataProvider dataProvider, List<String> reportMetadataList) { this.dataProvider = dataProvider; this.reportMetadataList = reportMetadataList; } @Override public Query constructQuery(final QueryDefinition queryDefinition) { MetadataSchemaVO schemaVO = dataProvider.getSchemas().get(0); Object[] sortPropertyIds = queryDefinition.getSortPropertyIds(); if (sortPropertyIds != null && sortPropertyIds.length > 0) { List<MetadataVO> sortMetadatas = new ArrayList<MetadataVO>(); for (int i = 0; i < sortPropertyIds.length; i++) { String sortMetadataCode = (String) sortPropertyIds[i]; sortMetadatas.add(schemaVO.getMetadata(sortMetadataCode)); } dataProvider.sort(sortMetadatas.toArray(new MetadataVO[0]), queryDefinition.getSortPropertyAscendingStates()); } return new SerializableQuery() { @Override public int size() { return dataProvider.size(); } @Override public void saveItems(List<Item> addedItems, List<Item> modifiedItems, List<Item> removedItems) { throw new UnsupportedOperationException("Query is read-only"); } @Override public List<Item> loadItems(int startIndex, int count) { List<Item> items = new ArrayList<Item>(); List<RecordVO> recordVOs = dataProvider.listRecordVOs(startIndex, count); for (RecordVO recordVO : recordVOs) { Item item = new BeanItem<>(recordVO); List<String> propertiesIds = new ArrayList<>(); for (String reportMetadata : reportMetadataList) { if (!propertiesIds.contains(reportMetadata)) { String schemaCode = recordVO.getSchema().getCode(); Object value = recordVO.get(schemaCode + "_" + reportMetadata); if (value == null) { value = ""; } item.addItemProperty(reportMetadata, new ObjectProperty<>(value)); } } items.add(item); } return items; } @Override public boolean deleteAllItems() { throw new UnsupportedOperationException("Query is read-only"); } @Override public Item constructItem() { throw new UnsupportedOperationException("Query is read-only"); } }; } private interface SerializableQuery extends Query, Serializable { } } }