JAL-2668 add tests for HMMER commands, annotation and io
[jalview.git] / src / jalview / gui / Preferences.java
index 7a231bc..c8fef96 100755 (executable)
@@ -22,8 +22,14 @@ package jalview.gui;
 
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.bin.Cache;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.HiddenMarkovModel;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
 import jalview.gui.Help.HelpId;
 import jalview.gui.StructureViewer.ViewerType;
+import jalview.hmmer.HMMBuildThread;
 import jalview.io.FileFormatI;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -50,7 +56,6 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.io.File;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
@@ -692,11 +697,6 @@ public class Preferences extends GPreferences
     {
       frame.updateHMMERStatus(hmmerStatus);
     }
-    if (hmmerStatus)
-    {
-      // String ver = getHMMERVersion();
-      Cache.setProperty("HMMER_VERSION", "3.1b2");
-    }
     
     
     trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
@@ -1193,10 +1193,10 @@ public class Preferences extends GPreferences
   {
     int missing = 0;
     String message = "";
-    String path = hmmerPath.getText().trim();
-    if (path.length() > 0)
+    String folder = hmmerPath.getText().trim();
+    if (folder.length() > 0)
     {
-      File f = new File(path);
+      File f = new File(folder);
       if (!f.exists())
       {
         if (showDialog)
@@ -1208,35 +1208,43 @@ public class Preferences extends GPreferences
         }
         return false;
       }
-
-      File hmmbuild = new File(path + "/binaries/hmmbuild");
-      {
-        if (!hmmbuild.canExecute())
+      AlignmentI alignment = new Alignment(
+              new SequenceI[]
+      { new Sequence("test", "WLWL", 0, 3) });
+      if (canExecute(folder + "/hmmbuild"))
         {
-          message += MessageManager.getString("label.hmmbuild_not_found")
-                  + "\n";
-          missing++;
+        validateHMMBuild(alignment);
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmbuild_not_found")
+                + "\n";
+        missing++;
       }
 
-      File hmmalign = new File(path + "/binaries/hmmalign");
-      {
-        if (!hmmalign.canExecute())
+
+      if (canExecute(folder + "/hmmalign"))
         {
-          message += MessageManager.getString("label.hmmalign_not_found")
-                  + "\n";
-          missing++;
+
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmalign_not_found")
+                + "\n";
+        missing++;
       }
 
-      File hmmsearch = new File(path + "/binaries/hmmsearch");
-      {
-        if (!hmmsearch.canExecute())
+
+      if (canExecute(folder + "/hmmsearch"))
         {
-          message += MessageManager.getString("label.hmmsearch_not_found")
-                  + "\n";
-          missing++;
+
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmsearch_not_found")
+                + "\n";
+        missing++;
+      }
       }
 
       if (missing > 0)
@@ -1265,28 +1273,78 @@ public class Preferences extends GPreferences
         }
       }
 
+    return true;
+  }
+
+  /**
+   * Checks if a file can be executed
+   * 
+   * @param path
+   *          the path to the file
+   * @return
+   */
+  public boolean canExecute(String path)
+  {
+    File file = new File(path);
+    if (!file.canExecute())
+    {
+      file = new File(path + ".exe");
+      {
+        if (!file.canExecute())
+        {
+          return false;
+        }
+      }
     }
     return true;
   }
 
-  private String getHMMERVersion()
+  /**
+   * Runs hmmbuild to check if it is working. While doing this it parses the
+   * version of HMMER.
+   * 
+   * @param frame
+   * @return
+   */
+  public boolean validateHMMBuild(AlignmentI alignment)
   {
-    File file = new File(hmmerPath.getText() + "/release-notes");
-    Scanner scanner = null;
-    try
+    HMMBuildThread hmmbuild = new HMMBuildThread(alignment);
+    hmmbuild.hmmbuildWaitTillComplete();
+    SequenceI hmmSeq = alignment.getSequenceAt(1);
+    HiddenMarkovModel hmm;
+    if (hmmSeq.isHMMConsensusSequence() && hmmSeq.getHMM() != null)
+    {
+      hmm = hmmSeq.getHMM();
+
+      if (hmm.getNumberOfSymbols() < 1)
+      {
+        return false;
+      }
+    }
+    else
     {
-      scanner = new Scanner(file);
-    } catch (IOException e)
+      return false;
+    }
+
+    String header = hmm.getFileHeader();
+    if (header == null)
     {
-      e.printStackTrace();
-      return null;
+      return false;
     }
-    scanner.next();
-    String res = scanner.next();
-    scanner.close();
-    return res;
+    else
+    {
+      Scanner scanner = new Scanner(header);
+      scanner.next();
+      String string = scanner.next();
+      String version = string.substring(1);
+      Cache.setProperty("HMMER_VERSION", version);
+      scanner.close();
+
+    }
+    return true;
   }
 
+
   private boolean validateHMMERPath()
   {
     return validateHMMERPath(true);