Merge branch 'develop' into features/JAL-1705_ensembl
[jalview.git] / src / ext / edu / ucsf / rbvi / strucviz2 / ChimeraManager.java
index b66778c..2de2829 100644 (file)
@@ -1,5 +1,7 @@
 package ext.edu.ucsf.rbvi.strucviz2;
 
+import jalview.ws.HttpClientUtils;
+
 import java.awt.Color;
 import java.io.BufferedReader;
 import java.io.File;
@@ -20,8 +22,6 @@ import org.slf4j.LoggerFactory;
 import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType;
 import ext.edu.ucsf.rbvi.strucviz2.port.ListenerThreads;
 
-import jalview.ws.HttpClientUtils;
-
 /**
  * This object maintains the Chimera communication information.
  */
@@ -302,13 +302,12 @@ public class ChimeraManager
     // TODO: [Optional] Convert path to name in a better way
     if (modelPath.lastIndexOf(File.separator) > 0)
     {
-      modelName = modelPath.substring(modelPath
-              .lastIndexOf(File.separator) + 1);
+      modelName = modelPath
+              .substring(modelPath.lastIndexOf(File.separator) + 1);
     }
     else if (modelPath.lastIndexOf("/") > 0)
     {
-      modelName = modelPath
-              .substring(modelPath.lastIndexOf("/") + 1);
+      modelName = modelPath.substring(modelPath.lastIndexOf("/") + 1);
     }
     return modelName;
   }
@@ -355,7 +354,8 @@ public class ChimeraManager
   public void startListening(String uri)
   {
     sendChimeraCommand("listen start models url " + uri
-    + ";listen start select prefix SelectionChanged url " + uri, false);
+            + ";listen start select prefix SelectionChanged url " + uri,
+            false);
   }
 
   /**
@@ -379,7 +379,7 @@ public class ChimeraManager
   {
     chimera = null;
     currentModelsMap.clear();
-      this.chimeraRestPort = 0;
+    this.chimeraRestPort = 0;
     structureManager.clearOnChimeraExit();
   }
 
@@ -554,8 +554,8 @@ public class ChimeraManager
     for (String chimeraPath : chimeraPaths)
     {
       File path = new File(chimeraPath);
-      // enable the next line to simulate Chimera not installed
-      // File path = new File(chimeraPath + "x");
+      // uncomment the next line to simulate Chimera not installed
+      // path = new File(chimeraPath + "x");
       if (!path.canExecute())
       {
         error += "File '" + path + "' does not exist.\n";
@@ -565,6 +565,8 @@ public class ChimeraManager
       {
         List<String> args = new ArrayList<String>();
         args.add(chimeraPath);
+        // shows Chimera output window but suppresses REST responses:
+        // args.add("--debug");
         args.add("--start");
         args.add("RESTServer");
         ProcessBuilder pb = new ProcessBuilder(args);
@@ -589,7 +591,7 @@ public class ChimeraManager
       // TODO: [Optional] Check Chimera version and show a warning if below 1.8
       // Ask Chimera to give us updates
       // startListening(); // later - see ChimeraListener
-      return true;
+      return (chimeraRestPort > 0);
     }
 
     // Tell the user that Chimera could not be started because of an error
@@ -606,21 +608,29 @@ public class ChimeraManager
     InputStream readChan = chimera.getInputStream();
     BufferedReader lineReader = new BufferedReader(new InputStreamReader(
             readChan));
-    String response = null;
+    StringBuilder responses = new StringBuilder();
     try
     {
-      // expect: REST server on host 127.0.0.1 port port_number
-      response = lineReader.readLine();
-      String [] tokens = response.split(" ");
-      if (tokens.length == 7 && "port".equals(tokens[5])) {
-        port = Integer.parseInt(tokens[6]);
-        logger.info("Chimera REST service listening on port "
-                + chimeraRestPort);
+      String response = lineReader.readLine();
+      while (response != null)
+      {
+        responses.append("\n" + response);
+        // expect: REST server on host 127.0.0.1 port port_number
+        if (response.startsWith("REST server"))
+        {
+          String[] tokens = response.split(" ");
+          if (tokens.length == 7 && "port".equals(tokens[5]))
+          {
+            port = Integer.parseInt(tokens[6]);
+            break;
+          }
+        }
+        response = lineReader.readLine();
       }
     } catch (Exception e)
     {
-      logger.error("Failed to get REST port number from " + response + ": "
-              + e.getMessage());
+      logger.error("Failed to get REST port number from " + responses
+              + ": " + e.getMessage());
     } finally
     {
       try
@@ -630,6 +640,13 @@ public class ChimeraManager
       {
       }
     }
+    if (port == 0)
+    {
+      System.err
+              .println("Failed to start Chimera with REST service, response was: "
+                      + responses);
+    }
+    logger.info("Chimera REST service listening on port " + chimeraRestPort);
     return port;
   }
 
@@ -758,7 +775,7 @@ public class ChimeraManager
    */
   public List<String> sendChimeraCommand(String command, boolean reply)
   {
-//    System.out.println("chimeradebug>> " + command);
+    // System.out.println("chimeradebug>> " + command);
     if (!isChimeraLaunched() || command == null
             || "".equals(command.trim()))
     {
@@ -809,16 +826,18 @@ public class ChimeraManager
 
     List<String> reply = new ArrayList<String>();
     BufferedReader response = null;
-    try {
+    try
+    {
       response = HttpClientUtils
               .doHttpUrlPost(restUrl, commands, 100, 5000);
       String line = "";
-      while ((line = response.readLine()) != null) {
+      while ((line = response.readLine()) != null)
+      {
         reply.add(line);
       }
     } catch (Exception e)
     {
-      logger.error("REST call " + command + " failed: " + e.getMessage());
+      logger.error("REST call '" + command + "' failed: " + e.getMessage());
     } finally
     {
       if (response != null)