예제 #1
0
        public ActionResult RenderActivity(ActivityViewModel model)
        {
            if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to edit workflows")))
            {
                return(new HttpUnauthorizedResult());
            }

            var activity = _activitiesManager.GetActivityByName(model.Name);

            if (activity == null)
            {
                return(HttpNotFound());
            }

            dynamic shape = New.Activity(activity);

            if (model.State != null)
            {
                var state = FormParametersHelper.ToDynamic(FormParametersHelper.ToString(model.State));
                shape.State(state);
            }
            else
            {
                shape.State(FormParametersHelper.FromJsonString("{}"));
            }

            shape.Metadata.Alternates.Add("Activity__" + activity.Name);

            return(new ShapeResult(this, shape));
        }
예제 #2
0
        public void TriggerEvent(string name, IContent target, Func <Dictionary <string, object> > tokensContext)
        {
            var tokens = tokensContext();

            var activity = _activitiesManager.GetActivityByName(name);

            if (activity == null)
            {
                Logger.Error("Activity {0} was not found", name);
                return;
            }

            var startedWorkflows = new List <ActivityRecord>();

            // look for workflow definitions with a corresponding starting activity
            // it's important to return activities at this point and not workflows,
            // as a workflow definition could have multiple entry points with the same type of activity
            startedWorkflows.AddRange(_activityRepository.Table.Where(
                                          x => x.Name == name && x.Start && x.WorkflowDefinitionRecord.Enabled
                                          )
                                      );

            var awaitingActivities = new List <AwaitingActivityRecord>();

            // and any running workflow paused on this kind of activity for this content
            // it's important to return activities at this point as a workflow could be awaiting
            // on several ones. When an activity is restarted, all the other ones of the same workflow are cancelled.
            var awaitingQuery = _awaitingActivityRepository.Table.Where(x => x.ActivityRecord.Name == name && x.ActivityRecord.Start == false);

            awaitingQuery = target == null || target.ContentItem == null
                    ? awaitingQuery.Where(x => x.WorkflowRecord.ContentItemRecord == null)
                    : awaitingQuery.Where(x => x.WorkflowRecord.ContentItemRecord == target.ContentItem.Record);

            awaitingActivities.AddRange(awaitingQuery.ToList());

            // if no activity record is matching the event, do nothing
            if (!startedWorkflows.Any() && !awaitingActivities.Any())
            {
                return;
            }

            // if no activity record is matching the event, do nothing
            if (!startedWorkflows.Any() && !awaitingActivities.Any())
            {
                return;
            }

            // resume halted workflows
            foreach (var awaitingActivityRecord in awaitingActivities)
            {
                var workflowContext = new WorkflowContext {
                    Content = target,
                    Tokens  = tokens,
                    Record  = awaitingActivityRecord.WorkflowRecord
                };

                workflowContext.Tokens["Workflow"] = workflowContext;

                var activityContext = CreateActivityContext(awaitingActivityRecord.ActivityRecord, tokens);

                // check the condition
                try {
                    if (!activity.CanExecute(workflowContext, activityContext))
                    {
                        continue;
                    }
                }
                catch (Exception e) {
                    Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString());
                    continue;
                }

                ResumeWorkflow(awaitingActivityRecord, workflowContext, tokens);
            }

            // start new workflows
            foreach (var activityRecord in startedWorkflows)
            {
                var workflowContext = new WorkflowContext {
                    Content = target,
                    Tokens  = tokens,
                };

                workflowContext.Tokens["Workflow"] = workflowContext;

                var workflowRecord = new WorkflowRecord {
                    WorkflowDefinitionRecord = activityRecord.WorkflowDefinitionRecord,
                    State             = "{}",
                    ContentItemRecord = workflowContext.Content == null || workflowContext.Content.ContentItem == null
                            ? null
                            : workflowContext.Content.ContentItem.Record
                };

                workflowContext.Record = workflowRecord;

                var activityContext = CreateActivityContext(activityRecord, tokens);

                // check the condition
                try {
                    if (!activity.CanExecute(workflowContext, activityContext))
                    {
                        continue;
                    }
                }
                catch (Exception e) {
                    Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString());
                    continue;
                }

                StartWorkflow(workflowContext, activityRecord, tokens);
            }
        }
예제 #3
0
        public void TriggerEvent(string name, Func <Dictionary <string, object> > environmentContext)
        {
            var environment = environmentContext();
            var activity    = _activitiesManager.GetActivityByName(name);

            var startedWorkflows   = _activityDefinitionService.GetStartActivityDefinitions(name).AsQueryable();
            var awaitingActivities = _activityDefinitionService.GetAwaitingActivityDefinitions(name).AsQueryable();

            if (!startedWorkflows.Any() && !awaitingActivities.Any())
            {
                return;
            }

            foreach (var awaitingActivityDefinition in awaitingActivities)
            {
                var workflowContext = new WorkflowContext
                {
                    Environment = environment
                };

                var activityContext = CreateActivityContext(awaitingActivityDefinition.ActivityDefinition, environment);
                try
                {
                    if (!activity.CanExecute(workflowContext, activityContext))
                    {
                        continue;
                    }
                }
                catch (Exception e)
                {
                    continue;
                }

                ResumeWorkflow(awaitingActivityDefinition, workflowContext, environment);
            }

            foreach (var activityRecord in startedWorkflows)
            {
                var workflowContext = new WorkflowContext
                {
                    Environment = environment
                };

                var workflowRecord = new WorkflowInstance
                {
                    WorkflowDefinition = activityRecord.WorkflowDefinition
                };

                workflowContext.WorkflowInstance = workflowRecord;

                var activityContext = CreateActivityContext(activityRecord, environment);

                try
                {
                    if (!activity.CanExecute(workflowContext, activityContext))
                    {
                        continue;
                    }
                }
                catch (Exception e)
                {
                    continue;
                }

                StartWorkflow(workflowContext, activityRecord, environment);
            }
        }