package org.molgenis.dataexplorer.download;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.csv.CsvWriter;
import org.molgenis.data.excel.ExcelSheetWriter;
import org.molgenis.data.excel.ExcelWriter;
import org.molgenis.data.excel.ExcelWriter.FileFormat;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.AttributeFactory;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.support.AbstractWritable.AttributeWriteMode;
import org.molgenis.data.support.AbstractWritable.EntityWriteMode;
import org.molgenis.data.support.QueryImpl;
import org.molgenis.dataexplorer.controller.DataRequest;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static java.util.Objects.requireNonNull;
public class DataExplorerDownloadHandler
{
private final DataService dataService;
private final AttributeFactory attrMetaFactory;
@Autowired
public DataExplorerDownloadHandler(DataService dataService, AttributeFactory attrMetaFactory)
{
this.dataService = requireNonNull(dataService);
this.attrMetaFactory = requireNonNull(attrMetaFactory);
}
public void writeToExcel(DataRequest dataRequest, OutputStream outputStream) throws IOException
{
ExcelWriter excelWriter = new ExcelWriter(outputStream, attrMetaFactory, FileFormat.XLSX);
String entityName = dataRequest.getEntityName();
QueryImpl<Entity> query = dataRequest.getQuery();
ExcelSheetWriter excelSheetWriter = null;
try
{
EntityType entityType = dataService.getEntityType(entityName);
final Set<String> attributeNames = new LinkedHashSet<String>(dataRequest.getAttributeNames());
Iterable<Attribute> attributes = filter(entityType.getAtomicAttributes(),
attribute -> attributeNames.contains(attribute.getName()));
switch (dataRequest.getColNames())
{
case ATTRIBUTE_LABELS:
excelSheetWriter = excelWriter
.createWritable(entityName, attributes, AttributeWriteMode.ATTRIBUTE_LABELS);
break;
case ATTRIBUTE_NAMES:
excelSheetWriter = excelWriter
.createWritable(entityName, attributes, AttributeWriteMode.ATTRIBUTE_NAMES);
break;
}
switch (dataRequest.getEntityValues())
{
case ENTITY_IDS:
excelSheetWriter.setEntityWriteMode(EntityWriteMode.ENTITY_IDS);
break;
case ENTITY_LABELS:
excelSheetWriter.setEntityWriteMode(EntityWriteMode.ENTITY_LABELS);
break;
default:
break;
}
excelSheetWriter.add(dataService.findAll(entityName, query));
excelSheetWriter.close();
}
finally
{
excelWriter.close();
}
}
public void writeToCsv(DataRequest request, OutputStream outputStream, char separator) throws IOException
{
writeToCsv(request, outputStream, separator, false);
}
public void writeToCsv(DataRequest dataRequest, OutputStream outputStream, char separator, boolean noQuotes)
throws IOException
{
CsvWriter csvWriter = new CsvWriter(outputStream, separator, noQuotes);
switch (dataRequest.getEntityValues())
{
case ENTITY_IDS:
csvWriter.setEntityWriteMode(EntityWriteMode.ENTITY_IDS);
break;
case ENTITY_LABELS:
csvWriter.setEntityWriteMode(EntityWriteMode.ENTITY_LABELS);
break;
default:
break;
}
String entityName = dataRequest.getEntityName();
try
{
EntityType entityType = dataService.getEntityType(entityName);
final Set<String> attributeNames = new HashSet<String>(dataRequest.getAttributeNames());
Iterable<Attribute> attributes = filter(entityType.getAtomicAttributes(),
attribute -> attributeNames.contains(attribute.getName()));
switch (dataRequest.getColNames())
{
case ATTRIBUTE_LABELS:
csvWriter.writeAttributes(attributes);
break;
case ATTRIBUTE_NAMES:
csvWriter.writeAttributeNames(transform(attributes, Attribute::getName));
break;
}
QueryImpl<Entity> query = dataRequest.getQuery();
csvWriter.add(dataService.findAll(entityName, query));
}
finally
{
csvWriter.close();
}
}
}