1 /*
2 * Copyright 2006-2007 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.springframework.batch.core;
18
19 /**
20 * Enumeration representing the status of a an Execution.
21 *
22 * @author Lucas Ward
23 * @author Dave Syer
24 */
25 public enum BatchStatus {
26
27 /**
28 * The order of the status values is significant because it can be used to
29 * aggregate a set of status values - the result should be the maximum
30 * value. Since COMPLETED is first in the order, only if all elements of an
31 * execution are COMPLETED will the aggregate status be COMPLETED. A running
32 * execution is expected to move from STARTING to STARTED to COMPLETED
33 * (through the order defined by {@link #upgradeTo(BatchStatus)}). Higher
34 * values than STARTED signify more serious failure. ABANDONED is used for
35 * steps that have finished processing, but were not successful, and where
36 * they should be skipped on a restart (so FAILED is the wrong status).
37 */
38 COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN;
39
40 public static BatchStatus max(BatchStatus status1, BatchStatus status2) {
41 return status1.isGreaterThan(status2) ? status1 : status2;
42 }
43
44 /**
45 * Convenience method to decide if a status indicates work is in progress.
46 *
47 * @return true if the status is STARTING, STARTED
48 */
49 public boolean isRunning() {
50 return this == STARTING || this == STARTED;
51 }
52
53 /**
54 * Convenience method to decide if a status indicates execution was
55 * unsuccessful.
56 *
57 * @return true if the status is FAILED or greater
58 */
59 public boolean isUnsuccessful() {
60 return this == FAILED || this.isGreaterThan(FAILED);
61 }
62
63 /**
64 * Method used to move status values through their logical progression, and
65 * override less severe failures with more severe ones. This value is
66 * compared with the parameter and the one that has higher priority is
67 * returned. If both are STARTED or less than the value returned is the
68 * largest in the sequence STARTING, STARTED, COMPLETED. Otherwise the value
69 * returned is the maximum of the two.
70 *
71 * @param other another status to compare to
72 * @return either this or the other status depending on their priority
73 */
74 public BatchStatus upgradeTo(BatchStatus other) {
75 if (isGreaterThan(STARTED) || other.isGreaterThan(STARTED)) {
76 return max(this, other);
77 }
78 // Both less than or equal to STARTED
79 if (this == COMPLETED || other == COMPLETED)
80 return COMPLETED;
81 return max(this, other);
82 }
83
84 /**
85 * @param other a status value to compare
86 * @return true if this is greater than other
87 */
88 public boolean isGreaterThan(BatchStatus other) {
89 return this.compareTo(other) > 0;
90 }
91
92 /**
93 * @param other a status value to compare
94 * @return true if this is less than other
95 */
96 public boolean isLessThan(BatchStatus other) {
97 return this.compareTo(other) < 0;
98 }
99
100 /**
101 * @param other a status value to compare
102 * @return true if this is less than other
103 */
104 public boolean isLessThanOrEqualTo(BatchStatus other) {
105 return this.compareTo(other) <= 0;
106 }
107
108 /**
109 * Find a BatchStatus that matches the beginning of the given value. If no
110 * match is found, return COMPLETED as the default because has is low
111 * precedence.
112 *
113 * @param value a string representing a status
114 * @return a BatchStatus
115 */
116 public static BatchStatus match(String value) {
117 for (BatchStatus status : values()) {
118 if (value.startsWith(status.toString())) {
119 return status;
120 }
121 }
122 // Default match should be the lowest priority
123 return COMPLETED;
124 }
125 }