Ejemplo n.º 1
0
        protected RawStateMachineBase(TState initialState, Configuration <TState, TTrigger> configuration)
        {
            Representations = configuration.Representations;

            CurrentStateRepresentation = StateConfigurationHelper.FindStateRepresentation(
                initialState, Representations);

            if (CurrentStateRepresentation == null)
            {
                ExceptionHelper.ThrowInvalidState(initialState);
            }

            diagnostics = new RawStateMachineDiagnostics <TState, TTrigger>(this);
        }
Ejemplo n.º 2
0
        public void Fire(TTrigger trigger)
        {
            lock (syncRoot)
            {
                if (!IsEnabled)
                {
                    return;
                }
                var triggerRep = StateConfigurationHelper <TState, TTrigger> .FindTriggerRepresentation(trigger,
                                                                                                        CurrentStateRepresentation);

                if (triggerRep == null)
                {
                    HandleInvalidTrigger(trigger);
                    return;
                }

                var previousState = CurrentState;

                var predicate = triggerRep.ConditionalTriggerPredicate;
                if (predicate != null)
                {
                    if (!predicate())
                    {
                        HandleInvalidTrigger(trigger);
                        return;
                    }
                }

                // Handle ignored trigger

                if (triggerRep.NextStateRepresentation == null)
                {
                    return;
                }

                // Catch invalid paramters before execution.

                Action triggerAction = null;
                try
                {
                    triggerAction = (Action)triggerRep.OnTriggerAction;
                }
                catch (InvalidCastException)
                {
                    InvalidTriggerParameterException <TTrigger> .Throw(trigger);

                    return;
                }


                // Current exit
                var currentExit = CurrentStateRepresentation.OnExitAction;
                ExecuteAction(currentExit);

                // Trigger entry
                ExecuteAction(triggerAction);

                var nextStateRep = triggerRep.NextStateRepresentation;

                // Next entry
                var nextEntry = nextStateRep.OnEntryAction;
                ExecuteAction(nextEntry);

                CurrentStateRepresentation = nextStateRep;

                // Raise state change event
                var stateChangedHandler = StateChanged;
                if (stateChangedHandler != null)
                {
                    stateChangedHandler.Invoke(previousState, CurrentStateRepresentation.State);
                }
            }
        }
Ejemplo n.º 3
0
        public void Fire<TArgument>(ParameterizedTrigger<TTrigger, TArgument> parameterizedTrigger, TArgument argument)
        {
            if (isRunning)
                throw new InvalidOperationException("State cannot be changed while in transition");

            if (IsEnabled)
            {
                isRunning = true;

                var trigger = parameterizedTrigger.Trigger;
                var triggerRep = StateConfigurationHelper<TState, TTrigger>.FindTriggerRepresentation(trigger,
                    currentStateRepresentation);

                if (triggerRep == null)
                {
                    HandleInvalidTrigger(trigger);
                    return;
                }

                var previousState = CurrentState;

                var predicate = triggerRep.ConditionalTriggerPredicate;
                if (predicate != null)
                {
                    if (!predicate())
                    {
                        HandleInvalidTrigger(trigger);
                        return;
                    }
                }

                // Handle ignored trigger

                if (triggerRep.NextStateRepresentation == null)
                {
                    return;
                }

                // Catch invalid paramters before execution.

                Action<TArgument> triggerAction = null;
                try
                {
                    triggerAction = (Action<TArgument>) triggerRep.OnTriggerAction;
                }
                catch (InvalidCastException)
                {
                    InvalidTriggerParameterException<TTrigger>.Throw(trigger);
                    return;
                }


                // Current exit
                var currentExit = currentStateRepresentation.OnExitAction;
                ExecuteAction(currentExit);

                // Trigger entry
                if (triggerAction != null)
                    triggerAction(argument);


                var nextStateRep = triggerRep.NextStateRepresentation;

                // Next entry
                var nextEntry = nextStateRep.OnEntryAction;
                ExecuteAction(nextEntry);

                currentStateRepresentation = nextStateRep;

                // Raise state change event
                var stateChangedHandler = StateChanged;
                if (stateChangedHandler != null)
                {
                    stateChangedHandler(previousState, currentStateRepresentation.State);
                }

                isRunning = false;
            }
        }
Ejemplo n.º 4
0
        public void Fire(TTrigger trigger)
        {
            if (monitor.TryEnter())
            {
                try
                {
                    if (!IsEnabled)
                    {
                        return;
                    }
                    var triggerRep = StateConfigurationHelper <TState, TTrigger> .FindTriggerRepresentation(trigger,
                                                                                                            CurrentStateRepresentation);

                    if (triggerRep == null)
                    {
                        HandleInvalidTrigger(trigger);
                        return;
                    }

                    var previousState = CurrentState;

                    var predicate = triggerRep.ConditionalTriggerPredicate;
                    if (predicate != null)
                    {
                        if (!predicate())
                        {
                            HandleInvalidTrigger(trigger);
                            return;
                        }
                    }

                    // Handle ignored trigger

                    if (triggerRep.NextStateRepresentation == null)
                    {
                        return;
                    }

                    // Catch invalid paramters before execution.

                    Action triggerAction = null;
                    try
                    {
                        triggerAction = (Action)triggerRep.OnTriggerAction;
                    }
                    catch (InvalidCastException)
                    {
                        InvalidTriggerParameterException <TTrigger> .Throw(trigger);

                        return;
                    }


                    // Current exit
                    var currentExit = CurrentStateRepresentation.OnExitAction;
                    ExecuteAction(currentExit);

                    // Trigger entry
                    ExecuteAction(triggerAction);

                    var nextStateRep = triggerRep.NextStateRepresentation;

                    // Next entry
                    var nextEntry = nextStateRep.OnEntryAction;
                    ExecuteAction(nextEntry);

                    CurrentStateRepresentation = nextStateRep;

                    // Raise state change event
                    var stateChangedHandler = StateChanged;
                    if (stateChangedHandler != null)
                    {
                        stateChangedHandler.Invoke(previousState, CurrentStateRepresentation.State);
                    }
                }
                finally
                {
                    monitor.Exit();
                }
            }
            else
            {
                if (IsEnabled)
                {
                    throw new InvalidOperationException("State cannot be changed while in transition. Use AsyncStateMachine or a BlockingStateMachine for these semantics.");
                }
            }
        }