FSM.
- By Sameer Bhatia
- June 13, 2000
// FSM.java
package FSM;
import java.lang.reflect.*;
public class FSM
{
public FSM(short initState, short maxState, short maxEvent,
IFSMController controller, Object target)
{
_controller = controller;
_target = target;
_state = initState;
_operation = new String[maxState+1][maxEvent+1];
_nextState = new short[maxState+1][maxEvent+1];
StateTransition[] s = _controller.getTransitions();
for (int i = 0; i < s.length; i++)
{
_operation[s[i].state][s[i].event] = s[i].operation;
_nextState[s[i].state][s[i].event] = s[i].nextState;
}
}
public Object dispatch(short event)
{
String operation = null;
Object result = null;
try
{
operation = _operation[_state][event];
Method method =
_target.getClass().getMethod(operation, null);
result = method.invoke(_target, null);
_state = _nextState[_state][event];
}
catch (ArrayIndexOutOfBoundsException e)
{
_controller.unknownEventHandler(
new StateTransition(_state, event, (short)-1, operation));
}
catch (NullPointerException e)
{
_controller.invalidTransitionHandler(
new StateTransition(_state, event, (short)-1, operation));
}
catch (NoSuchMethodException e)
{
_controller.invalidTransitionHandler(
new StateTransition(_state, event, (short)-1, operation));
}
catch (InvocationTargetException e)
{
_controller.invalidTransitionHandler(
new StateTransition(_state, event, (short) -1, operation));
}
catch (IllegalAccessException e)
{
_controller.invalidTransitionHandler(
new StateTransition(_state, event, (short) -1, operation));
}
return result;
}
private IFSMController _controller;
private Object _target;
private String _operation[][];
private short _nextState[][];
private short _state;
}