//package converters.opal;
//
//import java.io.File;
//import java.util.ArrayList;
//import java.util.LinkedHashMap;
//import java.util.List;
//import java.util.Map;
//
//import org.apache.log4j.BasicConfigurator;
//import org.apache.log4j.Logger;
//import org.molgenis.core.OntologyTerm;
//import org.molgenis.data.Data;
//import org.molgenis.data.TextDataElement;
//import org.molgenis.organization.Investigation;
//import org.molgenis.pheno.Code;
//import org.molgenis.pheno.Individual;
//import org.molgenis.pheno.Measurement;
//import org.molgenis.pheno.Observation;
//import org.molgenis.pheno.ObservedValue;
//import org.molgenis.util.CsvReaderListener;
//import org.molgenis.util.ExcelReader;
//import org.molgenis.util.Tuple;
//
//import app.JDBCDatabase;
//
//public class ConvertOpalExcelToPheno
//{
// final Logger logger = Logger.getLogger(ConvertOpalExcelToPheno.class);
//
// // maps to Opal.Table
// final Map<String, Investigation> investigations = new LinkedHashMap<String, Investigation>();
// // each study has one data table (not entirely true!)
// final List<Data> datas = new ArrayList<Data>();
//
// // maps to Opal.Variables
// final List<Measurement> measurements = new ArrayList<Measurement>();
//
// // maps to Opal.Categories
// final List<Code> codes = new ArrayList<Code>();
//
// // maps to Opal.Participant
// final List<Individual> individuals = new ArrayList<Individual>();
//
// // list of unit
// final Map<String, OntologyTerm> units = new LinkedHashMap<String, OntologyTerm>();
//
// // maps to Opal.Table.Cell
// final List<Observation> values = new ArrayList<Observation>();
//
// // indicator to use pheno or xgap like values
// boolean xgap = true;
//
// public static void main(String[] args) throws Exception
// {
// new ConvertOpalExcelToPheno();
// }
//
// public ConvertOpalExcelToPheno() throws Exception
// {
// // start logger
// BasicConfigurator.configure();
//
// File opalExcel = new File("/Users/mswertz/Downloads/view-export.xls");
//
// // read file
// loadVariables(opalExcel);
// loadCategories(opalExcel);
// loadDataTabel(opalExcel, "healthy-obese");
//
// // store in database
// JDBCDatabase db = new JDBCDatabase(
// "modules/xgap/org/molgenis/xgap/xqtlworkbench/xqtl.properties");
// try
// {
// db.beginTx();
// db.add(new ArrayList<Investigation>(investigations.values()));
// db.add(individuals);
// db.add(new ArrayList<OntologyTerm>(units.values()));
// for (Measurement m : measurements)
// {
// logger.debug("adding: " + m);
// db.add(m);
// }
// db.add(codes);
// if(xgap) db.add(datas);
// db.add(values);
// db.commitTx();
// }
// catch (Exception e)
// {
// e.printStackTrace();
// db.rollbackTx();
// }
// }
//
// private void loadVariables(File opalExcel) throws Exception
// {
// ExcelReader reader = new ExcelReader(opalExcel, "Variables");
// logger.info("loading variables");
//
// reader.parse(new CsvReaderListener()
// {
//
// @Override
// public void handleLine(int lineNumber, Tuple tuple)
// throws Exception
// {
// // mapping Opal.Variable -> pheno.Measurement
// Measurement m = new Measurement();
//
// // table -> study
// if (investigations.get(tuple.getString("table")) == null)
// {
// Investigation investigation = new Investigation();
// investigation.setName(tuple.getString("table"));
// investigations.put(investigation.getName(), investigation);
// }
// m.setInvestigation_Name(tuple.getString("table"));
//
// // name -> name
// m.setName(tuple.getString("name"));
//
// // valueType -> dataType
// String dataType = tuple.getString("valueType");
// if (dataType.equals("integer")) dataType = "int";
// m.setDataType(dataType);
//
// // mimeType -> IGNORED
// // unit -> unit
// if (!tuple.isNull("unit"))
// {
// if (units.get(tuple.getString("unit")) == null)
//
// {
// OntologyTerm unit = new OntologyTerm();
// unit.setName(tuple.getString("unit"));
// units.put(unit.getName(), unit);
// }
// m.setUnit_Name(tuple.getString("unit"));
// }
//
// // repeatable -> temporal
// m.setTemporal(tuple.getBool("repeatable") ? true : false);
//
// // occurrenceGroup -> IGNORED
// // label:en -> description
// m.setDescription(tuple.getString("label:en"));
//
// // script -> IGNORED, todo
// // variableUri -> IGNORED, should become DbXref
// // dataschemaUri -> IGNORED, should become DbXref
// // projectUri -> IGNORED, should become DbXref
//
// logger.debug(m);
// measurements.add(m);
//
// }
// });
// }
//
// /**
// * Maps Opal.Category -> Pheno.Code
// * <ul>
// * <li>table -> IGNORED?
// * <li>variable -> feature
// * <li>code -> code
// * <li>missing -> missing (new)
// * <li>label:en -> name
// * </ul>
// *
// * @param opalExcel
// * @throws Exception
// */
// private void loadCategories(File opalExcel) throws Exception
// {
// ExcelReader reader = new ExcelReader(opalExcel, "Categories");
// logger.info("loading categories");
//
// reader.parse(new CsvReaderListener()
// {
//
// @Override
// public void handleLine(int lineNumber, Tuple tuple)
// throws Exception
// {
// // map Opal.Category -> Pheno.Code
// Code c = new Code();
//
// // table -> investigation
// // c.setInvestigation(tuple.getString("table"));
//
// // variable -> feature
// c.setFeature_Name(tuple.getString("variable"));
//
// // name -> codeString
// c.setCodeString(tuple.getString("name"));
//
// // missing -> missing (new)
// c.setMissing(tuple.getBool("missing"));
//
// // label:en -> name
// c.setDescription(tuple.getString("label:en"));
//
// logger.debug(c);
// codes.add(c);
// }
// });
// }
//
// private void loadDataTabel(File opalExcel, final String sheetName)
// throws Exception
// {
// // matrix with ObservedValue(
// // investigation_name=sheetName,
// // target_name=row.'Entity ID',
// // feature_name=row.<colname>,
// // value=row.get(<colname>)
// // )
//
// ExcelReader reader = new ExcelReader(opalExcel, sheetName);
// logger.info("loading values for data table: " + sheetName);
//
// final Data data = new Data();
// if (xgap)
// {
// data.setName(sheetName);
// data.setInvestigation_Name(sheetName);
// data.setFeatureType("Measurement");
// data.setTargetType("Individual");
// data.setValueType("Text");
// data.setStorage("Database");
// datas.add(data);
//
// }
//
// reader.parse(new CsvReaderListener()
// {
//
// @Override
// public void handleLine(int lineNumber, Tuple tuple)
// throws Exception
// {
// int featureIndex = 0;
// for (String featureName : tuple.getFields())
// {
// if ("Entity ID".equals(featureName))
// {
// Individual i = new Individual();
// i.setName(tuple.getString(featureName));
// i.setInvestigation_Name(sheetName);
// logger.debug(i);
// individuals.add(i);
// }
// else
// {
// if (xgap)
// {
// TextDataElement v = new TextDataElement();
// v.setData_Name(data.getName());
// v.setInvestigation_Name(sheetName);
// v.setFeature_Name(featureName);
// v.setFeatureIndex(featureIndex++);
// v.setTarget_Name(tuple.getString("Entity ID"));
// v.setTargetIndex(lineNumber-1);
// v.setValue(tuple.getString(featureName));
// logger.debug(v);
// values.add(v);
// }
// else
// {
// ObservedValue v = new ObservedValue();
// v.setInvestigation_Name(sheetName);
// v.setFeature_Name(featureName);
// v.setTarget_Name(tuple.getString("Entity ID"));
// v.setValue(tuple.getString(featureName));
// logger.debug(v);
// values.add(v);
// }
// }
// }
// }
// });
// }
// }