package org.oddjob.state;
import static org.oddjob.state.ParentState.*;
import org.oddjob.Structural;
/**
* Implementation of a {@link StateOperator} that provides a parent state
* as follows:
* <ul>
* <li>If any child is EXCEPTION then evaluate to EXCEPTION.</li>
* <li>If any child is INCOMPLETE then evaluate to INCOMPLETE.</li>
* <li>If any child is ACTIVE/EXECUTING then evaluate to ACTIVE.</li>
* <li>If any child is READY then evaluate to READY.</li>
* <li>Evaluate to COMPLETE.</li>
* </ul>
*
* This Operator is legacy behaviour and has been replace by
* {@link AnyActiveStateOp} in most {@link Structural} jobs.
*
* @author rob
*
*/
public class WorstStateOp implements StateOperator {
private static final ParentState[][] STATE_MATRIX = {
{ READY, null, ACTIVE, STARTED, INCOMPLETE, READY, EXCEPTION, null },
{ null, null, null, null, null, null, null, null },
{ ACTIVE, null, ACTIVE, ACTIVE, INCOMPLETE, ACTIVE, EXCEPTION, null },
{ STARTED, null, ACTIVE, STARTED, INCOMPLETE, STARTED, EXCEPTION, null },
{ INCOMPLETE, null, INCOMPLETE, INCOMPLETE, INCOMPLETE, INCOMPLETE, EXCEPTION, null },
{ READY, null, ACTIVE, STARTED, INCOMPLETE, COMPLETE, EXCEPTION, null },
{ EXCEPTION, null, EXCEPTION, EXCEPTION, EXCEPTION, EXCEPTION, EXCEPTION, null },
{ null, null, null, null, null, null, null, null },
};
private final ParentStateConverter parentStateConverter;
public WorstStateOp() {
this(new StandardParentStateConverter());
}
public WorstStateOp(ParentStateConverter parentStateConverter) {
this.parentStateConverter = parentStateConverter;
}
@Override
public ParentState evaluate(State... states) {
new AssertNonDestroyed().evaluate(states);
ParentState state = ParentState.READY;
if (states.length > 0) {
state = parentStateConverter.toStructuralState(states[0]);
for (int i = 1; i < states.length; ++i) {
ParentState next = parentStateConverter.toStructuralState(
states[i]);
state = STATE_MATRIX[state.ordinal()][next.ordinal()];
}
}
return state;
}
public String toString() {
return getClass().getSimpleName();
}
}