Merge branch 'develop' into feature/JAL-3390hideUnmappedStructure
[jalview.git] / src / ext / edu / ucsf / rbvi / strucviz2 / ChimeraManager.java
index 31f5dc8..56f2340 100644 (file)
@@ -333,10 +333,7 @@ public class ChimeraManager
 
   public void stopListening()
   {
-    // TODO send this command when viewer connection is closed in Jalview
-    String command = isChimeraX
-            ? "info notify stop models jalview; info notify stop selection jalview"
-            : "listen stop models ; listen stop selection ";
+    String command = "listen stop models ; listen stop selection ";
     sendChimeraCommand(command, false);
   }
 
@@ -350,19 +347,13 @@ public class ChimeraManager
     /*
      * listen for model changes
      */
-    String command = isChimeraX
-            ? ("info notify start models prefix ModelChanged jalview url "
-                    + uri)
-            : ("listen start models url " + uri);
+    String command = "listen start models url " + uri;
     sendChimeraCommand(command, false);
 
     /*
      * listen for selection changes
      */
-    command = isChimeraX
-            ? ("info notify start selection jalview prefix SelectionChanged url "
-                    + uri)
-            : ("listen start select prefix SelectionChanged url " + uri);
+    command = "listen start select prefix SelectionChanged url " + uri;
     sendChimeraCommand(command, false);
   }
 
@@ -438,10 +429,7 @@ public class ChimeraManager
   {
     List<String> selectedResidues = new ArrayList<>();
 
-    // in fact 'listinfo' (undocumented) works in ChimeraX
-    String command = (isChimeraX
-            ? "info"
-            : "list") + " selection level residue";
+    String command = "list selection level residue";
     List<String> chimeraReply = sendChimeraCommand(command, true);
     if (chimeraReply != null)
     {
@@ -498,7 +486,7 @@ public class ChimeraManager
   {
     List<ChimeraModel> modelList = new ArrayList<>();
     String command = "list models type "
-            + (isChimeraX ? "AtomicStructure" : "molecule");
+            + (isChimeraX() ? "AtomicStructure" : "molecule");
     List<String> list = sendChimeraCommand(command, true);
     if (list != null)
     {
@@ -586,7 +574,6 @@ public class ChimeraManager
       {
         // ensure symbolic links are resolved
         chimeraPath = Paths.get(chimeraPath).toRealPath().toString();
-        isChimeraX = chimeraPath.toLowerCase().contains("chimerax");
         File path = new File(chimeraPath);
         // uncomment the next line to simulate Chimera not installed
         // path = new File(chimeraPath + "x");
@@ -599,16 +586,7 @@ public class ChimeraManager
         args.add(chimeraPath);
         // shows Chimera output window but suppresses REST responses:
         // args.add("--debug");
-        if (isChimeraX())
-        {
-          args.add("--cmd");
-          args.add("remote rest start");
-        }
-        else
-        {
-          args.add("--start");
-          args.add("RESTServer");
-        }
+        addLaunchArguments(args);
         ProcessBuilder pb = new ProcessBuilder(args);
         chimera = pb.start();
         error = "";
@@ -640,6 +618,18 @@ public class ChimeraManager
   }
 
   /**
+   * Adds command-line arguments to start the REST server
+   * <p>
+   * Method extracted for Jalview to allow override in ChimeraXManager
+   * @param args
+   */
+  protected void addLaunchArguments(List<String> args)
+  {
+    args.add("--start");
+    args.add("RESTServer");
+  }
+
+  /**
    * Read and return the port number returned in the reply to --start RESTServer
    */
   private int getPortNumber()
@@ -751,7 +741,7 @@ public class ChimeraManager
   public List<String> getAttrList()
   {
     List<String> attributes = new ArrayList<>();
-    String command = (isChimeraX ? "info " : "list ") + "resattr";
+    String command = (isChimeraX() ? "info " : "list ") + "resattr";
     final List<String> reply = sendChimeraCommand(command, true);
     if (reply != null)
     {
@@ -811,20 +801,18 @@ public class ChimeraManager
 
   private volatile boolean busy = false;
 
-  private boolean isChimeraX;
-
   /**
    * Send a command to Chimera.
    * 
    * @param command
    *          Command string to be send.
-   * @param reply
+   * @param getReply
    *          Flag indicating whether the method should return the reply from
    *          Chimera or not.
    * @return List of Strings corresponding to the lines in the Chimera reply or
    *         <code>null</code>.
    */
-  public List<String> sendChimeraCommand(String command, boolean reply)
+  public List<String> sendChimeraCommand(String command, boolean getReply)
   {
     System.out.println("chimeradebug>> " + command);
     if (!isChimeraLaunched() || command == null
@@ -846,7 +834,7 @@ public class ChimeraManager
     long startTime = System.currentTimeMillis();
     try
     {
-      return sendRestCommand(command);
+      return sendRestCommand(command, getReply);
     } finally
     {
       /*
@@ -867,13 +855,14 @@ public class ChimeraManager
    * Sends the command to Chimera's REST API, and returns any response lines.
    * 
    * @param command
+   * @param getReply 
    * @return
    */
-  protected List<String> sendRestCommand(String command)
+  protected List<String> sendRestCommand(String command, boolean getReply)
   {
     String restUrl = "http://127.0.0.1:" + this.chimeraRestPort + "/run";
     List<NameValuePair> commands = new ArrayList<>(1);
-    String method = isChimeraX() ? "GET" : "POST";
+    String method = getHttpRequestMethod();
     if ("GET".equals(method))
     {
       command = command.replace(" ", "+").replace("#", "%23")
@@ -890,6 +879,10 @@ public class ChimeraManager
                       CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS)
               : HttpClientUtils.doHttpUrlPost(restUrl, commands,
                       CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
+      if (!getReply)
+      {
+        return null;
+      }
       String line = "";
       while ((line = response.readLine()) != null)
       {
@@ -914,6 +907,15 @@ public class ChimeraManager
   }
 
   /**
+   * Returns "POST" as the HTTP request method to use for REST service calls to Chimera
+   * @return
+   */
+  protected String getHttpRequestMethod()
+  {
+    return "POST";
+  }
+
+  /**
    * Send a command to stdin of Chimera process, and optionally read any
    * responses.
    * 
@@ -964,11 +966,6 @@ public class ChimeraManager
 
   public boolean isChimeraX()
   {
-    return isChimeraX;
-  }
-
-  public void setChimeraX(boolean b)
-  {
-    isChimeraX = b;
+    return false;
   }
 }