package aliview.importer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import utils.nexus.CharSet;
import utils.nexus.CharSets;
import utils.nexus.CodonPositions;
import utils.nexus.Excludes;
import utils.nexus.NexusAlignmentImportException;
import utils.nexus.NexusUtilities;
import aliview.AliView;
import aliview.GeneticCode;
import aliview.MemoryUtils;
import aliview.alignment.Alignment;
import aliview.alignment.AlignmentFile;
import aliview.alignment.AlignmentMeta;
import aliview.messenges.Messenger;
import aliview.sequencelist.FileSequenceAlignmentListModel;
import aliview.sequencelist.AlignmentListModel;
import aliview.sequences.NexusSequence;
import aliview.sequences.SequenceUtils;
import aliview.settings.Settings;
import aliview.utils.Utils;
public class AlignmentFactory {
private static final String LF = System.getProperty("line.separator");
private static final Logger logger = Logger.getLogger(AlignmentFactory.class);
private static final SequencesFactory seqFactory = new SequencesFactory();
// TODO change so it also reads from buffer
/*
* Create alignment in factory since we dont know until we have read file if it is a nucleotide
* or a protein alignment
*
*/
public static Alignment createNewAlignment(File alignmentFile){
logger.info("inside createNewAlignment");
long startTime;
startTime = System.currentTimeMillis();
Alignment alignment = null;
try {
AlignmentListModel sequences = seqFactory.createSequences(alignmentFile);
Excludes excludes = new Excludes();
CodonPositions codonPositions = new CodonPositions();
CharSets charsets = new CharSets();
logger.info("sequences.getLongestSequenceLength()" + sequences.getLongestSequenceLength());
try {
// Try to read Excludes etc. from alignmentfile
if(NexusUtilities.isNexusFile(alignmentFile) && sequences instanceof FileSequenceAlignmentListModel == false && sequences.get(0) instanceof NexusSequence == false){
NexusUtilities.updateExcludesFromFile(alignmentFile,excludes);
NexusUtilities.updateCodonPositionsFromNexusFile(alignmentFile, codonPositions);
charsets = NexusUtilities.createCharsetsFromNexusFile(alignmentFile, sequences.getLongestSequenceLength());
}
// Try to read Excludes etc. from metaFile
else{
// Try to read Excludes from metaFile
File metaFile = new File(alignmentFile.getAbsolutePath()+ ".meta");
if(metaFile.exists()){
NexusUtilities.updateExcludesFromFile(metaFile,excludes);
NexusUtilities.updateCodonPositionsFromNexusFile(metaFile, codonPositions);
charsets = NexusUtilities.createCharsetsFromNexusFile(metaFile, sequences.getLongestSequenceLength());
}
}
} catch (NexusAlignmentImportException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
Messenger.showOKOnlyMessage(Messenger.ALIGNMENT_META_READ_ERROR,
LF + e.getLocalizedMessage());
}
MemoryUtils.logMem();
AlignmentMeta aliMeta = new AlignmentMeta(excludes, codonPositions, charsets, GeneticCode.DEFAULT);
if(sequences.getSequenceType() == SequenceUtils.TYPE_AMINO_ACID){
alignment = new Alignment(alignmentFile, sequences, aliMeta);
}
else{
alignment = new Alignment(alignmentFile, sequences, aliMeta);
}
MemoryUtils.logMem();
// There was a problem
} catch (AlignmentImportException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
Messenger.showOKOnlyMessage(Messenger.ALIGNMENT_IMPORT_ERROR,
LF + e.getLocalizedMessage());
}
// Check if unique names - otherwise warn
if(alignment != null){
boolean hideMessage = Settings.getHideDuplicateSeqNamesMessage().getBooleanValue();
if(! hideMessage){
ArrayList duplicateSeqNames = alignment.findDuplicateNames();
if(duplicateSeqNames != null && duplicateSeqNames.size() > 0){
alignment.selectDuplicateNamesSequences();
Messenger.showDuplicateSeqNamesMessage(duplicateSeqNames);
}
}
}
long endTime = System.currentTimeMillis();
System.out.println("Importing sequences took " + (endTime - startTime) + " milliseconds");
return alignment;
}
// ToDO maybe throw something if not working
public static Alignment createNewAlignment(String alignmentText){
Alignment alignment = null;
try {
logger.info("ali" + alignmentText);
AlignmentFile tempAliFile = AlignmentFile.createAliViewTempFile("clipboard-alignment", "");
FileUtils.writeStringToFile(tempAliFile, alignmentText);
alignment = createNewAlignment(tempAliFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return alignment;
}
public static Alignment createNewEmptyAlignment(){
return new Alignment();
}
}