package com.constellio.app.ui.framework.data;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.framework.builders.MetadataToVOBuilder;
import com.constellio.data.utils.comparators.AbstractTextComparator;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemasManager;
@SuppressWarnings("serial")
public class MetadataVODataProvider implements Serializable {
transient MetadataSchemasManager schemasManager;
protected MetadataToVOBuilder voBuilder;
List<MetadataVO> metadataVOs;
String schemaCode;
String collection;
public MetadataVODataProvider(MetadataToVOBuilder voBuilder, ModelLayerFactory modelLayerFactory, String collection,
String code) {
this.voBuilder = voBuilder;
this.collection = collection;
this.schemaCode = code;
init(modelLayerFactory);
metadataVOs = buildList();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
init(constellioFactories.getModelLayerFactory());
}
void init(ModelLayerFactory modelLayerFactory) {
schemasManager = modelLayerFactory.getMetadataSchemasManager();
}
public MetadataVO getMetadataVO(String code) {
for (MetadataVO type : metadataVOs) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
public MetadataVO getMetadataVO(Integer index) {
return metadataVOs.get(index);
}
public int size() {
return metadataVOs.size();
}
public List<Integer> list() {
List<Integer> listInt = new ArrayList<>();
for (int i = 0; i < metadataVOs.size(); i++) {
listInt.add(i);
}
return listInt;
}
public List<MetadataVO> listMetadataVO() {
return metadataVOs;
}
public List<MetadataVO> listMetadataVO(int startIndex, int count) {
if (startIndex > metadataVOs.size()) {
return new ArrayList<>();
}
int toIndex = startIndex + count;
if (toIndex > metadataVOs.size()) {
toIndex = metadataVOs.size();
}
return metadataVOs.subList(startIndex, toIndex);
}
public void sort(Object[] propertyId, final boolean[] ascending) {
Collections.sort(metadataVOs, new Comparator<MetadataVO>() {
@Override
public int compare(MetadataVO o1, MetadataVO o2) {
return (ascending[0] ? 1 : -1) * o1.getLabel().compareTo(o2.getLabel());
}
});
}
protected List<MetadataVO> buildList() {
List<MetadataVO> result = new ArrayList<>();
MetadataSchemaTypes types = schemasManager.getSchemaTypes(collection);
if (types != null) {
MetadataSchema schema = types.getSchema(schemaCode);
for (Metadata meta : schema.getMetadatas()) {
if (isAccepted(meta)) {
result.add(voBuilder.build(meta));
}
}
}
Collections.sort(result, new AbstractTextComparator<MetadataVO>() {
@Override
protected String getText(MetadataVO object) {
return object.getLabel();
}
});
return result;
}
protected boolean isAccepted(Metadata meta) {
return !meta.isSystemReserved();
}
}