content: package aliview.externalcommands;
  
  import java.awt.Dimension;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.io.File;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  import javax.swing.BoxLayout;
  import javax.swing.JButton;
  import javax.swing.JCheckBox;
  import javax.swing.JPanel;
  import javax.swing.JTextArea;
  import javax.swing.JTextField;
  
  import org.apache.commons.lang.StringUtils;
  
  import aliview.AliViewWindow;
  import aliview.aligner.MuscleWrapper;
  import aliview.importer.FileFormat;
  
  public class CommandItem{
  	private static final String LF = System.getProperty("line.separator");
  
  	public static final String CURRENT_ALIGNMENT = "CURRENT_ALIGNMENT";
  	public static final String CURRENT_ALIGNMENT_TEMP = "CURRENT_ALIGNMENT_TEMP";
  	public static final String CURRENT_ALIGNMENT_FASTA = "CURRENT_ALIGNMENT_FASTA";
  	public static final String CURRENT_ALIGNMENT_PHYLIP = "CURRENT_ALIGNMENT_PHYLIP";
  	public static final String NEW_ALIGNMENT_TEMP_FILE = "NEW_ALIGNMENT_TEMP_FILE";
  	public static final String OUTPUT_FILE = "TEMP_OUT_FILE";
  	public static final String CURRENT_ALIGNMENT_FASTA_TRANSLATED_AA = "CURRENT_ALIGNMENT_FASTA_TRANSLATED_AA";
  	public static final String SECOND_FILE = "SECOND_FILE";
  	public static final String SECOND_SEQUENCES = "SECOND_SEQUENCES";
  
  	private String name;
  	private String programPath;
  	private String command;
  	private String commandAlternative;
  	private boolean isActivated;
  	private boolean showCommandWindow;
  
  	private ArrayList<String[]> parsedCommand =  new ArrayList<String[]>();
  
  
  	public CommandItem(String name, String programPath, String command, boolean isActivated, boolean showCommandWindow) {
  		setName(name);
  		setProgramPath(programPath);
  		setCommand(command);
  		this.isActivated = isActivated;
  		this.showCommandWindow = showCommandWindow;
  	}
  
  	public void setProgramPath(String programPath) {
  		this.programPath = programPath;
  	}
  
  	public String getProgramPath() {
  		return programPath;
  	}
  
  	public String getName() {
  		return name;
  	}
  
  	public void setName(String name) {
  		this.name = name;
  	}
  
  	public String getCommand() {
  		return command;
  	}
  
  	public void setCommand(String command) {
  		this.command = command;
  		parseCommand();
  	}
  
  	public boolean isActivated() {
  		return isActivated;
  	}
  
  	public void setActivated(boolean isActivated) {
  		this.isActivated = isActivated;
  	}
  
  	public boolean isShowCommandWindow() {
  		return showCommandWindow;
  	}
  
  	public void setShowCommandWindow(boolean showCommandWindow) {
  		this.showCommandWindow = showCommandWindow;
  	}
  
  	public FileFormat getCurrentAlignmentFileFormat() {
  
  		if(getCommand().contains(CURRENT_ALIGNMENT_TEMP)){
  			return FileFormat.FASTA;
  		}
  		else if(getCommand().contains(CURRENT_ALIGNMENT_FASTA)){
  			return FileFormat.FASTA;
  		}
  		else if(getCommand().contains(CURRENT_ALIGNMENT_PHYLIP)){
  			return FileFormat.PHYLIP;
  		}
  		else if(getCommand().contains(CURRENT_ALIGNMENT)){
  			return FileFormat.FASTA;
  		}
  		else{
  			return FileFormat.FASTA;
  		}
  	}
  
  	public void reParseCommand(){
  		parseCommand();
  	}
  
  	public void parseCommand(){
  		parseCommandIncludingProgramAsFirstParameter();
  	}
  
  	private void parseCommandIncludingProgramAsFirstParameter(){
  		if(getCommand() == null){
  			return;
  		}
  
  		parsedCommand = new ArrayList<String[]>();
  
  
  		String commandInclProgram = "";
  		if(getProgramPath() != null && getProgramPath().length() > 0){
  			// strip remaining " or ' from argument
  			String stripped = StringUtils.strip(getProgramPath(), "\"'");
  			commandInclProgram = "\"" + stripped + "\"" + " " + getCommand();
  		}else{
  			commandInclProgram = getCommand();
  		}
  
  		// split lines
  		String[] splitted = commandInclProgram.split("[\r\n]+");
  
  		// create a command per line
  		for(int n = 0; n < splitted.length; n++){
  
  			List<String> matchList = new ArrayList<String>();
  			Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
  			Matcher regexMatcher = regex.matcher(splitted[n]);
  			while (regexMatcher.find()) {
  				String arg = regexMatcher.group();
  				// strip remaining " or ' from argument
  				arg = StringUtils.strip(arg, "\"'");
  				matchList.add(arg);
  			} 
  			String[] splitline = matchList.toArray(new String[matchList.size()]);
  			parsedCommand.add(splitline);
  		}
  	}
  
  
  	public void replaceInCommand(String find, String replace){
  		for(String[] line: parsedCommand){
  			for(int i = 0; i < line.length; i++){
  				line[i] = StringUtils.replace(line[i], find, replace);
  			}
  		}
  	}
  
  	public void replaceParametersInCommand(){
  		replaceInCommand("LOCAL_ALIVIEW_DIR",MuscleWrapper.getAliViewUserDataDirectory());
  	}
  
  	public void setParameterSecondFile(File secondFile) {
  		replaceInCommand(CommandItem.SECOND_FILE, secondFile.getAbsolutePath());
  		replaceInCommand(CommandItem.SECOND_SEQUENCES, secondFile.getAbsolutePath());
  	}
  
  	public void setParameterCurrentFile(File currentFile) {
  		replaceInCommand(CommandItem.CURRENT_ALIGNMENT_TEMP, currentFile.getAbsolutePath());
  		replaceInCommand(CommandItem.CURRENT_ALIGNMENT_FASTA, currentFile.getAbsolutePath());
  		replaceInCommand(CommandItem.CURRENT_ALIGNMENT_PHYLIP, currentFile.getAbsolutePath());
  		replaceInCommand(CommandItem.CURRENT_ALIGNMENT_FASTA_TRANSLATED_AA, currentFile.getAbsolutePath());
  		replaceInCommand(CommandItem.CURRENT_ALIGNMENT, currentFile.getAbsolutePath());
  	}
  
  	public void setParameterOutputFile(File outputFile) {
  		replaceInCommand(CommandItem.OUTPUT_FILE, outputFile.getAbsolutePath());
  	}
  
  	public boolean commandContainsIgnoreCase(String target) {
  		return getCommand().toLowerCase().contains(target.toLowerCase());
  	}
  
  	public ArrayList<String[]> getParsedCommands() {
  		return parsedCommand;
  	}
  
  
  }
  