/*
* importSamples.java
*
* Created on den 1 april 2004, 13:35
*/
package se.arexis.agdb.util.FileImport;
import java.io.*;
import java.util.*;
import se.arexis.agdb.db.*;
import se.arexis.agdb.util.*;
/**
*
* @author wali
* @version
*/
public class ImportSamples extends ImportData
{
/**
* Return the format name
*/
public String getFormat()
{
return "SAMPLE";
}
private ArrayList errorList;
private ArrayList warningList;
/** Creates a new instance of ImportVariables */
public ImportSamples()
{
CREATE=true;
UPDATE=true;
CREATE_OR_UPDATE=true;
SUID=true;
try
{
headers = new ArrayList<FileHeader>();
headers.add(new FileHeader("SAMPLE","LIST",1,'\t'));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public boolean check()
{
Errors.logInfo("ImportSamples.check() started");
boolean res = false;
DbImportFile dbInFile = new DbImportFile();
String fullFileName = "";
String checkFileName = "";
String errMessage = null;
try
{
dbInFile.setStatus(conn_viss,ifid,"0%");
// Store the file on server filesystem
fullFileName = dbInFile.storeImportFileBLOB(conn_viss, ifid);
checkFileName = fullFileName + "_checked";
FileHeader header = FileParser.scanFileHeader(fullFileName);
String type = header.formatTypeName().toUpperCase();
char delimiter = header.delimiter().charValue();
FileParser fileParser = new FileParser(fullFileName);
fileParser.Parse(FileTypeDefinitionList.matchingDefinitions(FileTypeDefinition.SAMPLE,
FileTypeDefinition.LIST));
// Write out the result to a new file
FileWriter fileOut = new FileWriter(checkFileName);
fileOut.write(header.objectTypeName()
+"/"+header.formatTypeName()
+"/"+header.version()
+"/"+header.delimiter()+"\n");
String titles[] = fileParser.columnTitles();
for (int j=0;j<titles.length;j++)
{
fileOut.write(titles[j] + delimiter);
}
fileOut.write("\n");
String indId;
if (titles[0].equals("IDENTITY"))
indId="IDENTITY";
else
indId="Alias";
String errorMsg = "";
errorMsg = checkList(fileParser,fileOut,delimiter, indId);
fileOut.close();
/*
* Save the file to database
*/
dbInFile.saveCheckedFile(conn_viss, ifid, checkFileName);
if (errorMsg.startsWith("ERROR:"))
{
res = false;
dbInFile.setStatus(conn_viss,ifid,"ERROR");
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,"File checked failed for sampling unit "+DbSamplingUnit.getSUName(conn_viss,Integer.toString(sampleUnitId)) +". <br>"+errorMsg );
Errors.logDebug("ErrorMsg="+errorMsg);
}
else if (errorMsg.startsWith("WARNING:"))
{
dbInFile.setStatus(conn_viss,ifid,"WARNING");
res = true;
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,"Warnings exists: "+errorMsg );
}
else
{
dbInFile.setStatus(conn_viss,ifid,"CHECKED");
res = true;
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,"File checked for sampling unit "+DbSamplingUnit.getSUName(conn_viss,Integer.toString(sampleUnitId)) + ".<br>"+errorMsg);
}
}
catch (Exception e)
{
dbInFile.setStatus(conn_viss,ifid,"ERROR");
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,e.getMessage());
e.printStackTrace(System.err);
if (errMessage == null)
{
errMessage = e.getMessage();
}
}
finally
{
try
{
/*
* Delete files uploaded
*/
File tmp = new File(checkFileName);
tmp.delete();
tmp = new File(fullFileName);
tmp.delete();
}
catch (Exception ignore)
{
}
}
Errors.logInfo("ImportSamples.check() ended");
return res;
}
public boolean imp()
{
boolean res = false;
//boolean isOk = true;
String errMessage = null;
//String sampleUnitIdAsStr = null;
DbImportFile dbInFile = new DbImportFile();
try
{
String filename = dbInFile.storeImportFileBLOB(conn_viss, ifid);
dbInFile.setStatus(conn_viss,ifid,"0%");
// Create the individual
DbIndividual dbIndividual = new DbIndividual();
//FileParser fileParser = new FileParser(upPath + "/" + systemFileName);
FileParser fileParser = new FileParser(filename);
fileParser.Parse(FileTypeDefinitionList.matchingDefinitions(FileTypeDefinition.SAMPLE,
FileTypeDefinition.LIST));
/*
// If add mode
if (mode == null || mode.equalsIgnoreCase("CREATE"))
{
dbIndividual.CreateIndividuals(fileParser, connection,
sampleUnitId,
Integer.parseInt(userId));
}
// If update mode
else if (mode.equalsIgnoreCase("UPDATE"))
{
dbIndividual.UpdateIndividuals(fileParser, connection,
sampleUnitId,
Integer.parseInt(userId));
}
*/
//sample only support CREATE OR UPDATE!!
// if both update and add
if (updateMethod == null || updateMethod.equalsIgnoreCase("CREATE_OR_UPDATE") || updateMethod.equalsIgnoreCase("UPDATE") || updateMethod.equalsIgnoreCase("CREATE"))
{
dbIndividual.CreateOrUpdateSamples(fileParser,
connection,
sampleUnitId,
Integer.parseInt(userId));
}
errMessage = dbIndividual.getErrorMessage();
// Get the error message from the database object. If it is set an
// error occured during the operation so an error is thrown.
errMessage = dbIndividual.getErrorMessage();
Assertion.assertMsg(errMessage == null ||
errMessage.trim().equals(""), errMessage);
dbInFile.setStatus(conn_viss,ifid,"IMPORTED");
//dbInFile.UpdateImportFile(connection,null,null,"Done",Integer.parseInt(ifid),Integer.parseInt(userId));
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,"File imported to sampling unit "+DbSamplingUnit.getSUName(conn_viss,Integer.toString(sampleUnitId)) );
res = true;
}
catch (Exception e)
{
// Flag for error and set the errMessage if it has not been set
//isOk = false;
dbInFile.setStatus(conn_viss,ifid,"ERROR");
//dbInFile.UpdateImportFile(connection,null,null,e.getMessage(),Integer.parseInt(ifid),Integer.parseInt(userId));
// Add a message to the log
dbInFile.addErrMsg(conn_viss,ifid,e.getMessage());
e.printStackTrace(System.err);
if (errMessage == null)
{
errMessage = e.getMessage();
}
}
return res;
}
/**
* @param fp
* @param fileOut
* @param delim
* @return */
private String checkList(FileParser fp , FileWriter fileOut, char delim, String indId)
{
String identity, name, tissue, experimenter, date, treatment, storage, comment, value;
String errorMsg = "";
Errors.logInfo("ImportSamples.checkList(...) started");
int dataRows = fp.dataRows();
DbImportFile dbInFile = new DbImportFile();
int numOfErrors = 0;
String statusStr;
double status;
double status_last = 0.0;
errorList = new ArrayList();
warningList = new ArrayList();
for (int i=0;i<dataRows;i++)
{
identity = fp.getValue(indId, i).trim();
name = fp.getValue("NAME",i).trim();
tissue = fp.getValue("TISSUE",i).trim();
experimenter = fp.getValue("EXPERIMENTER",i).trim();
date = fp.getValue("DATE",i).trim();
treatment = fp.getValue("TREATMENT",i).trim();
storage = fp.getValue("STORAGE",i).trim();
comment = fp.getValue("COMMENT",i).trim();
// Check for valid data values.
// Check for length, remove null and so on.
// Syntax check.
checkValues(identity, name, tissue, experimenter, date, treatment, storage, comment);
// If add updateMethod
if (updateMethod == null || updateMethod.equalsIgnoreCase("CREATE"))
{
warningList.add("Create updateMethod was chosen but is not supported by samples. CREATE OR UPDATE updateMethod is used instead.");
Errors.logWarn("ImportSamples.checkList(...) "+
"CREATE updateMethod was chosen but it is not supported by samples. CREATE OR UPDATE updateMethod is used instead.");
checkCreateOrUpdate(identity, name);
//checkCreate(name);
}
// If update updateMethod
else if (updateMethod.equalsIgnoreCase("UPDATE"))
{
warningList.add("Update updateMethod was chosen, variable sets only supports create updateMethod.");
Errors.logWarn("ImportSamples.checkList(...) "+
"UPDATE updateMethod was chosen but it is not supported by samples. CREATE OR UPDATE updateMethod is used instead.");
checkCreateOrUpdate(identity, name);
//checkUpdate(name);
}
// if both update and add
else if (updateMethod.equalsIgnoreCase("CREATE_OR_UPDATE"))
{
checkCreateOrUpdate(identity, name);
}
/**
* Write errors to a commented file
*/
try
{
//Errors.logDebug(errList.toString());
numOfErrors += errorList.size();
for (int j=0;j<errorList.size();j++)
{
fileOut.write("# " + (String)errorList.get(j)+"\n");
}
//fatalErrors = new ArrayList();
fileOut.write(identity+delim+name+delim+tissue+delim+experimenter+delim+date+delim+treatment+delim+storage+delim+comment+"\n");
}
catch (Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
/*
* Set the status of the import, visible to the user
*/
status = (new Double(i*100/(1.0*dataRows))).doubleValue();
if (status_last + 5 < status)
{
status_last = status;
statusStr = Integer.toString((new Double(status)).intValue()) + "%";
dbInFile.setStatus(conn_viss,ifid,statusStr);
}
// write row + all errors encountered to file
writeListErrors(fileOut);
}
Errors.logDebug("ImportSamples.checkList() Errors="+numOfErrors);
/*if (numOfErrors>0)
{null
errorMsg = "Import of the sample failed. <br>Errors: "+numOfErrors;
}
else if (warningList.size()>0)
errorMsg = "WARNING: Some warnings exist in the grouping file";
*/
if (errorList.size()>0)
errorMsg = "ERROR: Import of the grouping file failed.";
else if (warningList.size()>0)
errorMsg = "WARNING: Some warnings exist in the grouping file";
else
errorMsg = "Grouping file is correct";
errorMsg += "<br>\nWarnings:"+warningList.size()+"<br>\nErrors:"+errorList.size();
Errors.logInfo("ImportGrouping.checkList(...) ended");
return errorMsg;
}
private void writeListErrors(FileWriter fileOut)
{
try
{
if(errorList.size()>0 || warningList.size()>0)
{
fileOut.write("#--------------------------------------------------\n");
}
if(errorList.size()>0)
{
for(int i=0;i<errorList.size();i++)
{
fileOut.write("#"+ (String)errorList.get(i)+"\n");
}
}
if(warningList.size()>0)
{
for (int i=0;i<warningList.size();i++)
{
fileOut.write("#"+ (String)warningList.get(i)+"\n");
}
}
// if there are errors, the string is "Outcommented"
if(errorList.size()>0)
{
fileOut.write("#");
}
// write original string
//fileOut.write(delimeter+group);
if(errorList.size()>0 || warningList.size()>0)
{
fileOut.write("#--------------------------------------------------\n");
}
}//try
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
private void checkValues(String identity, String name, String tissue, String experimenter, String date, String treatment, String storage, String comment)
{
boolean ret = true;
//Identity
if (identity == null || identity.trim().equals(""))
{
errorList.add("Unable to read Identity/Alias.");
ret = false;
}
else if (identity.length() > 11)
{
errorList.add("Identity/Alias [" + identity + "] exceeds 11 characters.");
ret = false;
}
//name
if (name == null || name.trim().equals(""))
{
errorList.add("Unable to read sample name.");
ret = false;
}
else if (name.length() > 20)
{
errorList.add("Sample [" + name + "] exceeds 20 characters.");
ret = false;
}
//tissue
if (tissue == null || tissue.trim().equals(""))
{
tissue = "";
}
else if (tissue.length() > 20)
{
errorList.add("Tissue [" + tissue + "] exceeds 20 characters.");
ret = false;
}
//Experimenter
if (experimenter == null)
{
experimenter = "";
}
else if (experimenter != null && experimenter.length() > 32)
{
errorList.add("Experimenter [" + experimenter + "] exceeds 32 characters.");
ret = false;
}
if (date.length() != 0)
if (date != null && date.length() != 10)
{
errorList.add("Date not in the format 'YYYY-MM-DD'.");
ret = false;
}
else if (date != null && date.length() == 10)
{
try
{
java.util.Date temp = java.sql.Date.valueOf(date);
}
catch (Exception e)
{
errorList.add("Date not in the format 'YYYY-MM-DD'");
ret = false;
}
}
if (treatment == null)
{
treatment = "";
}
else if (treatment != null && treatment.length() > 20)
{
errorList.add("Treatment [" + treatment + "] exceeds 20 characters.");
ret = false;
}
if (storage == null)
{
storage = "";
}
else if (storage != null && storage.length() > 20)
{
errorList.add("Storage [" + treatment + "] exceeds 20 characters.");
ret = false;
}
if (comment != null && comment.length() > 256)
{
errorList.add("Comment exceeds 256 characters.");
ret = false;
}
}
/**
* @param name
* @return */
private void checkCreate(String identity, String name)
{
if(db.isIndividualUnique(identity)){
errorList.add("Identity ["+identity+"] does not exist.");
}
if (!db.isSampleUnique(identity, name))
{
errorList.add("Sample ["+ name +"] already exists");
}
// Add object to test db.
db.setSample(identity, name);
}
/**
* @param name
* @return */
private void checkUpdate(String identity, String name)
{
if(db.isIndividualUnique(identity)){
errorList.add("Identity ["+identity+"] ["+name+"] does not exist.");
}
if (db.isSampleUnique(identity, name))
{
errorList.add("Sample ["+name+"] does not exist");
}
}
/**
* @param name
* @return */
private void checkCreateOrUpdate(String identity, String name)
{
if (db.isSampleUnique(identity, name))
{
checkCreate(identity, name);
}
else
{
checkUpdate(identity, name);
}
}
}