package org.squirrelframework.foundation.fsm; import org.squirrelframework.foundation.component.SquirrelComponent; import java.util.List; import java.util.Set; /** * <p><b>State</b> The basic unit that composes a state machine. A state machine can be in one state at * any particular time.</p> * <p><b>Entry Action</b> An activity executed when entering the state</p> * <p><b>Entry Action</b> An activity executed when entering the state</p> * <p><b>Final State</b> A state which represents the completion of the state machine.</p> * * @author Henry.He * * @param <T> type of State Machine * @param <S> type of State * @param <E> type of Event * @param <C> type of Context */ public interface ImmutableState<T extends StateMachine<T, S, E, C>, S, E, C> extends Visitable, SquirrelComponent { /** * @return state id */ S getStateId(); /** * @return whether state is root state */ boolean isRootState(); /** * @return Activities executed when entering the state */ List<Action<T, S, E, C>> getEntryActions(); /** * @return Activities executed when exiting the state */ List<Action<T, S, E, C>> getExitActions(); /** * @return All transitions start from this state */ List<ImmutableTransition<T, S, E, C>> getAllTransitions(); /** * @param event * @return Transitions triggered by event */ List<ImmutableTransition<T, S, E, C>> getTransitions(E event); /** * @return events that can be accepted by this state */ Set<E> getAcceptableEvents(); /** * Entry state with state context * @param stateContext */ void entry(StateContext<T, S, E, C> stateContext); /** * Enters this state by its history depending on its * <code>HistoryType</code>. The <code>Entry</code> method has to be called * already. * * @param stateContext * the state context. * @return the active state. (depends on this states<code>HistoryType</code>) */ ImmutableState<T, S, E, C> enterByHistory(StateContext<T, S, E, C> stateContext); /** * Enters this state is deep mode: mode if there is one. * * @param stateContext * the event context. * @return the active state. */ ImmutableState<T, S, E, C> enterDeep(StateContext<T, S, E, C> stateContext); /** * Enters this state is shallow mode: The entry action is executed and the * initial state is entered in shallow mode if there is one. * @param stateContext * @return child state entered by shadow */ ImmutableState<T, S, E, C> enterShallow(StateContext<T, S, E, C> stateContext); /** * Exit state with state context * @param stateContext */ void exit(StateContext<T, S, E, C> stateContext); /** * @return parent state */ ImmutableState<T, S, E, C> getParentState(); /** * @return child states */ List<ImmutableState<T, S, E, C>> getChildStates(); /** * @return whether state has child states */ boolean hasChildStates(); /** * @return initial child state */ ImmutableState<T, S, E, C> getInitialState(); /** * Notify transitions when receiving event. * @param stateContext */ void internalFire(StateContext<T, S, E, C> stateContext); /** * @return whether current state is final state */ boolean isFinalState(); /** * @return hierarchy state level */ int getLevel(); /** * @return Historical type of state */ HistoryType getHistoryType(); /** * @return child states composite type */ StateCompositeType getCompositeType(); /** * @return whether child states composite type is parallel */ boolean isParallelState(); boolean isRegion(); /** * Verify state correctness */ void verify(); ImmutableState<T, S, E, C> getThis(); String getPath(); boolean isChildStateOf(ImmutableState<T, S, E, C> input); }