View Javadoc

1   /*
2    * Copyright 2010 Fraunhofer Gesellschaft, Munich, Germany,
3    * for its Fraunhofer Institute for Computer Architecture and Software
4    * Technology (FIRST), Berlin, Germany. All rights reserved.
5    * http://www.first.fraunhofer.de/
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         // check read edges
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         // check write edges
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         // check input edges
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         // check output edges
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