4 package uk.ac.vamsas.client.picking;
\r
6 import uk.ac.vamsas.objects.core.Input;
\r
7 import uk.ac.vamsas.objects.core.Pos;
\r
8 import uk.ac.vamsas.objects.core.RangeType;
\r
9 import uk.ac.vamsas.objects.core.Seg;
\r
12 * Send and receive details about vamsas object selections and selection ranges
\r
13 * defined on one or more objects.
\r
15 * @author J.B. Procter
\r
18 public class SelectionMessage extends Message {
\r
19 private String selectionID;
\r
21 private String[] vorbaIDs;
\r
25 private boolean none=false;
\r
27 * parse a message payload as a selection message
\r
31 public SelectionMessage(String str) {
\r
33 // Parse message into ...
\r
34 String[] elements = str.split("\t");
\r
35 String positions[] = null, segs[] = null;
\r
36 for (int i = 0; i < elements.length; i++) {
\r
37 if (elements[i].startsWith("selectionID="))
\r
38 selectionID = elements[i].substring(12);
\r
39 if (elements[i].startsWith("vorbaIDs="))
\r
40 vorbaIDs = elements[i].substring(9).split("\\|");
\r
41 if (elements[i].startsWith("positions=")) {
\r
42 positions = elements[i].substring(10).split(",");
\r
44 if (elements[i].startsWith("ranges=")) {
\r
45 segs = elements[i].substring(7).split(",");
\r
47 if (elements[i].equals("none"))
\r
57 if (positions != null) {
\r
58 ranges = new Input();
\r
59 for (int i = 0; i < positions.length; i++) {
\r
62 p.setI(Integer.parseInt(positions[i]));
\r
64 } catch (Exception e) {
\r
65 // invalid message - ignore element
\r
68 } else if (segs != null) {
\r
69 ranges = new Input();
\r
70 for (int i = 0; i < segs.length; i += 2) {
\r
72 s.setInclusive(segs[i].startsWith("["));
\r
74 s.setStart(Integer.parseInt(segs[i].substring(1)));
\r
75 s.setEnd(Integer.parseInt(segs[i + 1]));
\r
77 } catch (Exception e) {
\r
78 // invalid message - again ignore element
\r
86 * create a new selection message
\r
88 * @param selectionID -
\r
89 * (may be null) optional handle (or ID) to refer to selection by
\r
91 * one or more objects to be selected, or null for the empty selection
\r
93 * optional rangetype specifying positions or intervals over
\r
94 * object(s) coordinate system.
\r
96 public SelectionMessage(String selectionID, String[] vorbaIDs,
\r
98 this(selectionID,vorbaIDs,ranges,false);
\r
100 public SelectionMessage(String selectionID, String[] vorbaIDs, RangeType ranges, boolean none)
\r
103 this.selectionID = selectionID;
\r
104 if (selectionID != null && selectionID.indexOf("\t") > -1) {
\r
106 "VAMSAS Selection Messages are not allowed to have Tab Characters in their selection ID");
\r
108 this.vorbaIDs = vorbaIDs;
\r
109 this.ranges = ranges;
\r
111 StringBuffer message = new StringBuffer();
\r
112 message.append("SELECTION\t");
\r
113 if (selectionID != null) {
\r
114 message.append("selectionID=" + selectionID);
\r
115 message.append("\t");
\r
117 message.append("vorbaIDs=");
\r
118 for (int ids = 0; ids < vorbaIDs.length; ids++) {
\r
120 message.append("|");
\r
122 if (vorbaIDs[ids] == null) {
\r
123 throw new Error("null vorbaID in SelectionMessage ID vector.(" + ids
\r
126 if (vorbaIDs[ids].indexOf("\t") > -1) {
\r
128 "Invalid vorbaID string in SelectionMessage ID vector. ("
\r
129 + vorbaIDs[ids] + ")");
\r
131 message.append(vorbaIDs[ids]);
\r
134 // must have only IDs for the selection or the selection scope - no range
\r
137 throw new Error("Empty selection cannot specify a range.");
\r
139 if ((selectionID==null || selectionID.length()==0) && (vorbaIDs==null || vorbaIDs.length==0))
\r
141 throw new Error("Empty selection must have at least a selection ID or at least one vorbaID indicating selection scope.");
\r
143 message.append("none");
\r
146 // Verify that the range has at least one valid vorbaID for it to be defined on.
\r
147 if (vorbaIDs==null || vorbaIDs.length==0)
\r
149 throw new Error("You must specify at least one vorbaID for the selection.");
\r
151 if (ranges != null) {
\r
152 if (ranges.getPosCount() > 0) {
\r
153 message.append("\tpositions=");
\r
154 Pos[] pos = ranges.getPos();
\r
155 for (int p = 0; p < pos.length; p++) {
\r
157 message.append(",");
\r
159 message.append(pos[p].getI());
\r
161 } else if (ranges.getSegCount() > 0) {
\r
162 message.append("\tranges=");
\r
163 Seg[] rng = ranges.getSeg();
\r
164 for (int p = 0; p < rng.length; p++) {
\r
165 boolean inc = rng[p].getInclusive();
\r
167 message.append(",");
\r
170 message.append("[");
\r
172 message.append("(");
\r
174 message.append(rng[p].getStart());
\r
175 message.append(",");
\r
176 message.append(rng[p].getEnd());
\r
180 message.append("\n");
\r
181 this.message = message.toString();
\r
185 * @return the selectionID
\r
187 public String getSelectionID() {
\r
188 return selectionID;
\r
192 * @return the vorbaIDs
\r
194 public String[] getVorbaIDs() {
\r
199 * @return the ranges
\r
201 public RangeType getRanges() {
\r
208 public boolean isNone() {
\r