144995a3d405a2b0f93b64ccd71cab6d7b49dc2c
[jalview.git] / src / jalview / rest / HighlightSequenceEndpoint.java
1 package jalview.rest;
2
3 import java.util.HashMap;
4 import java.util.List;
5 import java.util.Map;
6
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletResponse;
9
10 import jalview.api.AlignmentViewPanel;
11 import jalview.bin.Console;
12 import jalview.datamodel.AlignmentI;
13 import jalview.datamodel.SequenceI;
14 import jalview.gui.AlignFrame;
15 import jalview.structure.StructureSelectionManager;
16
17 public class HighlightSequenceEndpoint extends AbstractEndpoint
18 {
19   public HighlightSequenceEndpoint(API api)
20   {
21     super(api, path, name, parameters, description);
22   }
23
24   protected static final String path = "highlightsequence";
25
26   private static final String name = "Highlight sequence position";
27
28   private static final String parameters = "<sequence names>/<position>";
29
30   private static final String description = "Highlight the specified sequences at the specified position";
31
32   public void processEndpoint(HttpServletRequest request,
33           HttpServletResponse response)
34   {
35     if (!checkParameters(request, response, 2))
36     {
37       return;
38     }
39     String[] parameters = getEndpointPathParameters(request);
40
41     String posString = parameters[1];
42     int pos = -1;
43     try
44     {
45       pos = Integer.parseInt(posString);
46     } catch (NumberFormatException e)
47     {
48       returnError(request, response,
49               "Could not parse postition integer " + posString);
50     }
51
52     String sequenceNames = parameters[0] == null ? "*0" : parameters[0];
53     Console.debug("Looking for sequence '" + sequenceNames + "'");
54
55     int sequenceNum = -1;
56     if (sequenceNames.startsWith("*"))
57     {
58       try
59       {
60         sequenceNum = Integer.parseInt(sequenceNames.substring(1));
61       } catch (NumberFormatException e)
62       {
63         Console.debug("Could not parse sequence number '" + sequenceNames
64                 + "'. Will use as identifier.", e);
65       }
66     }
67
68     Map<SequenceI, StructureSelectionManager> ssmMap = new HashMap<>();
69     AlignFrame[] alignFrames = getAlignFrames(request, true);
70     if (alignFrames == null)
71     {
72       returnError(request, response, "could not find results");
73       return;
74     }
75     for (int i = 0; i < alignFrames.length; i++)
76     {
77       AlignFrame af = alignFrames[i];
78       List<AlignmentViewPanel> aps = (List<AlignmentViewPanel>) af
79               .getAlignPanels();
80       for (AlignmentViewPanel ap : aps)
81       {
82         StructureSelectionManager ssm = ap.getStructureSelectionManager();
83         AlignmentI al = ap.getAlignment();
84         List<SequenceI> seqs = (List<SequenceI>) al.getSequences();
85         if (0 <= sequenceNum && sequenceNum < seqs.size())
86         {
87           try
88           {
89             SequenceI seqN = seqs.get(sequenceNum);
90             ssmMap.put(seqN, ssm);
91           } catch (IndexOutOfBoundsException e)
92           {
93             Console.debug("Sequence index number too large: " + sequenceNum,
94                     e);
95           }
96         }
97         else
98         {
99           // search for sequence names
100           for (SequenceI seq : seqs)
101           {
102             if (sequenceNames.equals(seq.getName()))
103             {
104               ssmMap.put(seq, ssm);
105               Console.debug("Found sequence '" + seq.getName());
106             }
107           }
108         }
109       }
110     }
111     // highlight
112     for (SequenceI seq : ssmMap.keySet())
113     {
114       StructureSelectionManager ssm = ssmMap.get(seq);
115       if (ssm == null)
116       {
117         continue;
118       }
119       Console.debug("Highlighting sequence '" + seq.getName()
120               + "' at position " + pos);
121       ssm.mouseOverSequence(seq, pos, -1, null);
122     }
123
124   }
125 }