View Javadoc

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 }