JAL-3851 Some streamlining of caching/removing from cache. 'Highlighting' in InputAli...
[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 AlignFrame for '"
73               + getRequestUrl(request) + "'");
74       return;
75     }
76     for (int i = 0; i < alignFrames.length; i++)
77     {
78       AlignFrame af = alignFrames[i];
79       List<AlignmentViewPanel> aps = (List<AlignmentViewPanel>) af
80               .getAlignPanels();
81       for (AlignmentViewPanel ap : aps)
82       {
83         StructureSelectionManager ssm = ap.getStructureSelectionManager();
84         AlignmentI al = ap.getAlignment();
85         List<SequenceI> seqs = (List<SequenceI>) al.getSequences();
86         if (0 <= sequenceNum && sequenceNum < seqs.size())
87         {
88           try
89           {
90             SequenceI seqN = seqs.get(sequenceNum);
91             Console.debug("Found sequence " + seqN.getName() + ":"
92                     + seqN.getDisplayId(false));
93             ssmMap.put(seqN, ssm);
94           } catch (IndexOutOfBoundsException e)
95           {
96             Console.debug("Sequence index number too large: " + sequenceNum,
97                     e);
98           }
99         }
100         else
101         {
102           // search for sequence names
103           for (SequenceI seq : seqs)
104           {
105             if (sequenceNames.equals(seq.getName()))
106             {
107               ssmMap.put(seq, ssm);
108               Console.debug("Found sequence '" + seq.getName());
109             }
110           }
111         }
112       }
113     }
114     // highlight
115     for (SequenceI seq : ssmMap.keySet())
116     {
117       StructureSelectionManager ssm = ssmMap.get(seq);
118       if (ssm == null)
119       {
120         continue;
121       }
122       Console.debug("Highlighting sequence '" + seq.getName()
123               + "' at position " + pos);
124       ssm.mouseOverSequence(seq, pos, -1, null, true);
125     }
126
127   }
128 }