diff --git a/uk/ac/sanger/artemis/ExternalProgram.java b/uk/ac/sanger/artemis/ExternalProgram.java index 21aa93610d94f4b2dd501eea149685669b48ce5c..080bc9c5c9d568c90a4aa7fb23cdda1fe484d9c3 100644 --- a/uk/ac/sanger/artemis/ExternalProgram.java +++ b/uk/ac/sanger/artemis/ExternalProgram.java @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/ExternalProgram.java,v 1.7 2005-09-05 17:37:49 tjc Exp $ + * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/ExternalProgram.java,v 1.8 2005-09-06 15:39:44 tjc Exp $ **/ package uk.ac.sanger.artemis; @@ -42,7 +42,7 @@ import java.util.Enumeration; * and contains methods for invoking it. * * @author Kim Rutherford - * @version $Id: ExternalProgram.java,v 1.7 2005-09-05 17:37:49 tjc Exp $ + * @version $Id: ExternalProgram.java,v 1.8 2005-09-06 15:39:44 tjc Exp $ **/ public class ExternalProgram @@ -121,18 +121,18 @@ public class ExternalProgram // sequence_file_names will be set by prepareRun() final File file_of_filenames = prepareRun(features, sequence_file_names); - final Integer job_control_id = - Options.getOptions().getIntegerProperty("jcon_" + getName() + - "_program_id"); +// final Integer job_control_id = +// Options.getOptions().getIntegerProperty("jcon_" + getName() + +// "_program_id"); - final Integer min_jc_jobs = - Options.getOptions().getIntegerProperty("jcon_min_jobs"); +// final Integer min_jc_jobs = +// Options.getOptions().getIntegerProperty("jcon_min_jobs"); - String jcon_template = - Options.getOptions().getProperty("jcon_" + getName() + "_template"); +// String jcon_template = +// Options.getOptions().getProperty("jcon_" + getName() + "_template"); - final String jcon_batch_queue = - Options.getOptions().getProperty("jcon_batch_queue"); +// final String jcon_batch_queue = +// Options.getOptions().getProperty("jcon_batch_queue"); // if(job_control_id != null && // min_jc_jobs != null && @@ -183,6 +183,9 @@ public class ExternalProgram args[4] = "-d"; args[5] = getProgramOptions(); } + if(System.getProperty("debug") != null) + System.out.println("CALL SSH CLIENT "+getRealName()); + uk.ac.sanger.artemis.j2ssh.SshPSUClient ssh = new uk.ac.sanger.artemis.j2ssh.SshPSUClient(args); ssh.start(); @@ -313,6 +316,18 @@ public class ExternalProgram // store the file number to use for the next sequence file - the key is // a File containing the directory of there Entry that contains the // Feature and the value is the next file number to use + + Entry entry = features.elementAt(0).getEntry(); + RemoteFileNode node = null; + + if(((DocumentEntry)entry.getEMBLEntry()).getDocument() + instanceof RemoteFileDocument) + { + RemoteFileDocument nodeDoc = + (RemoteFileDocument)(((DocumentEntry)entry.getEMBLEntry()).getDocument()); + node = nodeDoc.getRemoteFileNode(); + } + final java.util.Hashtable file_number_hash = new java.util.Hashtable(); for(final Enumeration e = feature_count_hash.keys() ; @@ -320,14 +335,14 @@ public class ExternalProgram { final File directory =(File) e.nextElement(); - final long old_file_number = getFileNumber(directory); + final long old_file_number = getFileNumber(directory, node); final long feature_count = ((Long) feature_count_hash.get(directory)).longValue(); file_number_hash.put(directory, new Long(old_file_number)); - setFileNumber(directory, old_file_number + feature_count); + setFileNumber(directory, old_file_number + feature_count, node); } // write the sequences out @@ -413,7 +428,7 @@ public class ExternalProgram new File(new File(first_directory, getName()), getName() + "_" + "file_of_filenames." + - (getFileNumber(first_directory) - 1)); + (getFileNumber(first_directory, node) - 1)); final Writer filenames_writer = new FileWriter(file_of_filenames); @@ -426,6 +441,10 @@ public class ExternalProgram filenames_printwriter.close(); filenames_writer.close(); + if(System.getProperty("debug") != null) + System.out.println("WRITTEN "+file_of_filenames.getCanonicalPath()); + + return file_of_filenames; } @@ -518,15 +537,41 @@ public class ExternalProgram * file_counter_filename. If the file doesn't exist, it is created and * initialised. **/ - protected long getFileNumber(final File directory) + private long getFileNumber(final File directory, + final RemoteFileNode node) throws IOException { try { - final FileReader file_reader = - new FileReader(new File(directory, File.separatorChar + + final Reader file_reader; + if(node == null) + file_reader = + new FileReader(new File(directory, File.separatorChar + getName() + File.separatorChar + file_counter_filename)); + else + { + String dir = node.getRootDir()+ File.separatorChar + + node.getFullName(); + int index = dir.lastIndexOf(File.separatorChar); + dir = dir.substring(0,index) + File.separatorChar + getName(); + byte[] contents = node.getFileContents(null, dir+ + File.separatorChar+file_counter_filename); + if(contents == null) + { + if(System.getProperty("debug") != null) + System.out.println("getFileNumber() creating "+dir+ + File.separatorChar+file_counter_filename); + + node.mkdir(dir); + return setFileNumber(directory, 1, node); + } + + file_reader = new StringReader(new String(contents)); + + if(System.getProperty("debug") != null) + System.out.println("getFileNumber()\n"+new String(contents)); + } final BufferedReader reader = new BufferedReader(file_reader); @@ -534,10 +579,10 @@ public class ExternalProgram final String comment_line = reader.readLine(); if(comment_line == null || comment_line.length() == 0) - return setFileNumber(directory, guessNumber(directory)); + return setFileNumber(directory, guessNumber(directory), node); if(!comment_line.startsWith("#")) - return setFileNumber(directory, guessNumber(directory)); + return setFileNumber(directory, guessNumber(directory), node); final String number_line = reader.readLine(); @@ -547,7 +592,7 @@ public class ExternalProgram } catch(NumberFormatException e) { - return setFileNumber(directory, guessNumber(directory)); + return setFileNumber(directory, guessNumber(directory), node); } finally { @@ -558,11 +603,11 @@ public class ExternalProgram catch(FileNotFoundException e) { // create a new file_number_counter file - return setFileNumber(directory, guessNumber(directory)); + return setFileNumber(directory, guessNumber(directory), node); } catch(IOException e) { - return setFileNumber(directory, guessNumber(directory)); + return setFileNumber(directory, guessNumber(directory), node); } } @@ -571,22 +616,37 @@ public class ExternalProgram * (eg. directory + "/blastp/" + new_file_number). **/ protected long setFileNumber(final File directory, - final long new_file_number) + final long new_file_number, final RemoteFileNode node) throws IOException { makeDirectory(new File(directory, getName())); - final FileWriter file_writer = - new FileWriter(new File(directory, File.separatorChar + - getName() + File.separatorChar + - file_counter_filename)); + File local_file = new File(directory, File.separatorChar + + getName() + File.separatorChar + + file_counter_filename); + final FileWriter file_writer = new FileWriter(local_file); final PrintWriter print_writer = new PrintWriter(file_writer); print_writer.println("# the file is machine generated - do not edit"); print_writer.println(new_file_number); print_writer.close(); file_writer.close(); + + if(node != null) + { + String dir = node.getRootDir()+ File.separatorChar + + node.getFullName(); + int index = dir.lastIndexOf(File.separatorChar); + dir = dir.substring(0,index) + File.separatorChar + + getName() + File.separatorChar; + + if(System.getProperty("debug") != null) + System.out.println("setFileNumber() "+ + local_file.getCanonicalPath()+" --> "+dir); + + node.put(dir, local_file, null, true); + } return new_file_number; } diff --git a/uk/ac/sanger/artemis/components/filetree/FileList.java b/uk/ac/sanger/artemis/components/filetree/FileList.java index bf6801c8ac8d6c7b29f062f80cf54aa3fcb69e10..c9cc8092b6fa71bd8e0a3b281a680b04793c1b1b 100644 --- a/uk/ac/sanger/artemis/components/filetree/FileList.java +++ b/uk/ac/sanger/artemis/components/filetree/FileList.java @@ -108,9 +108,10 @@ public class FileList * Put a file * */ - protected boolean put(String dir, File local_file, FTProgress monitor) + protected boolean put(String dir, File local_file, + FTProgress monitor, boolean force) { - return ssh_client.put(dir, local_file, monitor); + return ssh_client.put(dir, local_file, monitor, force); } diff --git a/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java b/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java index 7dcdfff78ebb9bc6f9baad2b6446adad58222072..1786af799faf3beb2a41a82eb48810b317e34e4c 100644 --- a/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java +++ b/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java @@ -197,7 +197,7 @@ public class RemoteFileNode extends DefaultMutableTreeNode return flist.delete(getRootDir()+"/"+getFullName()); } - protected boolean mkdir(String dir) + public boolean mkdir(String dir) { FileList flist = new FileList(); return flist.mkdir(dir); @@ -211,7 +211,6 @@ public class RemoteFileNode extends DefaultMutableTreeNode public boolean put(File local_file, FTProgress monitor) { - FileList flist = new FileList(); String dir; if(!isDirectory()) { @@ -222,9 +221,15 @@ public class RemoteFileNode extends DefaultMutableTreeNode else dir = getRootDir()+"/"+getFullName(); - return flist.put(dir, local_file, monitor); + return put(dir, local_file, monitor, false); } + public boolean put(String dir, File local_file, + FTProgress monitor, boolean force) + { + FileList flist = new FileList(); + return flist.put(dir, local_file, monitor, force); + } public byte[] getFileContents(FTProgress monitor) { @@ -232,6 +237,12 @@ public class RemoteFileNode extends DefaultMutableTreeNode return flist.getFileContents(getRootDir()+"/"+getFullName(), monitor); } + public byte[] getFileContents(FTProgress monitor, String filename) + { + FileList flist = new FileList(); + return flist.getFileContents(filename, monitor); + } + // Transferable public DataFlavor[] getTransferDataFlavors() { diff --git a/uk/ac/sanger/artemis/j2ssh/SshFileManager.java b/uk/ac/sanger/artemis/j2ssh/SshFileManager.java index c45aeeafbe7689adb05c1bd9b2abc015a2c1c5ff..dffd4b82ab18c2b96f9a959fd752fe083e90d07b 100644 --- a/uk/ac/sanger/artemis/j2ssh/SshFileManager.java +++ b/uk/ac/sanger/artemis/j2ssh/SshFileManager.java @@ -251,7 +251,7 @@ public class SshFileManager * */ public boolean put(final String dir, final File local_file, - final FTProgress monitor) + final FTProgress monitor, final boolean force) { SftpClient sftp = null; @@ -268,7 +268,7 @@ public class SshFileManager JOptionPane.ERROR_MESSAGE); return false; } - else + else if(!force) { int n = JOptionPane.showConfirmDialog(null, "Overwrite\n"+ @@ -352,10 +352,15 @@ public class SshFileManager // sftp.quit(); return os.toByteArray(); } + catch(SshException se) + { + rescue(); + return getFileContents(file, monitor); + } catch(IOException ioe) { rescue(); - ioe.printStackTrace(); +// ioe.printStackTrace(); return null; } } diff --git a/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java b/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java index ca143bfb40a2c367bcc03d4164ae304cde1829f8..ab9df32a9e48061a9ac2ac264527bff1c8c05362 100644 --- a/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java +++ b/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java @@ -113,6 +113,9 @@ public class SshPSUClient extends Thread if(ssh == null) return; + if(System.getProperty("debug") != null) + System.out.println("RUN "+program); + completed = runBlastOrFasta(ssh, program); // Quit @@ -256,7 +259,7 @@ public class SshPSUClient extends Thread return false; } - SftpClient sftp = ssh.openSftpClient(); + SftpClient sftp = getSftpClient(); // loop over sequence files in the listfile Vector seqfile = readListFile(listfilepath); @@ -287,7 +290,7 @@ public class SshPSUClient extends Thread String outputfile = wdir+filename+".out"; final String actualCMD; - + if( (cmd.indexOf("fasta33") > -1) || (cmd.indexOf("fastx33") > -1) ) { @@ -352,6 +355,24 @@ public class SshPSUClient extends Thread return true; } + /** + * + * Return an active SftpClient object + * + */ + private SftpClient getSftpClient() + throws IOException + { + SftpClient sftp; + try + { + sftp = ssh.getActiveSftpClient(); + return sftp; + } + catch(IOException ioe){} + return ssh.openSftpClient(); + } + /** * * Thread to handle stdout/stderr reading without blocking.