InternalTranstion vs defineSequentialStatesOn

47 views
Skip to first unread message

Дмитрий Богун

unread,
Mar 4, 2019, 12:06:34 PM3/4/19
to squirrel state machine
Hi.

I have an FSM with some composite state. This composit state contatain 3 nested state. I would like to define internalTransition on "root" (outter) state and apply some action. I am expection that if FSM is in one of nested state and it receive event defined into internalTranstion on root event, it will react/handle such event.

This behavior "defined" into https://github.com/hekailiang/squirrel/blame/master/README.md#L126... as far a I understand this sentence.

But in my case FSM ignore event defined in internalTransition defined for parent state.

Piece of definition of my FSM:

        // OPERATIONAL
        builder.transition()
                .from(PortFsmState.OPERATIONAL).to(PortFsmState.UNOPERATIONAL).on(PortFsmEvent.OFFLINE);
        builder.transition()
                .from(PortFsmState.OPERATIONAL).to(PortFsmState.FINISH).on(PortFsmEvent.PORT_DEL);
        builder.internalTransition().within(PortFsmState.OPERATIONAL).on(PortFsmEvent.FAIL)
                .callMethod("proxyFail");
        builder.defineSequentialStatesOn(PortFsmState.OPERATIONAL,
                                         PortFsmState.UNKNOWN, PortFsmState.UP, PortFsmState.DOWN);

        // UNKNOWN
        builder.transition()
                .from(PortFsmState.UNKNOWN).to(PortFsmState.UP).on(PortFsmEvent.PORT_UP);
        builder.transition()
                .from(PortFsmState.UNKNOWN).to(PortFsmState.DOWN).on(PortFsmEvent.PORT_DOWN);

        // UP
        builder.transition()
                .from(PortFsmState.UP).to(PortFsmState.DOWN).on(PortFsmEvent.PORT_DOWN);
        builder.internalTransition().within(PortFsmState.UP).on(PortFsmEvent.DISCOVERY)
                .callMethod("proxyDiscovery");
        builder.onEntry(PortFsmState.UP)
                .callMethod("enableDiscoveryPoll");
        builder.onExit(PortFsmState.UP)
                .callMethod("disableDiscoveryPoll");

        // DOWN
        builder.transition()
                .from(PortFsmState.DOWN).to(PortFsmState.UP).on(PortFsmEvent.PORT_UP);
        builder.onEntry(PortFsmState.DOWN)
                .callMethod("downEnter");

And piece of log when FSM is in state UP and receive FAIL event:

March 4th 2019, 18:19:01.203 INFO PortFsm(6VX16SvZD1): Transition from "UP" on "FAIL" with context "PortFsm.PortFsmContext(output=null, history=null, speakerDiscoveryEvent=null)" begin. org.squirrelframework.foundation.fsm.StateMachineLogger
March 4th 2019, 18:19:01.203 WARN PortFsm(6VX16SvZD1): Transition from "UP" on "FAIL" declined. org.squirrelframework.foundation.fsm.StateMachineLogger

Is it a bug in my FSM definition? Or I treat README incorrectly and this event should not be handled? Or this is a bug in framework?
Reply all
Reply to author
Forward
0 new messages