/// <summary> /// Traversal that doesn't go to children of the root are for unknown states. /// </summary> /// <param name="transition"></param> /// <returns></returns> public override State TraverseUp(TransitionEvent transition) { // Traverse down to children? foreach (State substate in Substates) { if (substate.ContainsState(transition.TargetState)) { return substate.TraverseDown(transition); } } throw new InvalidOperationException("Transition state [" + transition.TargetState.Id.ToString() + "] not found"); }
public virtual State ProcessEvent(State originalState, EventInstance eventToProcess) { Transition transition = transitions.MatchTransition(eventToProcess); if (transition != null) { var transitionEvent = new TransitionEvent(originalState, transition, eventToProcess); // If originating from substate if (!this.Equals(originalState)) return originalState.TraverseUp(transitionEvent); else { Exit(transitionEvent); return parent.TraverseUp(transitionEvent); } } // Not handled, pass it up the chain return parent.ProcessEvent(originalState, eventToProcess); }
public override State TraverseDown(TransitionEvent transitionEvent) { Enter(transitionEvent); // If we have history, transition there if (lastState != null) { Transition transition = new Transition(this, HistoryTransition, lastState); TransitionEvent transitionFromHistory = new TransitionEvent(this, transition, new EventInstance(HistoryTransition)); return TraverseUp(transitionFromHistory); } // If we have no history, transition to parent else { Transition transition = new Transition(this, StateMachine.DefaultEntryEvent, Parent); TransitionEvent transitionToDefault = new TransitionEvent(this, transition, new EventInstance(StateMachine.DefaultEntryEvent)); return TraverseUp(transitionToDefault); } }
public virtual State TraverseDown(TransitionEvent transitionEvent) { Traversing(this, new StateEventArgs(this)); Enter(transitionEvent); if (!this.Equals(transitionEvent.TargetState)) return this.GetSubstatePath(transitionEvent.TargetState).TraverseDown(transitionEvent); return DispatchDefaults(); }
protected virtual void Exit(TransitionEvent transition) { Exited(this, new StateTransitionEventArgs(transition)); }
protected virtual State DispatchDefaults() { var eventToProcess = new SingleStateEventInstance(this, StateMachine.DefaultEntryEvent); Transition transition = transitions.MatchTransition(eventToProcess); if (transition != null) { TransitionEvent transitionEvent = new TransitionEvent(this, transition, eventToProcess); State substate = this.GetSubstatePath(transition.TargetState); if (substate != null) return substate.TraverseDown(transitionEvent); throw new InvalidOperationException("Invalid default transition"); } return this; }
public virtual State TraverseUp(TransitionEvent transitionEvent) { Traversing(this, new StateEventArgs(this)); if (this.Equals(transitionEvent.TargetState)) return DispatchDefaults(); if (this.ContainsState(transitionEvent.TargetState)) return this.GetSubstatePath(transitionEvent.TargetState).TraverseDown(transitionEvent); Exit(transitionEvent); return parent.TraverseUp(transitionEvent); }
public StateTransitionEventArgs(TransitionEvent transitionEvent) { TransitionEvent = transitionEvent; }
public static State GetDeepState(HistoryState historyState, TransitionEvent transitionEvent) { return transitionEvent.SourceState; }
public static State GetShallowState(HistoryState historyState, TransitionEvent transitionEvent) { State sourceState = transitionEvent.SourceState; return historyState.Parent.GetSubstatePath(sourceState); }
public TransitionReceipt(TransitionEvent transitionEvent) { this.transitionEvent = transitionEvent; }