JAL-3851 Allow specifying a sequence index in highlight
authorBen Soares <b.soares@dundee.ac.uk>
Mon, 28 Mar 2022 12:12:26 +0000 (13:12 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Mon, 28 Mar 2022 12:12:26 +0000 (13:12 +0100)
src/jalview/rest/HighlightSequenceEndpoint.java
src/jalview/rest/RestHandler.java

index f228473..4e2b072 100644 (file)
@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import jalview.api.AlignmentViewPanel;
+import jalview.bin.Console;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
@@ -48,7 +49,21 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
               "Could not parse postition integer " + posString);
     }
 
-    String sequenceNames = parameters[0];
+    String sequenceNames = parameters[0] == null ? "#0" : parameters[0];
+    Console.debug("Looking for sequence '" + sequenceNames + "'");
+
+    int sequenceNum = -1;
+    if (sequenceNames.startsWith("*"))
+    {
+      try
+      {
+        sequenceNum = Integer.parseInt(sequenceNames.substring(1));
+      } catch (NumberFormatException e)
+      {
+        Console.debug("Could not parse sequence number '" + sequenceNames
+                + "'. Will use as identifier.", e);
+      }
+    }
 
     Map<SequenceI, StructureSelectionManager> ssmMap = new HashMap<>();
     AlignFrame[] alignFrames = getAlignFrames(request, true);
@@ -67,11 +82,28 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
         StructureSelectionManager ssm = ap.getStructureSelectionManager();
         AlignmentI al = ap.getAlignment();
         List<SequenceI> seqs = (List<SequenceI>) al.getSequences();
-        for (SequenceI seq : seqs)
+        if (sequenceNum >= 0)
+        {
+          try
+          {
+            SequenceI seqN = seqs.get(sequenceNum);
+            ssmMap.put(seqN, ssm);
+          } catch (IndexOutOfBoundsException e)
+          {
+            Console.debug("Sequence index number too large: " + sequenceNum,
+                    e);
+          }
+        }
+        else
         {
-          if (sequenceNames.equals(seq.getName()))
+          // search for sequence names
+          for (SequenceI seq : seqs)
           {
-            ssmMap.put(seq, ssm);
+            if (sequenceNames.equals(seq.getName()))
+            {
+              ssmMap.put(seq, ssm);
+              Console.debug("Found sequence '" + seq.getName());
+            }
           }
         }
       }
@@ -84,6 +116,8 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
       {
         continue;
       }
+      Console.debug("Highlighting sequence '" + seq.getName()
+              + "' at position " + pos);
       ssm.mouseOverSequence(seq, pos, -1, null);
     }
 
index 1575cff..c967d3e 100644 (file)
@@ -179,10 +179,13 @@ public class RestHandler extends AbstractRequestHandler
     }
 
     String endpointName = getRequestedEndpointName(request);
+    Console.debug(endpointName);
 
     if (!getEndpoints().containsKey(endpointName)
             || getEndpoints().get(endpointName) == null)
     {
+      Console.debug(
+              "RestHandler did not find endpoint '" + endpointName + "'");
 
       response.setHeader("Cache-Control", "no-cache/no-store");
       response.setHeader("Content-type", "text/plain");