JAL-3285 fix incorrect file paths on HMMAlign/Search results
[jalview.git] / src / jalview / hmmer / HmmerCommand.java
index f8f2cde..20e0083 100644 (file)
@@ -24,6 +24,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
@@ -111,6 +112,12 @@ public abstract class HmmerCommand implements Runnable
     {
       ProcessBuilder pb = new ProcessBuilder(args);
       pb.redirectErrorStream(true); // merge syserr to sysout
+      if (Platform.isWindows())
+      {
+        String path = pb.environment().get("Path");
+        path = jalview.bin.Cache.getProperty("CYGWIN_PATH") + ";" + path;
+        pb.environment().put("Path", path);
+      }
       final Process p = pb.start();
       new Thread(new Runnable()
       {
@@ -167,6 +174,7 @@ public abstract class HmmerCommand implements Runnable
     }
 
     List<String> wrapped = new ArrayList<>();
+    // wrapped.add("C:\Users\tva\run");
     wrapped.add(bash.getAbsolutePath());
     wrapped.add("-c");
 
@@ -247,10 +255,14 @@ public abstract class HmmerCommand implements Runnable
    * @param cmd
    *          command short name e.g. hmmalign
    * @return
+   * @throws IOException
    */
   protected String getCommandPath(String cmd)
+          throws IOException
   {
     String binariesFolder = Cache.getProperty(Preferences.HMMER_PATH);
+    // ensure any symlink to the directory is resolved:
+    binariesFolder = Paths.get(binariesFolder).toRealPath().toString();
     File file = FileUtils.getExecutable(cmd, binariesFolder);
     if (file == null && af != null)
     {
@@ -258,7 +270,7 @@ public abstract class HmmerCommand implements Runnable
               .formatMessage("label.executable_not_found", cmd));
     }
 
-    return file == null ? null : getFilePath(file);
+    return file == null ? null : getFilePath(file, true);
   }
 
   /**
@@ -312,12 +324,15 @@ public abstract class HmmerCommand implements Runnable
    * X with /cygdrive/x.
    * 
    * @param resultFile
+   * @param isInCygwin
+   *                     True if file is to be read/written from within the Cygwin
+   *                     shell. Should be false for any imports.
    * @return
    */
-  protected String getFilePath(File resultFile)
+  protected String getFilePath(File resultFile, boolean isInCygwin)
   {
     String path = resultFile.getAbsolutePath();
-    if (Platform.isWindows())
+    if (Platform.isWindows() && isInCygwin)
     {
       // the first backslash escapes '\' for the regular expression argument
       path = path.replaceAll("\\" + File.separator, "/");