/*
* ImportGrouping.java
*
* Created on April 1, 2004, 12:48 PM
*/
package se.arexis.agdb.util.FileImport;
import java.io.*;
import java.util.*;
import se.arexis.agdb.*;
import se.arexis.agdb.util.*;
import se.arexis.agdb.db.*;
/**
*
* @author heto
*/
public class ImportGrouping extends ImportData
{
/**
* Return the format name
*/
public String getFormat()
{
return "GROUPING";
}
/** An list of error messages passed between methods in this class */
private ArrayList errorList;
/** Warning list */
private ArrayList warningList;
/** Creates a new instance of ImportGrouping */
public ImportGrouping()
{
CREATE=true;
SUID=true;
try
{
headers = new ArrayList<FileHeader>();
headers.add(new FileHeader("GROUPING","LIST",1,'\t'));
// Individual data is needed before this is imported
dependency.add(new Dependency("GROUPING", new String[] {"INDIVIDUAL","TACMAN"} ));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public boolean check()
{
this.updateMethod="CREATE";
// ImportGrouping.check()
Errors.logInfo("ImportGrouping.check() started");
boolean res = false;
DbImportFile dbInFile = new DbImportFile();
String errorMsg = "";
FileWriter fileOut=null;
try
{
String filename = dbInFile.storeImportFileBLOB(conn_viss, ifid);
String checkFileName = filename + "_checked";
// Create the individual data object
DbIndividual dbIndividual = new DbIndividual();
FileParser fileParser = new FileParser(filename);
fileParser.Parse(FileTypeDefinitionList.matchingDefinitions(FileTypeDefinition.GROUPING,
FileTypeDefinition.LIST));
FileHeader header = FileParser.scanFileHeader(filename);
char delimiter = header.delimiter().charValue();
// Write out the result to a new file
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");
// Garbage collect the unused variables
header = null;
// Check list file
errorMsg = checkList(fileParser, fileOut, delimiter);
// Close the file
fileOut.close();
/*
* Save the file to database
*/
dbInFile.saveCheckedFile(conn_viss, ifid, checkFileName);
/*
* Delete files uploaded
*/
File tmp = new File(filename);
tmp.delete();
tmp = new File(checkFileName);
tmp.delete();
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)
{
Errors.logError("ImportGrouping.check() Exception: "+e.getMessage());
}
Errors.logInfo("ImportGrouping.check() ended");
return res;
}
private String checkList(FileParser fp , FileWriter fileOut, char delim)
{
// ImportGrouping.checkList(...)
Errors.logInfo("ImportGrouping.checkList(...) started");
String errorMsg = "";
String titles[];
int dataRows = fp.dataRows();
DbImportFile dbInFile = new DbImportFile();
int numOfErrors = 0;
String statusStr;
double status;
double status_last = 0.0;
// This first element is "IDENTITY"
titles = fp.columnTitles();
String identity, group, grouping;
errorList = new ArrayList();
warningList = new ArrayList();
// Check for valid grouping names in title
for (int j=1;j<titles.length;j++)
{
grouping = titles[j].trim();
if (grouping.length()>20)
{
// Grouping name too long
errorList.add("Grouping name ["+grouping+"] exceeds 20 characters.");
}
if (grouping.length()==0)
{
// Grouping name not valid
errorList.add("Grouping name is invalid.");
}
/*
try
{
// Write out the group names to the commented file
fileOut.write(grouping+delim);
}
catch (Exception e)
{
Errors.logError("Exception: "+e.getMessage());
e.printStackTrace();
}
*/
}
for (int i=0;i<dataRows;i++)
{
identity = fp.getValue("IDENTITY",i).trim();
Errors.logDebug("ImportGrouping.checkList(...) IDENTITY="+identity);
try
{
// Write to comment file
fileOut.write(identity);
}
catch (Exception e)
{
Errors.logError("ImportGrouping.checkList(...) Unable to write to comment file");
}
for (int j=1;j<titles.length;j++)
{
group = fp.getValue(titles[j], i).trim();
grouping = titles[j].trim();
Errors.logDebug("ImportGrouping.checkList(...) GROUP="+group);
Errors.logDebug("ImportGrouping.checkList(...) GROUPING="+grouping);
checkValues(identity,group);
/*
* Add updateMethod is always used. If other updateMethod is choosen, a warning
* message is displayed.
*/
// If add updateMethod
if (updateMethod == null || updateMethod.equalsIgnoreCase("CREATE"))
{
}
// If update updateMethod
else if (updateMethod.equalsIgnoreCase("UPDATE"))
{
Errors.logWarn("ImportGrouping.checkList(...) Always create updateMethod for grouping files");
warningList.add("Always create updateMethod for grouping files");
}
else if (updateMethod.equalsIgnoreCase("CREATE_OR_UPDATE"))
{
Errors.logWarn("ImportGrouping.checkList(...) Always create updateMethod for grouping files");
warningList.add("Always create updateMethod for grouping files");
}
// Always in create updateMethod!
checkCreate(identity, group,grouping);
try
{
// write original string
fileOut.write(delim+group);
}
catch (Exception e)
{
Errors.logError("ImportGrouping.checkList(...) Unable to write to comment file");
}
/*
* 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);
}
}
try
{
// Write to comment file
fileOut.write("\n");
}
catch (Exception e)
{
Errors.logError("ImportGrouping.checkList(...) Unable to write to comment file");
}
// write row + all errors encountered to file
writeListErrors(fileOut);
}
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 group)
{
boolean ret = true;
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;
}
if (group == null || group.trim().equals(""))
{
group = "";
}
else if (group.length() > 20)
{
errorList.add("Group [" + group + "] exceeds 20 characters.");
ret = false;
}
}
private void checkCreate(String identity, String group, String grouping)
{
if (db.isIndividualUnique(identity))
{
errorList.add("Individual ["+ identity+"] does not exist");
}
if (!db.isGroupingUnique(identity,group,grouping))
{
errorList.add("Individual ["+ identity+"] for group ["+group+"] in grouping ["+grouping+"] already exists");
}
// Add object to test db.
db.setGrouping(identity,group,grouping);
}
public boolean imp()
{
// ImportGrouping.imp()
Errors.logInfo("ImportGrouping.imp() started");
boolean res = false;
DbImportFile dbInFile = new DbImportFile();
String errMessage;
try
{
String filename = dbInFile.storeImportFileBLOB(conn_viss, ifid);
// Create the individual data object
DbIndividual dbIndividual = new DbIndividual();
FileParser fileParser = new FileParser(filename);
fileParser.Parse(FileTypeDefinitionList.matchingDefinitions(FileTypeDefinition.GROUPING,
FileTypeDefinition.LIST));
dbIndividual.CreateGroupings(fileParser, connection,
sampleUnitId, Integer.valueOf(userId).intValue());
errMessage = dbIndividual.getErrorMessage();
Assertion.assertMsg(errMessage == null ||
errMessage.trim().equals(""), errMessage);
dbInFile.setStatus(conn_viss,ifid,"IMPORTED");
// 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)
{
Errors.logError("ImportGrouping.imp() Exception: "+e.getMessage());
}
Errors.logInfo("ImportGrouping.imp() ended");
return res;
}
}