package matrix.implementations.database; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.molgenis.data.Data; import org.molgenis.framework.db.Database; import xgap.importexport.DataElementImportByFile; import decorators.NameConvention; public class DatabaseDataMatrixWriter { Logger logger = Logger.getLogger(getClass().getSimpleName()); /** * Special constructor: imports from temp file. Does not have a 'testMode' * boolean, this is always FALSE. * * @param dataMatrix * @param inputFile * @param db * @throws Exception */ public DatabaseDataMatrixWriter(Data dataMatrix, File inputFile, Database db) throws Exception { List<File> inputFiles = new ArrayList<File>(); List<Data> dataList = new ArrayList<Data>(); inputFiles.add(inputFile); dataList.add(dataMatrix); new DatabaseDataMatrixWriter(dataList, inputFiles, db, false, true); } public DatabaseDataMatrixWriter(Data dataMatrix, File inputFile, Database db, boolean testMode) throws Exception { List<File> inputFiles = new ArrayList<File>(); List<Data> dataList = new ArrayList<Data>(); inputFiles.add(inputFile); dataList.add(dataMatrix); new DatabaseDataMatrixWriter(dataList, inputFiles, db, testMode, false); } public DatabaseDataMatrixWriter(List<Data> dataList, File inputDir, Database db, boolean testMode) throws Exception { List<File> inputFiles = new ArrayList<File>(); for (File input : inputDir.listFiles()) { inputFiles.add(input); } new DatabaseDataMatrixWriter(dataList, inputFiles, db, testMode, false); } /** * Import a matrix using a list of input 'Data' and files. The filenames * MUST match the file-escaped 'Data' names! Unless 'fromTmpFile' is TRUE, * in that case the order of the lists must be the same. (retrieve by index) * * @param dataList * @param inputFiles * @param db * @param testMode * @throws Exception */ public DatabaseDataMatrixWriter(List<Data> dataList, List<File> inputFiles, Database db, boolean testMode, boolean fromTmpFile) throws Exception { int index = 0; for (Data dataMatrix : dataList) { File inputFile = null; if (fromTmpFile) { inputFile = inputFiles.get(index); } else { inputFile = getInputFileForName(NameConvention.escapeFileName(dataMatrix.getName()) + ".txt", inputFiles); } index++; try { db.beginTx(); String outcome = new DataElementImportByFile(db).ImportByFile(inputFile, dataMatrix, false, false, false, false); logger.info(outcome); if (!testMode) { logger.info("DatabaseMatrixWriter db.commitTx()"); db.commitTx(); } else { db.rollbackTx(); } } catch (Exception e) { db.rollbackTx(); throw e; } } } public File getInputFileForName(String name, List<File> inputFiles) { logger.info("getting file for name: " + name); for (File f : inputFiles) { logger.info("file: " + f.getAbsolutePath() + " (" + f.getName() + ")"); if (f.getName().equals(name)) { logger.info("FOUND!"); return f; } } logger.info("NOT FOUND"); return null; } }