d611437ebc708b1e570943f81ce7234a9ea161a3
[vamsas.git] / src / uk / ac / vamsas / client / picking / SelectionMessage.java
1 /**\r
2  * \r
3  */\r
4 package uk.ac.vamsas.client.picking;\r
5 \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
10 \r
11 /**\r
12  * Send and receive details about vamsas object selections and selection ranges\r
13  * defined on one or more objects.\r
14  * \r
15  * @author J.B. Procter\r
16  * \r
17  */\r
18 public class SelectionMessage extends Message {\r
19   private String selectionID;\r
20 \r
21   private String[] vorbaIDs;\r
22 \r
23   RangeType ranges;\r
24 \r
25   private boolean none=false;\r
26   /**\r
27    * parse a message payload as a selection message\r
28    * \r
29    * @param str\r
30    */\r
31   public SelectionMessage(String str) {\r
32     message = 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
43       }\r
44       if (elements[i].startsWith("ranges=")) {\r
45         segs = elements[i].substring(7).split(",");\r
46       }\r
47       if (elements[i].equals("none"))\r
48       {\r
49         none=true;\r
50       }\r
51     }\r
52     if (none)\r
53     {\r
54       ranges = null;\r
55       vorbaIDs = null;\r
56     }\r
57     if (positions != null) {\r
58       ranges = new Input();\r
59       for (int i = 0; i < positions.length; i++) {\r
60         Pos p = new Pos();\r
61         try {\r
62           p.setI(Integer.parseInt(positions[i]));\r
63           ranges.addPos(p);\r
64         } catch (Exception e) {\r
65           // invalid message - ignore element\r
66         }\r
67       }\r
68     } else if (segs != null) {\r
69       ranges = new Input();\r
70       for (int i = 0; i < segs.length; i += 2) {\r
71         Seg s = new Seg();\r
72         s.setInclusive(segs[i].startsWith("["));\r
73         try {\r
74           s.setStart(Integer.parseInt(segs[i].substring(1)));\r
75           s.setEnd(Integer.parseInt(segs[i + 1]));\r
76           ranges.addSeg(s);\r
77         } catch (Exception e) {\r
78           // invalid message - again ignore element\r
79         }\r
80       }\r
81     }\r
82 \r
83   }\r
84 \r
85   /**\r
86    * create a new selection message\r
87    * \r
88    * @param selectionID -\r
89    *          (may be null) optional handle (or ID) to refer to selection by\r
90    * @param vorbaIDs -\r
91    *          one or more objects to be selected, or null for the empty selection\r
92    * @param ranges\r
93    *          optional rangetype specifying positions or intervals over\r
94    *          object(s) coordinate system.\r
95    */\r
96   public SelectionMessage(String selectionID, String[] vorbaIDs,\r
97       RangeType ranges) {\r
98     this(selectionID,vorbaIDs,ranges,false);\r
99   }\r
100   public SelectionMessage(String selectionID, String[] vorbaIDs, RangeType ranges, boolean none)\r
101   {\r
102     super();\r
103     this.selectionID = selectionID;\r
104     if (selectionID != null && selectionID.indexOf("\t") > -1) {\r
105       throw new Error(\r
106           "VAMSAS Selection Messages are not allowed to have Tab Characters in their selection ID");\r
107     }\r
108     this.vorbaIDs = vorbaIDs;\r
109     this.ranges = ranges;\r
110     this.none=none;\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
116     }\r
117     message.append("vorbaIDs=");\r
118     for (int ids = 0; ids < vorbaIDs.length; ids++) {\r
119       if (ids > 0) {\r
120         message.append("|");\r
121       }\r
122       if (vorbaIDs[ids] == null) {\r
123         throw new Error("null vorbaID in SelectionMessage ID vector.(" + ids\r
124             + ")");\r
125       }\r
126       if (vorbaIDs[ids].indexOf("\t") > -1) {\r
127         throw new Error(\r
128             "Invalid vorbaID string in SelectionMessage ID vector. ("\r
129                 + vorbaIDs[ids] + ")");\r
130       }\r
131       message.append(vorbaIDs[ids]);\r
132     }\r
133     if (none) {\r
134       // must have only IDs for the selection or the selection scope - no range\r
135       if (ranges!=null)\r
136       {\r
137         throw new Error("Empty selection cannot specify a range.");\r
138       }\r
139       if ((selectionID==null || selectionID.length()==0) && (vorbaIDs==null || vorbaIDs.length==0))\r
140       {\r
141         throw new Error("Empty selection must have at least a selection ID or at least one vorbaID indicating selection scope.");\r
142       }\r
143       message.append("none");\r
144       return;\r
145     } \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
148     {\r
149       throw new Error("You must specify at least one vorbaID for the selection.");\r
150     }\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
156           if (p > 0) {\r
157             message.append(",");\r
158           }\r
159           message.append(pos[p].getI());\r
160         }\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
166           if (p > 0) {\r
167             message.append(",");\r
168           }\r
169           if (inc) {\r
170             message.append("[");\r
171           } else {\r
172             message.append("(");\r
173           }\r
174           message.append(rng[p].getStart());\r
175           message.append(",");\r
176           message.append(rng[p].getEnd());\r
177         }\r
178       }\r
179     }\r
180     message.append("\n");\r
181     this.message = message.toString();\r
182   }\r
183 \r
184   /**\r
185    * @return the selectionID\r
186    */\r
187   public String getSelectionID() {\r
188     return selectionID;\r
189   }\r
190 \r
191   /**\r
192    * @return the vorbaIDs\r
193    */\r
194   public String[] getVorbaIDs() {\r
195     return vorbaIDs;\r
196   }\r
197 \r
198   /**\r
199    * @return the ranges\r
200    */\r
201   public RangeType getRanges() {\r
202     return ranges;\r
203   }\r
204 \r
205   /**\r
206    * @return the none\r
207    */\r
208   public boolean isNone() {\r
209     return none;\r
210   }\r
211 }\r