JAL-1677 check all response lines when parsing REST server port
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 2 Jul 2015 14:27:03 +0000 (15:27 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 2 Jul 2015 14:27:03 +0000 (15:27 +0100)
src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java

index b66778c..7cc72cf 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.
  */
@@ -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,20 +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 + ": "
+      logger.error("Failed to get REST port number from " + responses
+              + ": "
               + e.getMessage());
     } finally
     {
@@ -630,6 +641,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;
   }