1
2
3
4
5
6
7
8
9
10
11
12
13 package org.icenigrid.gridsam.core;
14
15 import java.io.Serializable;
16 import java.util.ArrayList;
17 import java.util.Arrays;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21
22
23
24
25 public class JobState implements Serializable {
26
27
28
29
30 private static final Map sStateMap = new HashMap();
31
32
33
34
35 public static final JobState PENDING = new JobState("pending");
36
37
38
39
40 public static final JobState STAGING_IN = new JobState("staging-in");
41
42
43
44
45 public static final JobState STAGED_IN = new JobState("staged-in");
46
47
48
49
50 public static final JobState STAGING_OUT = new JobState("staging-out");
51
52
53
54
55 public static final JobState STAGED_OUT = new JobState("staged-out");
56
57
58
59
60 public static final JobState ACTIVE = new JobState("active");
61
62
63
64
65
66 public static final JobState ACTIVE_QUEUED = new JobState("active-queued");
67
68
69
70
71 public static final JobState ACTIVE_RUNNING = new JobState("active-running");
72
73
74
75
76 public static final JobState ACTIVE_HELD = new JobState("active-held");
77
78
79
80
81
82 public static final JobState EXECUTED = new JobState("executed");
83
84
85
86
87
88 public static final JobState FAILED = new JobState("failed");
89
90
91
92
93 public static final JobState DONE = new JobState("done");
94
95
96
97
98 public static final JobState TERMINATING = new JobState("terminating");
99
100
101
102
103 public static final JobState TERMINATED = new JobState("terminated");
104
105
106
107
108 public static final JobState UNDEFINED = new JobState("undefined");
109
110
111
112
113 private String oStateValue;
114
115
116
117
118
119
120 private JobState(String pValue) {
121 oStateValue = pValue;
122 sStateMap.put(pValue, this);
123 }
124
125
126
127
128 private static final Map TRANSITIONS = new HashMap();
129
130 static {
131 TRANSITIONS.put(JobState.PENDING, Arrays.asList(new JobState[] {
132 JobState.FAILED, JobState.STAGING_IN, JobState.ACTIVE,
133 JobState.ACTIVE_HELD, JobState.ACTIVE_QUEUED, JobState.ACTIVE_RUNNING,
134 JobState.UNDEFINED, JobState.TERMINATING }));
135 TRANSITIONS.put(JobState.STAGING_IN, Arrays.asList(new JobState[] {
136 JobState.STAGED_IN, JobState.FAILED, JobState.UNDEFINED,
137 JobState.TERMINATING }));
138 TRANSITIONS.put(JobState.STAGED_IN, Arrays.asList(new JobState[] {
139 JobState.ACTIVE, JobState.ACTIVE_HELD, JobState.ACTIVE_QUEUED,
140 JobState.ACTIVE_RUNNING, JobState.STAGING_OUT,
141 JobState.UNDEFINED, JobState.FAILED, JobState.TERMINATING }));
142 TRANSITIONS.put(JobState.ACTIVE, Arrays.asList(new JobState[] {
143 JobState.ACTIVE_HELD, JobState.ACTIVE_QUEUED, JobState.ACTIVE_RUNNING,
144 JobState.FAILED, JobState.EXECUTED, JobState.UNDEFINED,
145 JobState.TERMINATING }));
146 TRANSITIONS.put(JobState.ACTIVE_HELD, Arrays.asList(new JobState[] {
147 JobState.ACTIVE_QUEUED, JobState.ACTIVE_RUNNING, JobState.FAILED,
148 JobState.EXECUTED, JobState.UNDEFINED, JobState.TERMINATING }));
149 TRANSITIONS.put(JobState.ACTIVE_QUEUED, Arrays.asList(new JobState[] {
150 JobState.ACTIVE_HELD, JobState.ACTIVE_RUNNING, JobState.FAILED,
151 JobState.EXECUTED, JobState.UNDEFINED, JobState.TERMINATING }));
152 TRANSITIONS.put(JobState.ACTIVE_RUNNING, Arrays.asList(new JobState[] {
153 JobState.ACTIVE_HELD, JobState.FAILED, JobState.EXECUTED,
154 JobState.UNDEFINED, JobState.TERMINATING }));
155 TRANSITIONS.put(JobState.EXECUTED, Arrays.asList(new JobState[] {
156 JobState.STAGING_OUT, JobState.UNDEFINED, JobState.DONE, JobState.FAILED,
157 JobState.TERMINATING }));
158 TRANSITIONS.put(JobState.STAGING_OUT, Arrays.asList(new JobState[] {
159 JobState.FAILED, JobState.STAGED_OUT, JobState.UNDEFINED,
160 JobState.TERMINATING }));
161 TRANSITIONS.put(JobState.STAGED_OUT, Arrays.asList(new JobState[] {
162 JobState.DONE, JobState.UNDEFINED, JobState.TERMINATING }));
163 TRANSITIONS.put(JobState.TERMINATING, Arrays.asList(new JobState[] {
164 JobState.TERMINATED, JobState.UNDEFINED }));
165
166
167 TRANSITIONS.put(JobState.FAILED, new ArrayList());
168 TRANSITIONS.put(JobState.DONE, new ArrayList());
169 TRANSITIONS.put(JobState.UNDEFINED, new ArrayList());
170 TRANSITIONS.put(JobState.TERMINATED, new ArrayList());
171 }
172
173
174
175
176
177
178
179 public List getPossibleNextState() {
180 if (!TRANSITIONS.containsKey(this)) {
181 throw new IllegalArgumentException("unknown state " + this);
182 }
183 return (List) TRANSITIONS.get(this);
184 }
185
186
187
188
189
190
191 public boolean isTerminal() {
192 return getPossibleNextState().isEmpty();
193 }
194
195
196
197
198
199
200
201
202
203
204
205 public static final JobState parse(String pValue) {
206 JobState xState = (JobState) sStateMap.get(pValue);
207 if (xState == null) {
208 xState = (JobState) sStateMap.get(pValue.toUpperCase());
209 }
210 if (xState == null) {
211 throw new IllegalArgumentException(pValue + " or "
212 + pValue.toUpperCase() + " is not a valid state");
213 }
214 return xState;
215 }
216
217
218
219
220
221
222
223
224 public boolean equals(Object o) {
225 if (this == o)
226 return true;
227 if (!(o instanceof JobState))
228 return false;
229
230 final JobState xJobState = (JobState) o;
231
232 if (!oStateValue.equals(xJobState.oStateValue))
233 return false;
234
235 return true;
236 }
237
238
239
240
241
242
243 public int hashCode() {
244 return oStateValue.hashCode();
245 }
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267 public String toString() {
268 return oStateValue;
269 }
270 }