package plugins;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import jxl.Cell;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.Query;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.pheno.ObservationTarget;
import org.molgenis.pheno.ObservedValue;
import org.molgenis.protocol.Protocol;
import app.DatabaseFactory;
public class OpalIndividualDataExporter
{
public Database db = null;
public String investigationName = null;
public static void main(String args[]) throws Exception
{
new OpalIndividualDataExporter(args);
}
public OpalIndividualDataExporter(String args[]) throws Exception
{
db = DatabaseFactory.create();
if (args.length > 0)
{
investigationName = args[0];
}
else
{
investigationName = "LifeLines";
}
List<ObservationTarget> listOfTargets = db.find(ObservationTarget.class, new QueryRule(
ObservationTarget.INVESTIGATION_NAME, Operator.EQUALS, investigationName));
List<String> listOfTargetNames = new ArrayList<String>();
for (ObservationTarget target : listOfTargets)
{
listOfTargetNames.add(target.getName());
}
Query<Protocol> queryRules = db.query(Protocol.class);
for (int i = 0; i < args.length; i++)
{
if (i == 0)
{
queryRules.addRules(new QueryRule(Protocol.INVESTIGATION_NAME, Operator.EQUALS, investigationName));
}
else if (i == 1)
{
queryRules.addRules(new QueryRule(Protocol.NAME, Operator.EQUALS, args[i]));
}
else
{
break;
}
}
String filePath = "";
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
if (args.length > 2)
{
filePath = args[2];
}
else
{
filePath = tmpDir.getAbsolutePath();
}
for (Protocol p : queryRules.find())
{
if (p.getFeatures_Name().size() > 0)
{
File mappingResult = new File(filePath + "/" + p.getName() + ".csv");
File temp = new File(filePath + "/temp.xls");
OutputStream os = (OutputStream) new FileOutputStream(mappingResult);
String encoding = "UTF8";
OutputStreamWriter osw = new OutputStreamWriter(os, encoding);
BufferedWriter bw = new BufferedWriter(osw);
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("en", "EN"));
WritableWorkbook workbook = Workbook.createWorkbook(temp, ws);
WritableSheet dataSheet = workbook.createSheet("importData", 0);
dataSheet.addCell(new Label(0, 0, "Participant"));
for (String eachFeature : p.getFeatures_Name())
{
int colIndex = p.getFeatures_Name().indexOf(eachFeature) + 1;
dataSheet.addCell(new Label(colIndex, 0, eachFeature));
}
List<ObservedValue> allValues = new ArrayList<ObservedValue>();
for (int i = 0; i < listOfTargetNames.size(); i = i + 1000)
{
for (int j = 0; j < p.getFeatures_Name().size(); j = j + 1000)
{
System.out.println("next round!");
Query<ObservedValue> q = db.query(ObservedValue.class);
int targetIndex = i + 1000;
if (i + 1000 > listOfTargetNames.size())
{
targetIndex = listOfTargetNames.size();
}
int featureIndex = j + 1000;
if (j + 1000 > p.getFeatures_Name().size())
{
featureIndex = p.getFeatures_Name().size();
}
q.addRules(new QueryRule(ObservedValue.TARGET_NAME, Operator.IN, listOfTargetNames.subList(i,
targetIndex)));
q.addRules(new QueryRule(ObservedValue.FEATURE_NAME, Operator.IN, p.getFeatures_Name().subList(
j, featureIndex)));
allValues.addAll(q.find());
}
}
if (allValues.size() > 0)
{
for (ObservedValue ov : allValues)
{
int rowIndex = listOfTargetNames.indexOf(ov.getTarget_Name()) + 1;
int colIndex = p.getFeatures_Name().indexOf(ov.getFeature_Name()) + 1;
dataSheet.addCell(new Label(0, rowIndex, ov.getTarget_Name()));
dataSheet.addCell(new Label(colIndex, rowIndex, ov.getValue()));
}
Cell[] row = null;
// Gets the cells from sheet
for (int i = 0; i < dataSheet.getRows(); i++)
{
row = dataSheet.getRow(i);
if (row.length > 0)
{
bw.write(row[0].getContents());
for (int j = 1; j < row.length; j++)
{
bw.write(',');
bw.write(row[j].getContents());
}
}
bw.newLine();
}
}
bw.flush();
bw.close();
temp.delete();
}
System.out.println("finished");
}
}
}