JAL-3851 some changes. HighlightSequenceEndpoint and SelectSequenceEndpoint
[jalview.git] / src / jalview / rest / SelectSequencesEndpoint.java
1 package jalview.rest;
2
3 import java.util.Arrays;
4 import java.util.List;
5
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8
9 import jalview.api.AlignViewportI;
10 import jalview.api.AlignmentViewPanel;
11 import jalview.datamodel.AlignmentI;
12 import jalview.datamodel.SequenceGroup;
13 import jalview.datamodel.SequenceI;
14 import jalview.gui.AlignFrame;
15 import jalview.gui.Desktop;
16
17 public class SelectSequencesEndpoint extends AbstractEndpoint
18 {
19   public SelectSequencesEndpoint(API api)
20   {
21     super(api, path, name, parameters, description);
22   }
23
24   protected static final String path = "selectsequences";
25
26   private static final String name = "Select sequence(s) positions";
27
28   private static final String parameters = "<sequence names>,<range>";
29
30   private static final String description = "Select the specified sequence(s) with the specified range";
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 rangesString = parameters[1];
42     int[][] ranges = parseIntRanges(rangesString);
43     if (ranges == null || ranges.length < 2 || ranges[0].length < 1)
44     {
45       returnError(request, response,
46               "couldn't parse range '" + rangesString + "'");
47       return;
48     }
49     if (ranges[0].length > 1)
50     {
51       returnError(request, response,
52               "only provide 1 range '" + rangesString + "'");
53       return;
54     }
55     int start = ranges[0][0];
56     int end = ranges[1][0];
57
58     String sequenceNamesString = parameters[0];
59     List<String> sequenceNames = Arrays
60             .asList(sequenceNamesString.split(","));
61     String fromIdString = request.getParameter("fromId");
62
63     AlignFrame[] alignFrames;
64     if (fromIdString != null)
65     {
66       AlignFrame af = AlignFrame.getAlignFrameFromRestId(fromIdString);
67       if (af == null)
68       {
69         returnError(request, response,
70                 "fromId value '" + fromIdString + "' results not found");
71         return;
72       }
73       alignFrames = new AlignFrame[] { af };
74     }
75     else
76     {
77       alignFrames = Desktop.getAlignFrames();
78     }
79     if (alignFrames == null)
80       return;
81     for (int i = 0; i < alignFrames.length; i++)
82     {
83       AlignFrame af = alignFrames[i];
84       List<AlignmentViewPanel> aps = (List<AlignmentViewPanel>) af
85               .getAlignPanels();
86       for (AlignmentViewPanel ap : aps)
87       {
88         AlignViewportI avp = ap.getAlignViewport();
89         // ap.getAlignViewport().getSequenceSetId()
90         AlignmentI al = ap.getAlignment();
91         List<SequenceI> seqs = (List<SequenceI>) al.getSequences();
92         SequenceGroup stretchGroup = new SequenceGroup();
93         for (SequenceI seq : seqs)
94         {
95           if (sequenceNames.contains(seq.getName()))
96           {
97             stretchGroup.addSequence(seq, false);
98           }
99         }
100         stretchGroup.setStartRes(start);
101         stretchGroup.setEndRes(end);
102         avp.setSelectionGroup(stretchGroup);
103         ap.paintAlignment(false, false);
104         avp.sendSelection();
105       }
106     }
107   }
108 }