JAL-2422 Added linux rpm and deb install locations. Changed macOS to also look for...
authorBen Soares <b.soares@dundee.ac.uk>
Mon, 13 Sep 2021 15:46:31 +0000 (16:46 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Mon, 13 Sep 2021 15:46:31 +0000 (16:46 +0100)
src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java

index 5cf8a73..9078d12 100644 (file)
@@ -69,13 +69,13 @@ public class StructureManager
    * 0.93 is ChimeraX latest, 1.0 expected soon
    */
   private static String[] CHIMERA_VERSIONS = new String[] { "1.16.2",
-      "1.16.1", "1.16",
-      "1.15.2", "1.15.1", "1.15", "1.14.2", "1.14.1", "1.14",
-      "1.13.1", "1.13", "1.12.2", "1.12.1", "1.12", "1.11.2",
+      "1.16.1", "1.16", "1.15.2", "1.15.1", "1.15", "1.14.2", "1.14.1",
+      "1.14", "1.13.1", "1.13", "1.12.2", "1.12.1", "1.12", "1.11.2",
       "1.11.2", "1.11.1", "1.11" };
 
-  private static String[] CHIMERAX_VERSIONS = new String[] { "1.0", "0.93",
-      "0.92", "0.91", "0.9" };
+  // Missing 1.1 as this has known bug see JAL-2422
+  private static String[] CHIMERAX_VERSIONS = new String[] { "1.2.5", "1.0",
+      "0.93", "0.92", "0.91", "0.9" };
 
   static final String[] defaultStructureKeys = { "Structure", "pdb",
       "pdbFileName", "PDB ID", "structure", "biopax.xref.PDB", "pdb_ids",
@@ -561,8 +561,8 @@ public class StructureManager
 
   /**
    * This is called by the selectionListener to let us know that the user has
-   * changed their selection in Chimera. We need to go back to Chimera to find
-   * out what is currently selected and update our list.
+   * changed their selection in Chimera. We need to go back to Chimera to find out
+   * what is currently selected and update our list.
    */
   public void chimeraSelectionChanged()
   {
@@ -677,11 +677,11 @@ public class StructureManager
   }
 
   /**
-   * Add a selection to the selection list. This is called primarily by the
-   * Model Navigator Dialog to keep the selections in sync
+   * Add a selection to the selection list. This is called primarily by the Model
+   * Navigator Dialog to keep the selections in sync
    * 
    * @param selectionToAdd
-   *          the selection to add to our list
+   *                         the selection to add to our list
    */
   public void addChimSelection(ChimeraStructuralObject selectionToAdd)
   {
@@ -698,7 +698,7 @@ public class StructureManager
    * Model Navigator Dialog to keep the selections in sync
    * 
    * @param selectionToRemove
-   *          the selection to remove from our list
+   *                            the selection to remove from our list
    */
   public void removeChimSelection(ChimeraStructuralObject selectionToRemove)
   {
@@ -936,16 +936,10 @@ public class StructureManager
     // }
     // }
 
-    /*
-     * Jalview addition: check if path set in user preferences
-     */
+    String os = System.getProperty("os.name");
     String userPath = Cache
             .getDefault(isChimeraX ? Preferences.CHIMERAX_PATH
                     : Preferences.CHIMERA_PATH, null);
-    if (userPath != null)
-    {
-      pathList.add(userPath);
-    }
 
     /*
      * paths are based on getChimeraPaths() in
@@ -957,15 +951,61 @@ public class StructureManager
     String chimera = isChimeraX ? "ChimeraX" : "Chimera";
     String chimeraExe = isChimeraX ? "ChimeraX" : "chimera";
 
+    /*
+     * Jalview addition: check if path set in user preferences
+     */
+    if (userPath != null)
+    {
+      // in macos, deal with the user selecting the .app folder
+      boolean adjusted = false;
+      if (os.startsWith("Mac") && userPath.endsWith((".app")))
+      {
+        String possiblePath = String.format("%s/Contents/MacOS/%s",
+                userPath, chimeraExe);
+        if (new File(possiblePath).exists())
+        {
+          pathList.add(possiblePath);
+          adjusted = true;
+        }
+      }
+      if (!adjusted)
+      {
+        pathList.add(userPath);
+      }
+    }
+
     // Add default installation paths
-    String os = System.getProperty("os.name");
     if (os.startsWith("Linux"))
     {
-      // todo should this be /chimeraX/ for ChimeraX? not in structureVizX code
-      pathList.add("/usr/local/chimera/bin/" + chimeraExe);
-      pathList.add("/usr/local/bin/" + chimeraExe);
-      pathList.add("/usr/bin/" + chimeraExe);
-      pathList.add(System.getProperty("user.home") + "/opt/bin/" + chimeraExe);
+      // ChimeraX .deb and .rpm packages put symbolic link from /usr/bin/chimerax
+      pathList.add(String.format("/usr/bin/%s", chimeraExe.toLowerCase()));
+      pathList.add(String.format("/usr/bin/%s", chimeraExe));
+
+      pathList.add(
+              String.format("/usr/local/bin/%s", chimeraExe.toLowerCase()));
+      pathList.add(String.format("/usr/local/bin/%s", chimeraExe));
+
+      // these paths also used by .deb and .rpm
+      pathList.add(String.format("/usr/lib/ucsf-%s/bin/%s",
+              chimera.toLowerCase(), chimeraExe));
+      pathList.add(String.format("/usr/libexec/UCSF-%s/bin/%s", chimera,
+              chimeraExe));
+
+      pathList.add(String.format("/usr/local/chimera/bin/%s", chimeraExe));
+
+      // user home paths
+      pathList.add(String.format("%s/bin/%s",
+              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+      pathList.add(String.format("%s/bin/%s",
+              System.getProperty("user.home"), chimeraExe));
+      pathList.add(String.format("%s/opt/bin/%s",
+              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+      pathList.add(String.format("%s/opt/bin/%s",
+              System.getProperty("user.home"), chimeraExe));
+      pathList.add(String.format("%s/local/bin/%s",
+              System.getProperty("user.home"), chimeraExe.toLowerCase()));
+      pathList.add(String.format("%s/local/bin/%s",
+              System.getProperty("user.home"), chimeraExe));
     }
     else if (os.startsWith("Windows"))
     {
@@ -983,10 +1023,24 @@ public class StructureManager
           pathList.add(path);
           pathList.add(path + ".exe");
         }
+        // try without a version number too
+        String path = String.format("%s\\%s\\bin\\%s", root, chimera,
+                chimeraExe);
+        pathList.add(path);
+        pathList.add(path + ".exe");
       }
     }
     else if (os.startsWith("Mac"))
     {
+      // check for installations with version numbers first
+      String[] candidates = isChimeraX ? CHIMERAX_VERSIONS
+              : CHIMERA_VERSIONS;
+      for (String version : candidates)
+      {
+        pathList.add(
+                String.format("/Applications/%s-%s.app/Contents/MacOS/%s",
+                        chimera, version, chimeraExe));
+      }
       pathList.add(String.format("/Applications/%s.app/Contents/MacOS/%s",
               chimera, chimeraExe));
     }