コード例 #1
0
        //[Ignore("This test will fail until the clone activity is fixed")]
        public void ContinueTheOldWorkflow()
        {
            var workflow = CreateWorkflowWithUserAction();

            workflow.Save();

            var input = new Dictionary <string, object> {
                { "input", "my input" }
            };

            var run = RunWorkflow(workflow, input);

            Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunPaused, run.WorkflowRunStatus_Enum, "The workflow is paused");

            WorkflowUpdateHelper.Update(workflow.Id, () => { });

            var resumeEvent = new UserCompletesTaskEvent()
            {
                CompletionStateId = run.WorkflowBeingRun.FirstActivity.ForwardTransitions.First().Id,
                UserTaskId        = run.TaskWithinWorkflowRun.First().Id
            };

            // break the workflow
            workflow.Delete();

            run = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent);

            Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunCompleted, run.WorkflowRunStatus_Enum, "The workflow completed");
        }
コード例 #2
0
        private void ActOnTask(DisplayFormUserTask task, TransitionStart userResponse, List <Action> actions)
        {
            //TODO: Serialize the workflow runs like the trigger on save.
            var workflowRun = task.WorkflowRunForTask;

            if ((task.UserTaskIsComplete ?? false) && (workflowRun != null) && (workflowRun.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused))
            {
                var resumeEvent = new UserCompletesTaskEvent
                {
                    CompletionStateId = userResponse.Id,
                    UserTaskId        = task.Id
                };

                var    runId       = workflowRun.Id;
                var    runInThread = WorkflowRunContext.Current.RunTriggersInCurrentThread;
                Action act;

                if (Factory.FeatureSwitch.Get("longRunningWorkflow"))
                {
                    act = () => ActionOnTask_new(runId, resumeEvent, runInThread);
                }
                else
                {
                    act = () => ActionOnTask_old(runId, resumeEvent, runInThread);
                }

                WorkflowRunContext.Current.DeferAction(act);
            }
        }
コード例 #3
0
        void ActionOnTask_old(long runId, UserCompletesTaskEvent resumeEvent, bool runInThread)
        {
            Action act = () =>
            {
                using (new SecurityBypassContext())
                {
                    var run = Entity.Get <WorkflowRun>(runId);                       // If we don't do this we get caching problems


                    using (new WorkflowRunContext(true)
                    {
                        RunTriggersInCurrentThread = true
                    })
                    {
                        WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent);
                    }
                }
            };

            if (runInThread)
            {
                act();
            }
            else
            {
                WorkflowRunContext.Current.QueueAction(act);
            }
        }
コード例 #4
0
        void ActionOnTask_new(long runId, UserCompletesTaskEvent resumeEvent, bool runInThread)
        {
            BackgroundTask bgTask;

            using (new SecurityBypassContext())
            {
                var run = Entity.Get <WorkflowRun>(runId);                       // If we don't do this we get caching problems
                var wf  = run.WorkflowBeingRun;

                bgTask = ResumeWorkflowHandler.CreateBackgroundTask(run, resumeEvent);
            }

            if (runInThread)
            {
                Factory.BackgroundTaskManager.ExecuteImmediately(bgTask);
            }
            else
            {
                Factory.BackgroundTaskManager.EnqueueTask(bgTask);
            }
        }
コード例 #5
0
        //[RunAsDefaultTenant]
        //[Ignore("This workflow is not working due to clone not correctly cloning the first activity relationship.")]
        public void ContinueTheOldWorkflow()
        {
            var workflow = CreateWorkflowWithUserAction();

            workflow.Save();

            var input = new Dictionary <string, object> {
                { "input", "my input" }
            };

            WorkflowRun run;

            using (new WorkflowRunContext {
                RunTriggersInCurrentThread = true
            })
            {
                run = TestBase.RunWorkflow(workflow, input);
            }

            Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunPaused, run.WorkflowRunStatus_Enum, "The workflow is paused");

            UpgradeWithUpdate(workflow);

            var completionState = run.WorkflowBeingRun.FirstActivity.ForwardTransitions.First();

            // break the workflow
            workflow.Delete();

            var resumeEvent = new UserCompletesTaskEvent
            {
                CompletionStateId = completionState.Id,
                UserTaskId        = run.TaskWithinWorkflowRun.First().Id
            };

            run = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent);

            Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunCompleted, run.WorkflowRunStatus_Enum, "The workflow completed");
        }
コード例 #6
0
        public void OnAfterSave(IEnumerable <IEntity> entities, IDictionary <string, object> state)
        {
            var tasks = (List <BaseUserTask>)state[CompletedTasksKey];

            var actions = new List <Action>();
            var invoker = WorkflowInvoker.DefaultInvokerForThread;

            foreach (var task in tasks)
            {
                //TODO: Serialize the workflow runs like the trigger on save.
                if (task.WorkflowRunForTask != null &&
                    task.WorkflowRunForTask.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused)
                {
                    var resumeEvent = new UserCompletesTaskEvent()
                    {
                        CompletionState = task.UserResponse, UserTaskRef = task.Id
                    };
                    var run = task.WorkflowRunForTask;
                    actions.Add(() => WorkflowRunHelper.ResumeWorkflow(run, resumeEvent, invoker));
                }
            }

            RunActionsInThread(actions);
        }
コード例 #7
0
        public void TestDisplayFormDeleteInputParameter_Bug_25116()
        {
            using (new WorkflowRunContext {
                RunTriggersInCurrentThread = true
            })
            {
                IEntity  driver = null;
                Workflow wf     = null;

                try
                {
                    WorkflowRun run, run2;


                    #region Arrange
                    var driverType = new EntityRef("test", "driver");

                    driver = Entity.Create(driverType);
                    driver.SetField("core:name", "Test Delete Driver");
                    driver.Save();

                    wf      = Entity.Create <Workflow>();
                    wf.Name = "TEST WF";
                    wf.AddDefaultExitPoint();
                    wf.AddInput <ResourceArgument>("Input", Entity.Get <EntityType>(driverType));
                    wf.InputArgumentForAction = wf.InputArguments.First();

                    var i = Entity.Create <WfExpression>();
                    i.ArgumentToPopulate = wf.InputArgumentForAction;
                    wf.ExpressionMap     = new EntityCollection <WfExpression> {
                        i
                    };
                    wf.InputArgumentForAction.PopulatedByExpression = new EntityCollection <WfExpression> {
                        i
                    };

                    var uAExitA = Entity.Create <ExitPoint>();
                    uAExitA.Name = "Exit A";
                    uAExitA.ExitPointActionSummary = "Exit A action summary";
                    uAExitA.IsDefaultExitPoint     = true;
                    uAExitA.Save();

                    var userActionA = Entity.Create <DisplayFormActivity>();
                    userActionA.Name = "A";
                    userActionA.ExitPoints.Add(uAExitA);

                    var uA = userActionA.As <WfActivity>();
                    wf.AddActivity(uA);

                    ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Record", "[Input]");
                    ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Wait for next form", "true");
                    ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Hide comment field", "true");
                    ActivityTestHelper.AddExpressionToActivityArgument(wf, uA, "Record history", "false");
                    ActivityTestHelper.AddEntityExpression(wf, uA, uA.GetInputArgument("For Person"), new EntityRef("core", "administratorPerson"));
                    ActivityTestHelper.AddEntityExpression(wf, uA, uA.GetInputArgument("Form"), new EntityRef("test", "personForm"));
                    uA.Save();

                    var delete = Entity.Create <DeleteActivity>();
                    delete.Name = "Delete";

                    var d = delete.As <WfActivity>();
                    wf.AddActivity(d);

                    ActivityTestHelper.AddExpressionToActivityArgument(wf, d, "Record", "[Input]");
                    d.Save();

                    var uBExitC = Entity.Create <ExitPoint>();
                    uBExitC.Name = "Exit C";
                    uBExitC.ExitPointActionSummary = "Exit C action summary";
                    uBExitC.IsDefaultExitPoint     = true;
                    uBExitC.Save();

                    var userActionB = Entity.Create <DisplayFormActivity>();
                    userActionB.Name = "B";
                    userActionB.ExitPoints.Add(uBExitC);

                    var uB = userActionB.As <WfActivity>();
                    wf.AddActivity(uB);

                    ActivityTestHelper.AddEntityExpression(wf, uB, uB.GetInputArgument("For Person"), new EntityRef("core", "administratorPerson"));
                    uB.Save();

                    ActivityTestHelper.AddMissingExpressionParametersToWorkflow(wf);

                    wf.Save();
                    #endregion

                    // Act
                    var wfInput = new Dictionary <string, object> {
                        { "Input", driver }
                    };

                    using (new WorkflowRunContext(true))
                    {
                        run = RunWorkflow(wf, wfInput);
                    }
                    run.WorkflowRunStatus_Enum.Should().Be(WorkflowRunState_Enumeration.WorkflowRunPaused);
                    run.PendingActivity.Should().NotBeNull();
                    run.PendingActivity.Name.Should().Be("A");
                    run.TaskWithinWorkflowRun.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1);

                    var userTaskA = run.TaskWithinWorkflowRun.First().AsWritable <DisplayFormUserTask>();
                    userTaskA.AvailableTransitions.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1);
                    userTaskA.WorkflowRunForTask.Id.Should().Be(run.Id);

                    var resumeEvent = new UserCompletesTaskEvent
                    {
                        CompletionStateId = userTaskA.AvailableTransitions.First(t => t.Name == "Exit A").Id,
                        UserTaskId        = run.TaskWithinWorkflowRun.First().Id
                    };

                    using (new WorkflowRunContext(true))
                    {
                        run2 = WorkflowRunner.Instance.ResumeWorkflow(run, resumeEvent);
                    }

                    // Assert
                    run2.WorkflowRunStatus_Enum.Should().Be(WorkflowRunState_Enumeration.WorkflowRunPaused);
                    run2.PendingActivity.Should().NotBeNull();
                    run2.PendingActivity.Name.Should().Be("B");
                    run2.TaskWithinWorkflowRun.Should().NotBeNull().And.NotBeEmpty().And.HaveCount(1);

                    var deletedDriver = Entity.Exists(new EntityRef(driver.Id));
                    deletedDriver.Should().BeFalse();
                }
                finally
                {
                    if (wf != null)
                    {
                        ToDelete.Add(wf.Id);
                    }
                    if (driver != null && Entity.Exists(new EntityRef(driver.Id)))
                    {
                        ToDelete.Add(driver.Id);
                    }
                }
            }
        }