Exemplo n.º 1
0
		/// <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");
		}
Exemplo n.º 2
0
		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);
		}
Exemplo n.º 3
0
		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);
			}
		}
Exemplo n.º 4
0
		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();
		}
Exemplo n.º 5
0
		protected virtual void Exit(TransitionEvent transition)
		{
			Exited(this, new StateTransitionEventArgs(transition));
		}
Exemplo n.º 6
0
		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;
		}
Exemplo n.º 7
0
		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;
		}
Exemplo n.º 9
0
		public static State GetDeepState(HistoryState historyState, TransitionEvent transitionEvent)
		{
			return transitionEvent.SourceState;
		}
Exemplo n.º 10
0
		public static State GetShallowState(HistoryState historyState, TransitionEvent transitionEvent)
		{
			State sourceState = transitionEvent.SourceState;
			return historyState.Parent.GetSubstatePath(sourceState);
		}
Exemplo n.º 11
0
		public TransitionReceipt(TransitionEvent transitionEvent)
		{
			this.transitionEvent = transitionEvent;
		}