package com.zillabyte.motherbrain.flow; import java.util.EnumSet; import java.util.Set; public enum FlowState implements StateMachine<FlowState> { INITIAL { // Initial state @Override public Set<FlowState> predecessors() {return EnumSet.noneOf(FlowState.class);} }, STARTING { // Set when we start preparing @Override public Set<FlowState> predecessors() {return EnumSet.of(INITIAL, KILLED, RECOVERING);} }, STARTED { // After the preparation phase @Override public Set<FlowState> predecessors() {return EnumSet.of(STARTING, RECOVERING);} }, RUNNING { // Tells the flow to start running @Override public Set<FlowState> predecessors() {return EnumSet.of(STARTED, WAITING_FOR_NEXT_CYCLE, IDLE, RECOVERING, PAUSED);} }, PAUSING { // Tells the flow to start running @Override public Set<FlowState> predecessors() {return EnumSet.of(RUNNING, WAITING_FOR_NEXT_CYCLE, IDLE);} }, PAUSED { // Tells the flow to start running @Override public Set<FlowState> predecessors() {return EnumSet.of(PAUSING);} }, CYCLE_COMPLETE { // A short state after we're done running, but before we officially wait for the enxt cycle @Override public Set<FlowState> predecessors() {return EnumSet.of(RUNNING, RECOVERING);} }, WAITING_FOR_NEXT_CYCLE { // set after the 'CYCLE_COMPLETED' has been acknowledged @Override public Set<FlowState> predecessors() {return EnumSet.of(CYCLE_COMPLETE, RECOVERING);} }, IDLE { // set after all operations in an rpc are idled @Override public Set<FlowState> predecessors() {return EnumSet.of(RUNNING);} }, KILLING { // Kill signal has been sent, and we're to start cleaning up @Override public Set<FlowState> predecessors() {return EnumSet.complementOf(EnumSet.of(KILLED, RETIRING, RETIRED, ERRORING, ERROR));} }, KILLED { // Kill cleanup is done @Override public Set<FlowState> predecessors() {return EnumSet.of(KILLING, ERROR);} }, RETIRING { // Retire signal has been sent, and we're to start cleaning up @Override public Set<FlowState> predecessors() {return EnumSet.of(WAITING_FOR_NEXT_CYCLE, IDLE);} }, RETIRED { // Retire cleanup is done @Override public Set<FlowState> predecessors() {return EnumSet.of(RETIRING);} }, ERRORING { @Override public Set<FlowState> predecessors() {return EnumSet.complementOf(EnumSet.of(ERROR, KILLING, KILLED, RETIRING, RETIRED));} }, ERROR { // Set when there's been an unhanlded error @Override public Set<FlowState> predecessors() {return EnumSet.of(ERRORING);} }, RECOVERING { // When the FlowInstance has been recovered @Override public Set<FlowState> predecessors() {return EnumSet.noneOf(FlowState.class);} }, }