package com.c2kernel.lifecycle.instance.stateMachine; import java.io.Serializable; import com.c2kernel.lifecycle.instance.Activity; import com.c2kernel.utils.Logger; /** * @version $Revision: 1.30 $ $Date: 2004/06/04 09:39:19 $ * @author $Author: sgaspard $ */ /** this class represents the link between 2 successive activities */ public class StateMachine implements Serializable { public int state = 0; private Activity activity; public static final String SKIPPABLE = "Skippable"; public static final String REPEATABLE = "Repeatable"; public static final String IGNORABLE = "Ignorable"; /** * Method StateMachine. * @param act */ public StateMachine(Activity act) { activity = act; } /** row : States from (WAITING,RESERVED,STARTED,SUSPENDED,FINISHED,RWAITING,RRESERVED,RSTARTED,RSUSPENDED) * collumn : transition (RESERVE,START,SKIP,DONE,COMPLETE,SUSPEND,REASIGN,RESUME,REPEAT,IGNORE,PROCEED) * cell : State that is reached (-1 if transition not allowed) */ private int[][] getCurrentMachine() { int [][] returnArray = { /*RESERVE, START, SKIP, DONE,COMPLETE,SUSPEND,REASSIGN,RESUME, REPEAT, IGNORE, PROCEED*/ /*0 WAITING*/ { 1,getActive()?2:-1,getSkippable()?4:-1,getActive()?4:-1, -1, -1, -1, -1, -1, -1, -1},/*0 WAITING*/ /*1 RESERVED*/ { -1,getActive()?2:-1,getSkippable()?4:-1,getActive()?4:-1, -1, -1, -1, -1, -1, 0, -1},/*1 RESERVED*/ /*2 STARTED*/ { -1, -1, -1, -1, 4, 3, -1, -1, -1,getIgnorable()?0:-1, -1},/*2 STARTED*/ /*3 SUSPENDED*/ { -1, -1, -1, -1, -1, -1, 2, 2, -1,getIgnorable()?0:-1, -1},/*3 SUSPENDED*/ /*4 FINISHED*/ { -1, -1, -1, -1, -1, -1, -1, -1,getRepeatable()?5:-1, -1,getActive()?4:-1},/*4 FINISHED*/ /*5 RWAITING*/ { 6,getActive()?7:-1,getSkippable()?4:-1,getActive()?4:-1, -1, -1, -1, -1, -1, -1, -1},/*5 RWAITING*/ /*6 RRESERVED*/ { -1,getActive()?7:-1,getSkippable()?4:-1,getActive()?4:-1, -1, -1, -1, -1, -1, -1, -1},/*6 RRESERVED*/ /*7 RSTARTED*/ { -1, -1, -1, -1, 4, 8, -1, -1, -1,getIgnorable()?5:-1, -1},/*7 RSTARTED*/ /*8 RSUSPENDED*/ { -1, -1, -1, -1, -1, -1, 8, 7, -1, -1, -1} /*8 RSUSPENDED*/ }; return returnArray; } /** * @see java.lang.Object#Object() */ public StateMachine() { } /** * Method getCurrentState. * @return String */ public int getCurrentState() { return state; } /** * Method possibleTransition. * @return String[] */ public int[] possibleTransition() { int[] trans = new int[9]; int cmpt = 0; for (int i=0; i< getCurrentMachine()[state].length;i++) if (getCurrentMachine()[state][i]!=-1) trans[cmpt++]=i; int [] result = new int[cmpt]; for (int i=0;i -1) { state=newState; return true; } Logger.msg("StateMachine.traverse() - Illegal transition "+Transitions.getTransitionName(transition)+" from "+States.getStateName(state)); return false; } public int simulate(int transition) { return getCurrentMachine()[state][transition]; } /** * Returns the ignorable. * @return boolean */ public boolean getIgnorable() { return ((Boolean)activity.getProperties().get(IGNORABLE)).booleanValue(); } /** * Returns the repeatable. * @return boolean */ public boolean getRepeatable() { return ((Boolean)activity.getProperties().get(REPEATABLE)).booleanValue(); } /** * Returns the skippable. * @return boolean */ public boolean getSkippable() { return ((Boolean)activity.getProperties().get(SKIPPABLE)).booleanValue(); } public boolean getActive() { return activity.getActive(); } }