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 public class ExitStatus implements Serializable, Comparable<ExitStatus> {
34
35
36
37
38
39 public static final ExitStatus UNKNOWN = new ExitStatus("UNKNOWN");
40
41
42
43
44
45
46
47
48 public static final ExitStatus EXECUTING = new ExitStatus("EXECUTING");
49
50
51
52
53 public static final ExitStatus COMPLETED = new ExitStatus("COMPLETED");
54
55
56
57
58
59 public static final ExitStatus NOOP = new ExitStatus("NOOP");
60
61
62
63
64 public static final ExitStatus FAILED = new ExitStatus("FAILED");
65
66
67
68
69
70 public static final ExitStatus STOPPED = new ExitStatus("STOPPED");
71
72 private final String exitCode;
73
74 private final String exitDescription;
75
76 public ExitStatus(String exitCode) {
77 this(exitCode, "");
78 }
79
80 public ExitStatus(String exitCode, String exitDescription) {
81 super();
82 this.exitCode = exitCode;
83 this.exitDescription = exitDescription == null ? "" : exitDescription;
84 }
85
86
87
88
89
90
91 public String getExitCode() {
92 return exitCode;
93 }
94
95
96
97
98 public String getExitDescription() {
99 return exitDescription;
100 }
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 public ExitStatus and(ExitStatus status) {
128 if (status == null) {
129 return this;
130 }
131 ExitStatus result = addExitDescription(status.exitDescription);
132 if (compareTo(status) < 0) {
133 result = result.replaceExitCode(status.exitCode);
134 }
135 return result;
136 }
137
138
139
140
141
142 public int compareTo(ExitStatus status) {
143 if (severity(status) > severity(this)) {
144 return -1;
145 }
146 if (severity(status) < severity(this)) {
147 return 1;
148 }
149 return this.getExitCode().compareTo(status.getExitCode());
150 }
151
152
153
154
155
156 private int severity(ExitStatus status) {
157 if (status.exitCode.startsWith(EXECUTING.exitCode)) {
158 return 1;
159 }
160 if (status.exitCode.startsWith(COMPLETED.exitCode)) {
161 return 2;
162 }
163 if (status.exitCode.startsWith(NOOP.exitCode)) {
164 return 3;
165 }
166 if (status.exitCode.startsWith(STOPPED.exitCode)) {
167 return 4;
168 }
169 if (status.exitCode.startsWith(FAILED.exitCode)) {
170 return 5;
171 }
172 if (status.exitCode.startsWith(UNKNOWN.exitCode)) {
173 return 6;
174 }
175 return 7;
176 }
177
178
179
180
181
182
183 public String toString() {
184 return String.format("exitCode=%s;exitDescription=%s", exitCode, exitDescription);
185 }
186
187
188
189
190
191
192 public boolean equals(Object obj) {
193 if (obj == null) {
194 return false;
195 }
196 return toString().equals(obj.toString());
197 }
198
199
200
201
202
203
204 public int hashCode() {
205 return toString().hashCode();
206 }
207
208
209
210
211
212
213
214
215
216 public ExitStatus replaceExitCode(String code) {
217 return new ExitStatus(code, exitDescription);
218 }
219
220
221
222
223
224
225 public boolean isRunning() {
226 return "RUNNING".equals(this.exitCode) || "UNKNOWN".equals(this.exitCode);
227 }
228
229
230
231
232
233
234
235
236
237
238 public ExitStatus addExitDescription(String description) {
239 StringBuffer buffer = new StringBuffer();
240 boolean changed = StringUtils.hasText(description) && !exitDescription.equals(description);
241 if (StringUtils.hasText(exitDescription)) {
242 buffer.append(exitDescription);
243 if (changed) {
244 buffer.append("; ");
245 }
246 }
247 if (changed) {
248 buffer.append(description);
249 }
250 return new ExitStatus(exitCode, buffer.toString());
251 }
252
253
254
255
256
257
258
259
260 public ExitStatus addExitDescription(Throwable throwable) {
261 StringWriter writer = new StringWriter();
262 throwable.printStackTrace(new PrintWriter(writer));
263 String message = writer.toString();
264 return addExitDescription(message);
265 }
266
267 }