*/
package ext.edu.ucsf.rbvi.strucviz2;
-import jalview.ws.HttpClientUtils;
-
import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
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.
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);
}
*/
public void startListening(String uri)
{
- String command = isChimeraX
- ? ("info notify start models prefix ModelChanged jalview url "
- + uri
- + "; info notify start selection jalview prefix SelectionChanged url "
- + uri)
- : ("listen start models url " + uri
- + ";listen start select prefix SelectionChanged url "
- + uri);
+ /*
+ * listen for model changes
+ */
+ String command = "listen start models url " + uri;
+ sendChimeraCommand(command, false);
+
+ /*
+ * listen for selection changes
+ */
+ command = "listen start select prefix SelectionChanged url " + uri;
sendChimeraCommand(command, false);
}
{
List<String> selectedResidues = new ArrayList<>();
- /*
- * skip for now if ChimeraX - times out
- */
- if (isChimeraX)
- {
- return selectedResidues;
- }
-
- // 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)
{
public List<ChimeraModel> getModelList()
{
List<ChimeraModel> modelList = new ArrayList<>();
- modelList.add(new ChimeraModel("4zhp", ModelType.PDB_MODEL, 1, 0));
- return modelList; // ChimeraX doesn't have 'list models' command
- // List<String> list = sendChimeraCommand("list models type molecule",
- // true);
- // if (list != null)
- // {
- // for (String modelLine : list)
- // {
- // ChimeraModel chimeraModel = new ChimeraModel(modelLine);
- // modelList.add(chimeraModel);
- // }
- // }
- // return modelList;
+ String command = "list models type "
+ + (isChimeraX() ? "AtomicStructure" : "molecule");
+ List<String> list = sendChimeraCommand(command, true);
+ if (list != null)
+ {
+ for (String modelLine : list)
+ {
+ try
+ {
+ ChimeraModel chimeraModel = new ChimeraModel(modelLine);
+ modelList.add(chimeraModel);
+ } catch (NullPointerException e)
+ {
+ // hack for now
+ }
+ }
+ }
+ return modelList;
}
/**
{
// 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");
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 = "";
}
/**
+ * 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()
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)
{
private volatile boolean busy = false;
- private boolean isChimeraX;
-
/**
* Send a command to Chimera.
*
{
String restUrl = "http://127.0.0.1:" + this.chimeraRestPort + "/run";
List<NameValuePair> commands = new ArrayList<>(1);
- String encoded = command.replace(" ", "+").replace("#", "%23")
- .replace("|", "%7C").replace(";", "%3B");
- commands.add(new BasicNameValuePair("command", encoded));
+ String method = getHttpRequestMethod();
+ if ("GET".equals(method))
+ {
+ command = command.replace(" ", "+").replace("#", "%23")
+ .replace("|", "%7C").replace(";", "%3B");
+ }
+ commands.add(new BasicNameValuePair("command", command));
List<String> reply = new ArrayList<>();
BufferedReader response = null;
try
{
- if (isChimeraX())
- {
- response = HttpClientUtils.doHttpGet(restUrl, commands,
- CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
- }
- else
- {
- response = HttpClientUtils.doHttpUrlPost(restUrl, commands,
- CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
- }
+ response = "GET".equals(method)
+ ? HttpClientUtils.doHttpGet(restUrl, commands,
+ CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS)
+ : HttpClientUtils.doHttpUrlPost(restUrl, commands,
+ CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
String line = "";
while ((line = response.readLine()) != null)
{
}
/**
+ * 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.
*
public boolean isChimeraX()
{
- return isChimeraX;
+ return false;
}
}