public TransitionResult Transition(string name)
        {
            WorkflowTransition t = FindTransitionByName(name);

            if (t == null)
            {
                throw new ArgumentException("WorkflowGraph.Transition: no transition with name " + name);
            }
            return(Transition(t));
        }
        public TransitionResult Transition(WorkflowTransition t)
        {
            if (ActiveState != t.From)
            {
                if (LogF != null)
                {
                    LogF("[WorfklowGraph.Transition] cannot from {0} to {1} along {2} because in state {3}!", t.From.Name, t.To.Name, t.Name, ActiveState.Name);
                }
                return(TransitionResult.Failed_InvalidPrecondition);
            }

            foreach (var p in t.Preconditions)
            {
                bool r = p();
                if (r == false)
                {
                    if (LogF != null)
                    {
                        LogF("[WorfklowGraph.Transition] precondition failed on transition {0} from {1} to {2}!", t.Name, ActiveState.Name, t.To.Name);
                    }
                    return(TransitionResult.Failed_InvalidPrecondition);
                }
            }

            foreach (Action b in t.BeforeTransition)
            {
                b();
            }

            var prevState = ActiveState;

            ActiveState.OnDeactivated();
            ActiveState = t.To;
            ActiveState.OnActivated();


            foreach (Action a in t.AfterTransition)
            {
                a();
            }

            if (LogF != null)
            {
                LogF("[WorfklowGraph.Transition] transitioned from {0} to {1} along {2}!", t.From.Name, t.To.Name, t.Name);
            }

            OnStateTransition?.Invoke(prevState, ActiveState);

            return(TransitionResult.Ok);
        }
        public TransitionResult TransitionToState(WorkflowState newState)
        {
            WorkflowTransition t = FindTransition(ActiveState, newState);

            if (t == null)
            {
                if (LogF != null)
                {
                    LogF("[WorfklowGraph.TransitionToState] ANONYMOUS transition from {0} to {1} does not exist!", ActiveState.Name, newState.Name);
                }
                return(TransitionResult.Failed_NoTransition);
            }
            return(Transition(t));
        }
        public WorkflowTransition AddTransition(WorkflowState from, WorkflowState to, string name)
        {
            if (FindTransitionByName(name) != null)
            {
                throw new InvalidOperationException("WorkflowGraph.AddTransition: transition " + name + " from " + from.Name + " to " + to.Name + " already exists!");
            }

            WorkflowTransition t = new WorkflowTransition()
            {
                From = from, To = to, Name = name
            };

            Transitions[name] = t;
            return(t);
        }
 public bool CanTransition(WorkflowTransition t)
 {
     if (ActiveState != t.From)
     {
         return(false);
     }
     foreach (var p in t.Preconditions)
     {
         bool r = p();
         if (r == false)
         {
             return(false);
         }
     }
     return(true);
 }
Beispiel #6
0
        public void AddTransition(WorkflowState fromState, WorkflowState toState, string identifier,
                                  Func <bool> precondition, Action beforeF, Action afterF)
        {
            WorkflowTransition transition = Graph.AddTransition(fromState, toState, identifier);

            if (precondition != null)
            {
                transition.Preconditions.Add(precondition);
            }
            if (beforeF != null)
            {
                transition.BeforeTransition.Add(beforeF);
            }
            if (afterF != null)
            {
                transition.AfterTransition.Add(afterF);
            }
        }
        public bool CanTransition(string transitionName)
        {
            WorkflowTransition t = FindTransitionByName(transitionName);

            return((t == null) ? false : CanTransition(t));
        }