JAL-3674 more finessed asynchronous structure commands
[jalview.git] / src / ext / edu / ucsf / rbvi / strucviz2 / ChimeraManager.java
index 375fa4a..d7e7937 100644 (file)
@@ -174,10 +174,11 @@ public class ChimeraManager
     return hasChimeraModel(modelNubmer, 0);
   }
 
-  public boolean hasChimeraModel(Integer modelNubmer, Integer subModelNumber)
+  public boolean hasChimeraModel(Integer modelNubmer,
+          Integer subModelNumber)
   {
-    return currentModelsMap.containsKey(ChimUtils.makeModelKey(modelNubmer,
-            subModelNumber));
+    return currentModelsMap.containsKey(
+            ChimUtils.makeModelKey(modelNubmer, subModelNumber));
   }
 
   public void addChimeraModel(Integer modelNumber, Integer subModelNumber,
@@ -187,7 +188,8 @@ public class ChimeraManager
             ChimUtils.makeModelKey(modelNumber, subModelNumber), model);
   }
 
-  public void removeChimeraModel(Integer modelNumber, Integer subModelNumber)
+  public void removeChimeraModel(Integer modelNumber,
+          Integer subModelNumber)
   {
     int modelKey = ChimUtils.makeModelKey(modelNumber, subModelNumber);
     if (currentModelsMap.containsKey(modelKey))
@@ -242,9 +244,8 @@ public class ChimeraManager
       if (!modelList.contains(newModel))
       {
         newModel.setModelName(modelName);
-        sendChimeraCommand(
-                "setattr M name " + modelName + " #"
-                        + newModel.getModelNumber(), false);
+        sendChimeraCommand("setattr M name " + modelName + " #"
+                + newModel.getModelNumber(), false);
         modelList.add(newModel);
       }
     }
@@ -314,8 +315,8 @@ public class ChimeraManager
     {
       sendChimeraCommand("close " + model.toSpec(), false);
       // currentModelNamesMap.remove(model.getModelName());
-      currentModelsMap.remove(ChimUtils.makeModelKey(
-              model.getModelNumber(), model.getSubModelNumber()));
+      currentModelsMap.remove(ChimUtils.makeModelKey(model.getModelNumber(),
+              model.getSubModelNumber()));
       // selectionList.remove(chimeraModel);
     }
     else
@@ -328,7 +329,8 @@ public class ChimeraManager
 
   public void startListening()
   {
-    sendChimeraCommand("listen start models; listen start selection", false);
+    sendChimeraCommand("listen start models; listen start selection",
+            false);
   }
 
   public void stopListening()
@@ -602,8 +604,8 @@ public class ChimeraManager
     if (error.length() == 0)
     {
       this.chimeraRestPort = getPortNumber();
-      System.out.println("Chimera REST API started on port "
-              + chimeraRestPort);
+      System.out.println(
+              "Chimera REST API started on port " + chimeraRestPort);
       // structureManager.initChimTable();
       structureManager.setChimeraPathProperty(workingPath);
       // TODO: [Optional] Check Chimera version and show a warning if below 1.8
@@ -621,6 +623,7 @@ 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)
@@ -636,8 +639,8 @@ public class ChimeraManager
   {
     int port = 0;
     InputStream readChan = chimera.getInputStream();
-    BufferedReader lineReader = new BufferedReader(new InputStreamReader(
-            readChan));
+    BufferedReader lineReader = new BufferedReader(
+            new InputStreamReader(readChan));
     StringBuilder responses = new StringBuilder();
     try
     {
@@ -667,8 +670,8 @@ public class ChimeraManager
       }
     } catch (Exception e)
     {
-      logger.error("Failed to get REST port number from " + responses
-              + ": " + e.getMessage());
+      logger.error("Failed to get REST port number from " + responses + ": "
+              + e.getMessage());
     } finally
     {
       try
@@ -680,11 +683,12 @@ public class ChimeraManager
     }
     if (port == 0)
     {
-      System.err
-              .println("Failed to start Chimera with REST service, response was: "
+      System.err.println(
+              "Failed to start Chimera with REST service, response was: "
                       + responses);
     }
-    logger.info("Chimera REST service listening on port " + chimeraRestPort);
+    logger.info(
+            "Chimera REST service listening on port " + chimeraRestPort);
     return port;
   }
 
@@ -770,8 +774,8 @@ public class ChimeraManager
         String[] lineParts = inputLine.split("\\s");
         if (lineParts.length == 5)
         {
-          ChimeraResidue residue = ChimUtils
-                  .getResidue(lineParts[2], model);
+          ChimeraResidue residue = ChimUtils.getResidue(lineParts[2],
+                  model);
           String value = lineParts[4];
           if (residue != null)
           {
@@ -814,7 +818,8 @@ public class ChimeraManager
    */
   public List<String> sendChimeraCommand(String command, boolean reply)
   {
-    if (debug) {
+    if (debug)
+    {
       System.out.println("chimeradebug>> " + command);
     }
     if (!isChimeraLaunched() || command == null
@@ -822,12 +827,18 @@ public class ChimeraManager
     {
       return null;
     }
-    // TODO do we need a maximum wait time before aborting?
-    while (busy)
+    /*
+     * set a maximum wait time before trying anyway
+     * to avoid hanging indefinitely
+     */
+    int waited = 0;
+    int pause = 25;
+    while (busy  && waited < 1001)
     {
       try
       {
-        Thread.sleep(25);
+        Thread.sleep(pause);
+        waited += pause;
       } catch (InterruptedException q)
       {
       }
@@ -849,7 +860,6 @@ public class ChimeraManager
                 + (System.currentTimeMillis() - startTime) + "ms: "
                 + command);
       }
-
     }
   }
 
@@ -904,7 +914,9 @@ public class ChimeraManager
   }
 
   /**
-   * Returns "POST" as the HTTP request method to use for REST service calls to Chimera
+   * Returns "POST" as the HTTP request method to use for REST service calls to
+   * Chimera
+   * 
    * @return
    */
   protected String getHttpRequestMethod()