public class NewClass {
private enum StateType{
ProcessOrder_Delivered,
ProcessOrder_Packed,
ProcessOrder_Closed,
ProcessOrder_Dispatched,
ProcessOrder_New,
ST_NOSTATE
}
private enum TransitionType{
ProcessOrder_Delivered_to_ProcessOrder_Closed,
TT_NOTRANSITION
}
private enum CommandType {
Do,
Entry,
Exit,
Packed,
Dispatched,
New,
Delivered,
closed
}
private StateType currState;
private StateType nextState;
private TransitionType currTransition;
private boolean transcend;
private StateType ProcessOrder_history;
private void processOrder_Delivered(CommandType command) {
switch (command) {
case Do: {
// Do Behaviors..
setStatus(CommandType.Delivered);
// State's Transitions
if ((currState == StateType.ProcessOrder_Delivered)) {
nextState = StateType.ProcessOrder_Closed;
currTransition = TransitionType.ProcessOrder_Delivered_to_ProcessOrder_Closed;
}
break;
}
default: {
break;
}
}
}
private void processOrder_Packed(CommandType command) {
switch (command) {
case Do: {
// Do Behaviors..
setStatus(CommandType.Packed);
// State's Transitions
nextState = StateType.ProcessOrder_Dispatched;
break;
}
default: {
break;
}
}
}
private void processOrder_Closed(CommandType command) {
switch (command) {
case Do: {
// Do Behaviors..
// State's Transitions
break;
}
default: {
break;
}
}
}
private void processOrder_Dispatched(CommandType command) {
switch (command) {
case Do: {
// Do Behaviors..
setStatus(CommandType.Dispatched);
// State's Transitions
nextState = StateType.ProcessOrder_Delivered;
break;
}
default: {
break;
}
}
}
private void processOrder_New(CommandType command) {
switch (command) {
case Do:{
// Do Behaviors..
setStatus(CommandType.New);
// State's Transitions
nextState = StateType.ProcessOrder_Packed;
break;
}
default:{
break;
}
}
}
private void StatesProc(StateType currState, CommandType command) {
switch (currState) {
case ProcessOrder_Delivered: {
processOrder_Delivered(command);
break;
}
case ProcessOrder_Packed: {
processOrder_Packed(command);
break;
}
case ProcessOrder_Closed: {
processOrder_Closed(command);
break;
}
case ProcessOrder_Dispatched: {
processOrder_Dispatched(command);
break;
}
case ProcessOrder_New: {
processOrder_New(command);
break;
}
default:
break;
}
}
private void TransitionsProc(TransitionType transition) {
switch (transition) {
case ProcessOrder_Delivered_to_ProcessOrder_Closed: {
setStatus(CommandType.closed);
break;
}
default:
break;
}
}
private void initalizeStateMachine() {
currState = StateType.ProcessOrder_New;
nextState = StateType.ST_NOSTATE;
currTransition = TransitionType.TT_NOTRANSITION;
}
private void runStateMachine() {
while (true) {
if (currState == StateType.ST_NOSTATE) {
break;
}
currTransition = TransitionType.TT_NOTRANSITION;
StatesProc(currState, CommandType.Do);
// then check if there is any valid transition assigned after the do behavior
if (nextState == StateType.ST_NOSTATE) {
break;
}
if (currTransition != TransitionType.TT_NOTRANSITION) {
TransitionsProc(currTransition);
}
if (currState != nextState) {
StatesProc(currState, CommandType.Exit);
StatesProc(nextState, CommandType.Entry);
currState = nextState;
}
}
}
private void setStatus(CommandType set){
}
}