hekailiang / squirrel

squirrel-foundation is a State Machine library, which provided a lightweight, easy use, type safe and programmable state machine implementation for Java.
http://hekailiang.github.io/squirrel/
Other
2.19k stars 540 forks source link

AbstractStateMachine.canAccept(E event) does not work for events acceptable from parent state #128

Open azhuchkov opened 3 years ago

azhuchkov commented 3 years ago

If we are in a nested state method canAccept() returns false for transitions available from parent state.

Workaround (subclass override):

  @Override
  public boolean canAccept(Object event) {
    ImmutableState<?, ?, ?, ?> testRawState = getCurrentRawState();
    if (testRawState == null) { // assuming auto_start enabled
      testRawState = getInitialRawState();
    }
    return canAccept(testRawState, event);
  }

  private boolean canAccept(ImmutableState<?, ?, ?, ?> state, Object event) {
    final ImmutableState<?, ?, ?, ?> parentState = state.getParentState();

    return state.getAcceptableEvents().contains(event) ||
           (parentState != null && canAccept(parentState, event));
  }