package org.squirrelframework.foundation.issues;
/**
* Created by kailianghe on 2/4/15.
*/
import org.junit.Test;
import org.squirrelframework.foundation.fsm.StateMachine;
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
import org.squirrelframework.foundation.fsm.UntypedStateMachine;
import org.squirrelframework.foundation.fsm.UntypedStateMachineBuilder;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;
public class Issue40 {
private static final StateMachine.StartListener startListener =
new StateMachine.StartListener() {
@Override
public void started(StateMachine.StartEvent event) {
Issue40.started(event);
}
};
private static final StateMachine.StateMachineExceptionListener stateMachineExceptionListener =
new StateMachine.StateMachineExceptionListener() {
@Override
public void stateMachineException(StateMachine.StateMachineExceptionEvent event) {
Issue40.stateMachineException(event);
}
};
private static final StateMachine.StateMachineListener stateMachineListener =
new StateMachine.StateMachineListener() {
@Override
public void stateMachineEvent(StateMachine.StateMachineEvent event) {
Issue40.stateMachineEvent(event);
}
};
private static final StateMachine.TransitionBeginListener transitionBeginListener =
new StateMachine.TransitionBeginListener() {
@Override
public void transitionBegin(StateMachine.TransitionBeginEvent event) {
Issue40.transitionBegin(event);
}
};
private static final StateMachine.TransitionCompleteListener transitionCompleteListener =
new StateMachine.TransitionCompleteListener() {
@Override
public void transitionComplete(StateMachine.TransitionCompleteEvent event) {
Issue40.transitionComplete(event);
}
};
private static final StateMachine.TransitionDeclinedListener transitionDeclinedListener =
new StateMachine.TransitionDeclinedListener() {
@Override
public void transitionDeclined(StateMachine.TransitionDeclinedEvent event) {
transitionDeclined(event);
}
};
private static final StateMachine.TransitionEndListener transitionEndListener =
new StateMachine.TransitionEndListener() {
@Override
public void transitionEnd(StateMachine.TransitionEndEvent event) {
Issue40.transitionEnd(event);
}
};
private static final StateMachine.TransitionExceptionListener transitionExceptionListener =
new StateMachine.TransitionExceptionListener() {
@Override
public void transitionException(StateMachine.TransitionExceptionEvent event) {
Issue40.transitionException(event);
}
};
@Test
public void testRemoveEvents () {
UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(StateMachineSample.class);
builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).callMethod("fromAToB");
builder.onEntry("B").callMethod("ontoB");
UntypedStateMachine fsm = builder.newStateMachine("A");
attachListenersToFSM(fsm);
fsm.fire(FSMEvent.ToB, 10);
detachListenersFromFSM(fsm);
System.out.println("Current state is " + fsm.getCurrentState());
}
public static void attachListenersToFSM ( UntypedStateMachine fsm ) {
fsm.addStartListener(startListener);
fsm.addStateMachineExceptionListener(stateMachineExceptionListener);
fsm.addStateMachineListener(stateMachineListener);
fsm.addTransitionBeginListener(transitionBeginListener);
fsm.addTransitionCompleteListener(transitionCompleteListener);
fsm.addTransitionDeclinedListener(transitionDeclinedListener);
fsm.addTransitionEndListener(transitionEndListener);
fsm.addTransitionExceptionListener(transitionExceptionListener);
}
public static void detachListenersFromFSM ( UntypedStateMachine fsm ) {
fsm.removeTransitionExceptionListener(transitionExceptionListener);
fsm.removeTransitionEndListener(transitionEndListener);
fsm.removeTransitionDeclinedListener(transitionDeclinedListener);
fsm.removeTransitionCompleteListener(transitionCompleteListener);
fsm.removeTransitionBeginListener(transitionBeginListener);
fsm.removeStateMachineListener(stateMachineListener);
fsm.removeStateMachineExceptionListener(stateMachineExceptionListener);
fsm.removeStartListener(startListener);
}
private static void started ( StateMachine.StartEvent e) {
}
private static void stateMachineEvent ( StateMachine.StateMachineEvent e) {
}
private static void stateMachineException ( StateMachine.StateMachineExceptionEvent e) {
}
private static void transitionBegin ( StateMachine.TransitionBeginEvent e) {
}
private static void transitionComplete ( StateMachine.TransitionCompleteEvent e) {
}
private static void transitionDeclined ( StateMachine.TransitionDeclinedEvent e) {
}
private static void transitionEnd (StateMachine.TransitionEndEvent e) {
}
private static void transitionException (StateMachine.TransitionExceptionEvent e) {
}
@StateMachineParameters( stateType = String.class, eventType = FSMEvent.class, contextType = Integer.class )
static class StateMachineSample extends AbstractUntypedStateMachine {
protected void fromAToB ( String from, String to, FSMEvent event, Integer context ) {
System.out.println("Transition from '" + from + "' to '" + to + "' on event '" + event + "' with context '" + context + "'.");
}
protected void ontoB ( String from, String to, FSMEvent event, Integer context ) {
System.out.println("Entry State \'" + to + "\'.");
}
}
enum FSMEvent {
ToA, ToB, ToC, ToD
}
}