1
2
3
4
5
6
7
8 package net.kwfgrid.gworkflowdl.structure;
9
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Arrays;
14
15 /***
16 * implementation of AnalysisTransition with ArrayLists.
17 */
18 public final class ArrayListTransition implements Transition {
19
20 private String id;
21 private String description;
22 private GenericProperties properties;
23
24 private final List<Edge> readEdges;
25 private final List<Edge> inEdges;
26 private final List<Edge> writeEdges;
27 private final List<Edge> outEdges;
28
29 private Operation operation;
30
31 private int status;
32
33 private ArrayList<String> conditions;
34
35 public ArrayListTransition() {
36 id = Transition.DEFAULT_ID;
37 description = Transition.DEFAULT_DESCRIPTION;
38 properties = Factory.newProperties();
39
40 readEdges = new ArrayList<Edge>(2);
41 inEdges = new ArrayList<Edge>(2);
42 writeEdges = new ArrayList<Edge>(2);
43 outEdges = new ArrayList<Edge>(2);
44
45 operation = Transition.DEFAULT_OPERATION;
46 conditions = (ArrayList<String>) Transition.DEFAULT_CONDITIONS;
47 status = Transition.DEFAULT_STATUS;
48 }
49
50 public void setID(final String idString) {
51 id = idString;
52 }
53
54 public String getID() {
55 return id;
56 }
57
58 public void setDescription(final String descr) {
59 description = descr;
60 }
61
62 public String getDescription() {
63 return description;
64 }
65
66 public GenericProperties getProperties() {
67 return properties;
68 }
69
70 public void setProperties(final GenericProperties props) {
71 properties = props;
72 }
73
74 public void addCondition(final String cond) {
75 if (conditions == null) {
76 conditions = new ArrayList<String>(1);
77 }
78 conditions.add(cond);
79 }
80
81 public void removeCondition(final int i) {
82 conditions.remove(i);
83 }
84
85 public void setConditions(final String[] cs) {
86 conditions = new ArrayList<String>(1);
87 conditions.addAll(Arrays.asList(cs));
88 }
89
90 public String[] getConditions() {
91 if (conditions == null) {
92 return new String[0];
93 }
94 final String[] ret = new String[conditions.size()];
95 for (int i = 0; i < ret.length; i++) {
96 ret[i] = conditions.get(i);
97 }
98 return ret;
99 }
100
101 public void setStatus(final int stat) {
102 status = stat;
103 }
104
105 public int getStatus() {
106 return status;
107 }
108
109 public void addReadEdge(final Edge edge) {
110 readEdges.add(edge);
111 }
112
113 public void removeReadEdge(int i) {
114 readEdges.remove(i);
115 }
116
117 public void addInEdge(final Edge pr) {
118 inEdges.add(pr);
119 }
120
121 public void removeInEdge(final int i) {
122 inEdges.remove(i);
123 }
124
125 public void addWriteEdge(final Edge edge) {
126 writeEdges.add(edge);
127 }
128
129 public void removeWriteEdge(int i) {
130 writeEdges.remove(i);
131 }
132
133 public void addOutEdge(final Edge pr) {
134 outEdges.add(pr);
135 }
136
137 public void removeOutEdge(final int i) {
138 outEdges.remove(i);
139 }
140
141 public void setReadEdges(Edge[] edges) {
142 readEdges.clear();
143 readEdges.addAll(Arrays.asList(edges));
144 }
145
146 public Edge[] getReadEdges() {
147 final Edge[] edges = new Edge[readEdges.size()];
148 for (int i = 0; i < edges.length; i++) {
149 edges[i] = readEdges.get(i);
150 }
151 return edges;
152 }
153
154 public void setInEdges(final Edge[] prs) {
155 inEdges.clear();
156 inEdges.addAll(Arrays.asList(prs));
157 }
158
159 public Edge[] getInEdges() {
160 final Edge[] edges = new Edge[inEdges.size()];
161 for (int i = 0; i < edges.length; i++) {
162 edges[i] = inEdges.get(i);
163 }
164 return edges;
165 }
166
167 public void setWriteEdges(Edge[] edges) {
168 writeEdges.clear();
169 writeEdges.addAll(Arrays.asList(edges));
170 }
171
172 public Edge[] getWriteEdges() {
173 final Edge[] edges = new Edge[writeEdges.size()];
174 for (int i = 0; i < edges.length; i++) {
175 edges[i] = writeEdges.get(i);
176 }
177 return edges;
178 }
179
180 public void setOutEdges(final Edge[] edges) {
181 outEdges.clear();
182 outEdges.addAll(Arrays.asList(edges));
183 }
184
185 public Edge[] getOutEdges() {
186 final Edge[] edges = new Edge[outEdges.size()];
187 for (int i = 0; i < edges.length; i++) {
188 edges[i] = outEdges.get(i);
189 }
190 return edges;
191 }
192
193 /***
194 * Remove place with placeID.
195 *
196 * @param placeID The identifier of the place
197 */
198 public void removeReadEdge(final String placeID) {
199 for (int i = 0; i < readEdges.size(); i++) {
200 final Edge edge = readEdges.get(i);
201 if (edge.getPlace().getID().equals(placeID)) {
202 readEdges.remove(i);
203 break;
204 }
205 }
206 }
207
208 public void removeInEdge(final String placeID) {
209 for (int i = 0; i < inEdges.size(); i++) {
210 final Edge edge = inEdges.get(i);
211 if (edge.getPlace().getID().equals(placeID)) {
212 inEdges.remove(i);
213 break;
214 }
215 }
216 }
217
218 public void removeWriteEdge(final String placeID) {
219 for (int i = 0; i < writeEdges.size(); i++) {
220 final Edge edge = writeEdges.get(i);
221 if (edge.getPlace().getID().equals(placeID)) {
222 writeEdges.remove(i);
223 break;
224 }
225 }
226 }
227
228 public void removeOutEdge(final String placeID) {
229 for (int i = 0; i < outEdges.size(); i++) {
230 final Edge edge = outEdges.get(i);
231 if (edge.getPlace().getID().equals(placeID)) {
232 outEdges.remove(i);
233 break;
234 }
235 }
236 }
237
238 /***
239 * Get Edge connected to this transition by Place ID.
240 * if no Edge has a Place with ID then return null
241 *
242 * @param placeID The identifier of the place
243 * @return Edge with the given Place ID
244 */
245 public Edge getReadEdge(String placeID) {
246 for (Edge readEdge : readEdges) {
247 final Edge edge = readEdge;
248 if (edge.getPlace().getID().equals(placeID)) {
249 return edge;
250 }
251 }
252 return null;
253 }
254
255 public Edge getInEdge(final String placeID) {
256 for (Edge inEdge : inEdges) {
257 final Edge edge = inEdge;
258 if (edge.getPlace().getID().equals(placeID)) {
259 return edge;
260 }
261 }
262 return null;
263 }
264
265 public Edge getWriteEdge(String placeID) {
266 for (Edge writeEdge : writeEdges) {
267 final Edge edge = writeEdge;
268 if (edge.getPlace().getID().equals(placeID)) {
269 return edge;
270 }
271 }
272 return null;
273 }
274
275 public Edge getOutEdge(final String placeID) {
276 for (Edge outEdge : outEdges) {
277 final Edge edge = outEdge;
278 if (edge.getPlace().getID().equals(placeID)) {
279 return edge;
280 }
281 }
282 return null;
283 }
284
285 public void setOperation(final Operation op) {
286 operation = op;
287 }
288
289 public Operation getOperation() {
290 return operation;
291 }
292
293 public int getAbstractionLevel() {
294 if (operation == null) {
295 return Operation.BLACK;
296 } else {
297 return operation.getAbstractionLevel();
298 }
299 }
300
301 public boolean isEnabled() {
302
303
304 Iterator edges = readEdges.iterator();
305 while (edges.hasNext()) {
306 final Place p = ((Edge) edges.next()).getPlace();
307 if (p.isEmpty()) {
308 return false;
309 }
310 }
311
312
313 edges = writeEdges.iterator();
314 while (edges.hasNext()) {
315 final Place p = ((Edge) edges.next()).getPlace();
316 if (p.isEmpty()) {
317 return false;
318 }
319 }
320
321
322 edges = inEdges.iterator();
323 while (edges.hasNext()) {
324 final Place p = ((Edge) edges.next()).getPlace();
325 if (p.isEmpty()) {
326 return false;
327 } else {
328 int nTokens = p.getTokens().length;
329 int nLockedTokens = 0;
330 Token[] tokens = p.getTokens();
331 for (int j = 0; j < nTokens; j++) {
332 if (tokens[j].isLocked()) nLockedTokens++;
333 }
334 if (nLockedTokens >= nTokens) return false;
335 }
336
337 }
338
339
340 edges = outEdges.iterator();
341 while (edges.hasNext()) {
342 final Place p = ((Edge) edges.next()).getPlace();
343 if (p.getTokenNumber() == p.getCapacity()) {
344 return false;
345 }
346 }
347 return true;
348 }
349
350 }
351