/// <summary>Gets the next activities or null when no condition is available. </summary>
        /// <param name="activity">The current workflow activity. </param>
        /// <param name="definition">The workflow definition. </param>
        /// <returns>The next activities. </returns>
        /// <exception cref="WorkflowException">No next activities could be found based on the given condition. </exception>
        /// <exception cref="WorkflowException">More then one activity found for condition but activity is not a ForkActivity. </exception>
        public IWorkflowActivityBase[] GetNextActivities(IWorkflowActivityBase activity, WorkflowDefinition definition)
        {
            if (string.IsNullOrEmpty(NextActivitiesCondition))
                return null; 
            
            var nextActivities = definition.GetOutboundTransitions(activity)
                .Where(t => t.Condition == NextActivitiesCondition)
                .Select(t => definition.GetActivityById(t.To))
                .ToArray();

            if (nextActivities.Length == 0)
                throw new WorkflowException(
                    string.Format("No next activities could be found based on the given condition '{0}'. ", NextActivitiesCondition));

            if (nextActivities.Length > 1 && !(activity is ForkActivity))
                throw new WorkflowException(
                    string.Format("More then one activity found for condition '{0}' " +
                                  "but activity is not a ForkActivity. ", NextActivitiesCondition));

            return nextActivities;
        }
示例#2
0
        /// <exception cref="WorkflowException">A workflow exception occurred. </exception>
        private async Task AddNextActivitiesAsync(IWorkflowActivityBase activity, IList <IWorkflowActivityBase> nextActivities)
        {
            var allowedTransitions = WorkflowDefinition.GetOutboundTransitions(activity);

            var hasFollowingActivities = allowedTransitions.Length > 0;

            if (!hasFollowingActivities)
            {
                return;
            }

            var areNextActivitiesAllowed = nextActivities.All(a => allowedTransitions.Any(t => t.To == a.Id));

            if (areNextActivitiesAllowed)
            {
                await PrepareNextActivities(nextActivities);
            }
            else
            {
                throw new WorkflowException(
                          string.Format("Transitions for activities ({0}) produced by activity ({1}) could not be found. ",
                                        string.Join(", ", nextActivities.Select(a => a.Id)), activity.Id));
            }
        }
        /// <summary>Gets the next activities or null when no condition is available. </summary>
        /// <param name="activity">The current workflow activity. </param>
        /// <param name="definition">The workflow definition. </param>
        /// <returns>The next activities. </returns>
        /// <exception cref="WorkflowException">No next activities could be found based on the given condition. </exception>
        /// <exception cref="WorkflowException">More then one activity found for condition but activity is not a ForkActivity. </exception>
        public IWorkflowActivityBase[] GetNextActivities(IWorkflowActivityBase activity, WorkflowDefinition definition)
        {
            if (string.IsNullOrEmpty(NextActivitiesCondition))
            {
                return(null);
            }

            var nextActivities = definition.GetOutboundTransitions(activity)
                                 .Where(t => t.Condition == NextActivitiesCondition)
                                 .Select(t => definition.GetActivityById(t.To))
                                 .ToArray();

            if (nextActivities.Length == 0)
            {
                throw new WorkflowException(
                          string.Format("No next activities could be found based on the given condition '{0}'. ", NextActivitiesCondition));
            }

            if (nextActivities.Length > 1 && !(activity is ForkActivity))
            {
                throw new WorkflowException(
                          string.Format("More then one activity found for condition '{0}' " +
                                        "but activity is not a ForkActivity. ", NextActivitiesCondition));
            }

            return(nextActivities);
        }
示例#4
0
 /// <summary>Initializes a new instance of the <see cref="WorkflowInstance"/> class. </summary>
 /// <param name="workflowDefinition">The workflow definition. </param>
 /// <param name="data">The data provider. </param>
 public WorkflowInstance(WorkflowDefinition workflowDefinition, List <ActivityData> data)
 {
     Data = data;
     WorkflowDefinition = workflowDefinition;
     CurrentActivityIds = new List <string>();
 }