1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.core;
17
18 import java.io.PrintWriter;
19 import java.io.Serializable;
20 import java.io.StringWriter;
21
22 import org.springframework.util.StringUtils;
23
24
25
26
27
28
29
30
31
32
33 @SuppressWarnings("serial")
34 public class ExitStatus implements Serializable, Comparable<ExitStatus> {
35
36
37
38
39
40 public static final ExitStatus UNKNOWN = new ExitStatus("UNKNOWN");
41
42
43
44
45
46
47
48
49 public static final ExitStatus EXECUTING = new ExitStatus("EXECUTING");
50
51
52
53
54 public static final ExitStatus COMPLETED = new ExitStatus("COMPLETED");
55
56
57
58
59
60 public static final ExitStatus NOOP = new ExitStatus("NOOP");
61
62
63
64
65 public static final ExitStatus FAILED = new ExitStatus("FAILED");
66
67
68
69
70
71 public static final ExitStatus STOPPED = new ExitStatus("STOPPED");
72
73 private final String exitCode;
74
75 private final String exitDescription;
76
77 public ExitStatus(String exitCode) {
78 this(exitCode, "");
79 }
80
81 public ExitStatus(String exitCode, String exitDescription) {
82 super();
83 this.exitCode = exitCode;
84 this.exitDescription = exitDescription == null ? "" : exitDescription;
85 }
86
87
88
89
90
91
92 public String getExitCode() {
93 return exitCode;
94 }
95
96
97
98
99 public String getExitDescription() {
100 return exitDescription;
101 }
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 public ExitStatus and(ExitStatus status) {
129 if (status == null) {
130 return this;
131 }
132 ExitStatus result = addExitDescription(status.exitDescription);
133 if (compareTo(status) < 0) {
134 result = result.replaceExitCode(status.exitCode);
135 }
136 return result;
137 }
138
139
140
141
142
143 @Override
144 public int compareTo(ExitStatus status) {
145 if (severity(status) > severity(this)) {
146 return -1;
147 }
148 if (severity(status) < severity(this)) {
149 return 1;
150 }
151 return this.getExitCode().compareTo(status.getExitCode());
152 }
153
154
155
156
157
158 private int severity(ExitStatus status) {
159 if (status.exitCode.startsWith(EXECUTING.exitCode)) {
160 return 1;
161 }
162 if (status.exitCode.startsWith(COMPLETED.exitCode)) {
163 return 2;
164 }
165 if (status.exitCode.startsWith(NOOP.exitCode)) {
166 return 3;
167 }
168 if (status.exitCode.startsWith(STOPPED.exitCode)) {
169 return 4;
170 }
171 if (status.exitCode.startsWith(FAILED.exitCode)) {
172 return 5;
173 }
174 if (status.exitCode.startsWith(UNKNOWN.exitCode)) {
175 return 6;
176 }
177 return 7;
178 }
179
180
181
182
183
184
185 @Override
186 public String toString() {
187 return String.format("exitCode=%s;exitDescription=%s", exitCode, exitDescription);
188 }
189
190
191
192
193
194
195 @Override
196 public boolean equals(Object obj) {
197 if (obj == null) {
198 return false;
199 }
200 return toString().equals(obj.toString());
201 }
202
203
204
205
206
207
208 @Override
209 public int hashCode() {
210 return toString().hashCode();
211 }
212
213
214
215
216
217
218
219
220
221 public ExitStatus replaceExitCode(String code) {
222 return new ExitStatus(code, exitDescription);
223 }
224
225
226
227
228
229
230 public boolean isRunning() {
231 return "RUNNING".equals(this.exitCode) || "UNKNOWN".equals(this.exitCode);
232 }
233
234
235
236
237
238
239
240
241
242
243 public ExitStatus addExitDescription(String description) {
244 StringBuffer buffer = new StringBuffer();
245 boolean changed = StringUtils.hasText(description) && !exitDescription.equals(description);
246 if (StringUtils.hasText(exitDescription)) {
247 buffer.append(exitDescription);
248 if (changed) {
249 buffer.append("; ");
250 }
251 }
252 if (changed) {
253 buffer.append(description);
254 }
255 return new ExitStatus(exitCode, buffer.toString());
256 }
257
258
259
260
261
262
263
264
265 public ExitStatus addExitDescription(Throwable throwable) {
266 StringWriter writer = new StringWriter();
267 throwable.printStackTrace(new PrintWriter(writer));
268 String message = writer.toString();
269 return addExitDescription(message);
270 }
271
272 }