package org.nextprot.api.core.service;
import org.dbunit.dataset.Column;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ITableMetaData;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
/**
* Utility object that extract data lsit from dbunit xml file
*
* Created by fnikitin on 21/05/15.
*/
public class FlatXmlDataSetExtractor {
private final FlatXmlDataSet ds;
public FlatXmlDataSetExtractor(String xmlFilename) throws FileNotFoundException, DataSetException {
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
ds = builder.build(new FileInputStream(xmlFilename));
}
public String toString() {
StringBuilder sb = new StringBuilder();
try {
for (String tableName : ds.getTableNames()) {
sb.append("Table:").append(tableName).append("\n");
ITable table = ds.getTable(tableName);
for (int i=0 ; i<table.getRowCount() ; i++) {
ITableMetaData md = table.getTableMetaData();
sb.append(" ");
for (Column col : md.getColumns()) {
sb.append(col.getColumnName()).append(": ").append(table.getValue(i, col.getColumnName()));
sb.append(", ");
}
sb.delete(sb.length()-2, sb.length());
sb.append("\n");
}
}
} catch (DataSetException e) {
sb.append("Error: ").append(e.getMessage());
}
return sb.toString();
}
public interface Factory<A> {
A create();
void setField(A instance, String key, String value);
}
public <A> List<A> extractDataList(String tableName, Factory<A> factory, String... fields) throws DataSetException {
ITable table = ds.getTable(tableName);
List<A> dataList = new ArrayList<>();
for (int i=0 ; i<table.getRowCount() ; i++) {
A element = factory.create();
for (int j=0 ; j<fields.length ; j++) {
factory.setField(element, fields[j], table.getValue(i, fields[j]).toString());
}
dataList.add(element);
}
return dataList;
}
}