private IList <WorkflowTransition> ToWorkflowTransitions(IEnumerable <SqlWorkflowTransition> sqlWorkflowTransitions, int currentUserId)
 {
     return(sqlWorkflowTransitions.Select(wt =>
     {
         var transition = new WorkflowTransition
         {
             Id = wt.WorkflowEventId,
             ToState = new WorkflowState
             {
                 WorkflowId = wt.WorkflowId,
                 Id = wt.ToStateId,
                 Name = wt.ToStateName
             },
             FromState = new WorkflowState
             {
                 WorkflowId = wt.WorkflowId,
                 Id = wt.FromStateId,
                 Name = wt.FromStateName
             },
             Name = string.IsNullOrWhiteSpace(wt.WorkflowEventName) ?
                    $"To: {wt.ToStateName}" :
                    wt.WorkflowEventName,
             WorkflowId = wt.WorkflowId
         };
         transition.Triggers.AddRange(ToWorkflowTriggers(SerializationHelper.FromXml <XmlWorkflowEventTriggers>(wt.Triggers), currentUserId));
         return transition;
     }).ToList());
 }
        /// <summary>
        /// Creates the workflow.
        /// </summary>
        /// <param name="id">Id to use for this workflow.</param>
        /// <param name="externalServiceUrl">External URL to invoke.</param>
        /// <param name="serviceIdentityTokenSource">The token source to use when authenticating to external services.</param>
        /// <param name="serializerSettingsProvider">The serialization settings provider.</param>
        /// <param name="externalServiceActionLogger">The logger for <see cref="InvokeExternalServiceAction"/>s.</param>
        /// <returns>The workflow definition.</returns>
        public static Workflow Create(
            string id,
            string externalServiceUrl,
            IServiceIdentityAccessTokenSource serviceIdentityTokenSource,
            IJsonSerializerSettingsProvider serializerSettingsProvider,
            ILogger <InvokeExternalServiceAction> externalServiceActionLogger)
        {
            var workflow = new Workflow(
                id,
                "External Action workflow",
                "Simple workflow using an external action");

            WorkflowState waitingToRun = workflow.CreateState(displayName: "Waiting to run");
            WorkflowState done         = workflow.CreateState(displayName: "Done");

            workflow.SetInitialState(waitingToRun);

            WorkflowTransition transition = waitingToRun.CreateTransition(done);
            var action = new InvokeExternalServiceAction(
                serviceIdentityTokenSource,
                serializerSettingsProvider,
                externalServiceActionLogger)
            {
                Id = Guid.NewGuid().ToString(),
                AuthenticateWithManagedServiceIdentity = true,
                MsiAuthenticationResource = "foobar",
                ExternalUrl           = externalServiceUrl,
                ContextItemsToInclude = new[] { "include1", "include2" },
            };

            transition.Actions.Add(action);

            return(workflow);
        }
Example #3
0
        public void AggregateActionTests()
        {
            //arrange
            var actionList = new List <IAction <string, Customer> >
            {
                new ActionOne(),
                new ActionTwo()
            };

            var sut = new AggregateAction <string, Customer>(actionList);

            var customer = new Customer {
                Id = 2, Name = "Test Customer"
            };

            var wf = new DefaultWorkflow <Customer>(Guid.NewGuid().ToString(),
                                                    Mock.SimpleWorkflowDefinition(),
                                                    customer);

            var graph = wf.ToDotGraph();

            graph.ShouldNotBeNullOrEmpty();
            output.WriteLine(graph);

            var trigger = wf.PermittedTriggers.First();
            var state   = wf.CurrentState;

            var transition = new WorkflowTransition <string, Customer>();

            sut.Execute(wf, transition);
        }
Example #4
0
        public static WorkflowTransitionDto FromDomain(WorkflowTransition transition)
        {
            var result = new WorkflowTransitionDto {
                Expression = transition.Expression, Roles = transition.Roles?.ToArray()
            };

            return(result);
        }
        public static void AddTraceAction(this WorkflowTransition transition)
        {
            var action = new TraceAction {
                Message = $"Executing transition '{transition.DisplayName}'"
            };

            transition.Actions.Add(action);
        }
Example #6
0
 public void WorkflowTransitionCollectionAddNew()
 {
     var sut = new WorkflowTransitionCollection<string,Customer>();
     var t = new WorkflowTransition<string,Customer>(new WorkflowState<string, Customer>("Start"),
                                                     new WorkflowState<string,Customer>("End"),
                                                     new WorkflowTrigger<string>("trigger1"));
     sut.Add(t);
     sut.Count.ShouldBe(1);
 }
        public static WorkflowTransitionDto?FromWorkflowTransition(WorkflowTransition transition)
        {
            if (transition == null)
            {
                return(null);
            }

            return(new WorkflowTransitionDto {
                Expression = transition.Expression, Roles = transition.Roles
            });
        }
Example #8
0
        public WorkflowTransition ToTransition()
        {
            var roles = Roles;

            if (!string.IsNullOrEmpty(Role))
            {
                roles = new[] { Role };
            }

            return(WorkflowTransition.When(Expression, roles));
        }
 private void UpdateWorkflowState(IWorkflow workflow, WorkflowResult result, WorkflowTransition transition)
 {
     if (result.NewState.Name != null && (workflow.CurrentState == null || result.NewState.Name != workflow.CurrentState.Name))
     {
         workflow.CurrentState = result.NewState;
         if (transition != null)
         {
             workflow.CurrentState.Entry = transition;
         }
     }
 }
Example #10
0
        private bool CanUse(WorkflowTransition transition, NamedContentData data, ClaimsPrincipal user)
        {
            if (!string.IsNullOrWhiteSpace(transition.Role))
            {
                if (!user.Claims.Any(x => x.Type == ClaimTypes.Role && x.Value == transition.Role))
                {
                    return(false);
                }
            }

            if (!string.IsNullOrWhiteSpace(transition.Expression))
            {
                return(scriptEngine.Evaluate("data", data, transition.Expression));
            }

            return(true);
        }
        /// <summary>
        /// Processes the specified workflow, executing the specified <paramref name="transition"/> with the given <paramref name="request"/>
        /// </summary>
        /// <param name="workflow">The workflow.</param>
        /// <param name="transition">The transition.</param>
        /// <param name="request">The request.</param>
        public void Process(IWorkflow workflow, WorkflowTransition transition, WorkflowRequest request)
        {
            Log.DebugFormat("Process({0}, {1}, {2})", workflow, transition, request);
            //TODO: Block concurrent calls to Start/Process?
            Unloaded.Reset();
            Result      = new WorkflowResult();
            Application = CreateWorkflowApplication(null);
            if (!CheckForRunnableInstance())
            {
                Application.Load(workflow.WorkflowInstanceId);
            }
            else
            {
                Application.LoadRunnableInstance();
            }

            Application.ResumeBookmark(transition.Name, request);
        }
        /// <summary>
        /// Processes the specified activity.
        /// </summary>
        /// <param name="activity">The activity.</param>
        /// <param name="workflow">The workflow.</param>
        /// <param name="transition">The transition.</param>
        /// <param name="request">The request.</param>
        /// <param name="timeout">The timeout.</param>
        public void Process(Activity activity, IWorkflow workflow, WorkflowTransition transition, WorkflowRequest request, TimeSpan timeout)
        {
            //Guard.AgainstNull(() => activity);
            //Guard.AgainstNull(() => workflow);
            //Guard.AgainstNull(() => transition);
            //Guard.AgainstNull(() => request);

            var instance = new IntellitideWorkflowInstance(activity, FrameworkEnvironment.Instance.Container);

            using (new TransactionScope(TransactionScopeOption.Suppress))
            {
                instance.Process(workflow, transition, request);
                if (!instance.WaitOne(timeout))
                {
                    throw new TimeoutException("Timeout waiting for unload from workflow engine");
                }
            }
            UpdateWorkflowState(workflow, instance.Result, transition);
        }
        /// <summary>
        /// Processes the specified workflow, executing the specified <paramref name="transition"/> with the given <paramref name="request"/>
        /// </summary>
        /// <param name="workflow">The workflow.</param>
        /// <param name="transition">The transition.</param>
        /// <param name="request">The request.</param>
        public void Process(WorkflowInstance workflow, WorkflowTransition transition, WorkflowRequest request)
        {
            Log.Debug($"Process({workflow}, {transition}, {request})");
            //TODO: Block concurrent calls to Start/Process?
            Unloaded.Reset();
            Result      = new WorkflowResult();
            Application = CreateWorkflowApplication(workflow, false);
            //UnloadApplication(Application);
            if (!CheckForRunnableInstance())
            {
                Application.Load(workflow.InstanceId);
            }
            else
            {
                Application.LoadRunnableInstance();
            }

            Application.ResumeBookmark(transition.Name, request);
        }
Example #14
0
        public void Should_serialize_and_deserialize()
        {
            var workflow = new Workflow(
                Status.Draft, new Dictionary <Status, WorkflowStep>
            {
                [Status.Draft] = new WorkflowStep(
                    new Dictionary <Status, WorkflowTransition>
                {
                    [Status.Published] = WorkflowTransition.When("Expression", "Role1", "Role2")
                },
                    "#00ff00",
                    NoUpdate.When("Expression", "Role1", "Role2"))
            }, new List <DomainId> {
                DomainId.NewGuid()
            }, "MyName");

            var serialized = workflow.SerializeAndDeserialize();

            serialized.Should().BeEquivalentTo(workflow);
        }
Example #15
0
        public void Should_serialize_and_deserialize()
        {
            var workflow = new Workflow(
                Status.Draft,
                new Dictionary <Status, WorkflowStep>
            {
                [Status.Draft] = new WorkflowStep(
                    new Dictionary <Status, WorkflowTransition>
                {
                    [Status.Published] = WorkflowTransition.When("Expression", "Role1", "Role2")
                }.ToReadonlyDictionary(),
                    "#00ff00",
                    NoUpdate.When("Expression", "Role1", "Role2"))
            }.ToReadonlyDictionary(),
                ReadonlyList.Create(DomainId.NewGuid()), "MyName");

            var serialized = workflow.SerializeAndDeserialize();

            Assert.Equal(workflow, serialized);
        }
        public async Task ExecuteInternal_WhenSynchronouTriggersErrors_ThrowsConflictException()
        {
            // Arrange
            _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId))
            .ReturnsAsync(false);
            _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo()
            {
                TenantId = Guid.NewGuid().ToString()
            });

            var vcArtifactInfo = new VersionControlArtifactInfo
            {
                Id           = ArtifactId,
                VersionCount = CurrentVersionId,
                LockedByUser = new UserGroup
                {
                    Id = UserId
                }
            };

            _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId))
            .ReturnsAsync(vcArtifactInfo);

            var fromState = new WorkflowState
            {
                Id         = FromStateId,
                WorkflowId = WorkflowId,
                Name       = "Ready"
            };

            _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true))
            .ReturnsAsync(fromState);

            var toState = new WorkflowState
            {
                Id         = ToStateId,
                Name       = "Close",
                WorkflowId = WorkflowId
            };
            var transition = new WorkflowTransition()
            {
                FromState  = fromState,
                Id         = TransitionId,
                ToState    = toState,
                WorkflowId = WorkflowId,
                Name       = "Ready to Closed"
            };

            _workflowRepository.Setup(
                t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(transition);

            var workflowEventAction = new Mock <IWorkflowEventAction>();

            workflowEventAction.Setup(a => a.ValidateAction(It.IsAny <IExecutionParameters>())).Returns(new PropertySetResult(-1, -1, ""));
            var triggerContainer = new WorkflowTriggersContainer();

            triggerContainer.SynchronousTriggers.Add(new WorkflowEventTrigger()
            {
                Action = workflowEventAction.Object,
                Name   = "Test'"
            });

            _workflowRepository.Setup(
                t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(triggerContainer);

            _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>()))
            .ReturnsAsync((WorkflowState)null);

            // Act
            await _stateChangeExecutor.Execute();
        }
 public WorkflowTransition ToWorkflowTransition()
 {
     return WorkflowTransition.When(Expression, Roles);
 }
        public async Task ExecuteInternal_StateChangeAndPublish_CallsBoth()
        {
            // Arrange
            _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId))
            .ReturnsAsync(false);
            _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo()
            {
                TenantId = Guid.NewGuid().ToString()
            });

            var vcArtifactInfo = new VersionControlArtifactInfo
            {
                Id           = ArtifactId,
                VersionCount = CurrentVersionId,
                LockedByUser = new UserGroup
                {
                    Id = UserId
                }
            };

            _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId))
            .ReturnsAsync(vcArtifactInfo);

            var fromState = new WorkflowState
            {
                Id         = FromStateId,
                WorkflowId = WorkflowId,
                Name       = "Ready"
            };

            _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true))
            .ReturnsAsync(fromState);

            var toState = new WorkflowState
            {
                Id         = ToStateId,
                Name       = "Close",
                WorkflowId = WorkflowId
            };
            var transition = new WorkflowTransition()
            {
                FromState  = fromState,
                Id         = TransitionId,
                ToState    = toState,
                WorkflowId = WorkflowId,
                Name       = "Ready to Closed"
            };

            _workflowRepository.Setup(
                t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(transition);
            _workflowRepository.Setup(
                t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(new WorkflowTriggersContainer());

            _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>()))
            .ReturnsAsync((WorkflowState)null);

            // Act
            await _stateChangeExecutor.Execute();

            // Assert
            _workflowRepository.Verify(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true));
            _versionControlService.Verify(t => t.PublishArtifacts(It.IsAny <PublishParameters>(), It.IsAny <IDbTransaction>()));
        }
        public async Task ExecuteInternal_CouldNotChangeState_ReturnsFailedResult()
        {
            // Arrange
            _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId))
            .ReturnsAsync(false);
            _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo()
            {
                TenantId = Guid.NewGuid().ToString()
            });

            var vcArtifactInfo = new VersionControlArtifactInfo
            {
                Id           = ArtifactId,
                VersionCount = CurrentVersionId,
                LockedByUser = new UserGroup
                {
                    Id = UserId
                }
            };

            _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId))
            .ReturnsAsync(vcArtifactInfo);

            var fromState = new WorkflowState
            {
                Id         = FromStateId,
                WorkflowId = WorkflowId,
                Name       = "Ready"
            };

            _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true))
            .ReturnsAsync(fromState);

            var toState = new WorkflowState
            {
                Id         = ToStateId,
                Name       = "Close",
                WorkflowId = WorkflowId
            };
            var transition = new WorkflowTransition()
            {
                FromState  = fromState,
                Id         = TransitionId,
                ToState    = toState,
                WorkflowId = WorkflowId,
                Name       = "Ready to Closed"
            };

            _workflowRepository.Setup(
                t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(transition);
            _workflowRepository.Setup(
                t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId))
            .ReturnsAsync(new WorkflowTriggersContainer());

            _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>()))
            .ReturnsAsync((WorkflowState)null);

            // Act
            var result = await _stateChangeExecutor.Execute();

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(QueryResultCode.Failure, result.ResultCode);
        }
Example #20
0
        public JsonWorkflowTransition(WorkflowTransition transition)
        {
            Roles = transition.Roles?.ToArray();

            Expression = transition.Expression;
        }
        public async Task GetTransitionsAsync_ChangeStateForArtifactAsync_SuccessfullyCallsRepo()
        {
            // Arrange
            int       itemId       = 1;
            int       userId       = 1;
            int       workflowId   = 4;
            int       fromStateId  = 2;
            int       toStateId    = 5;
            const int transitionId = 10;

            var vcArtifactInfo = new VersionControlArtifactInfo
            {
                Id           = itemId,
                VersionCount = 10,
                LockedByUser = new UserGroup
                {
                    Id = userId
                }
            };

            _artifactVersionsRepositoryMock.Setup(t => t.IsItemDeleted(itemId))
            .ReturnsAsync(false);
            _artifactVersionsRepositoryMock.Setup(t => t.GetVersionControlArtifactInfoAsync(itemId, null, 1))
            .ReturnsAsync(vcArtifactInfo);
            _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo()
            {
                TenantId = Guid.NewGuid().ToString()
            });

            var wfStateChangeParam = new WorkflowStateChangeParameter
            {
                CurrentVersionId = 10,
                ToStateId        = toStateId,
                FromStateId      = fromStateId,
                TransitionId     = transitionId
            };

            var fromState = new WorkflowState
            {
                Id         = fromStateId,
                WorkflowId = workflowId,
                Name       = "Ready"
            };
            var toState = new WorkflowState
            {
                Id         = toStateId,
                Name       = "Close",
                WorkflowId = workflowId
            };

            _workflowRepositoryMock.Setup(t => t.GetStateForArtifactAsync(userId, itemId, int.MaxValue, true))
            .ReturnsAsync(fromState);

            var transition = new WorkflowTransition()
            {
                FromState  = fromState,
                Id         = transitionId,
                ToState    = toState,
                WorkflowId = workflowId,
                Name       = "Ready to Closed"
            };

            _workflowRepositoryMock.Setup(
                t => t.GetTransitionForAssociatedStatesAsync(userId, itemId, workflowId, fromStateId, toStateId, transitionId))
            .ReturnsAsync(transition);
            _workflowRepositoryMock.Setup(
                t => t.GetWorkflowEventTriggersForTransition(userId, itemId, workflowId, fromStateId, toStateId, transitionId))
            .ReturnsAsync(new WorkflowTriggersContainer());


            _workflowRepositoryMock.Setup(t => t.ChangeStateForArtifactAsync(1, itemId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>()))
            .ReturnsAsync(toState);

            // Act
            var result = await _workflowServiceMock.ChangeStateForArtifactAsync(1, "admin", itemId, wfStateChangeParam);

            // Assert
            Assert.AreEqual(toState, result.Item);
            Assert.AreEqual(QueryResultCode.Success, result.ResultCode);
        }
        /// <summary>
        /// Creates an instance of a ficticious workflow for testing purposes.
        /// </summary>
        /// <param name="id">The id to give the new workflow.</param>
        /// <param name="workflowMessageQueue">The message queue to send workflow messages via.</param>
        /// <returns>
        /// The new <see cref="Workflow" />.
        /// </returns>
        /// <remarks>
        /// <para>
        ///     The workflow generated is shown in the following diagram:
        /// </para>
        /// <code>
        ///                          Start
        ///                            |
        ///                            |
        ///                    +-------v-------+
        ///                    |               |
        ///                    | Initializing  |
        ///                    |               |
        ///                    +-------+-------+
        ///                            |
        ///                            | Create
        ///                            |
        ///                    +-------v-------+
        ///                    |               |
        ///                    | Waiting for   |
        ///             +------+ documentation |
        ///             |      |               |
        ///             |      +-------+-------+
        ///             |              |
        ///       Edit                 | Publish
        ///       (incomplete)         |
        ///             |      +-------v-------+               +---------------+
        ///             |      |               |               |               |
        ///             +------+   Published   |  Deprecate    |  Deprecated   |
        ///                    |               +--------------->    (end)      |
        ///             +------>               |               |               |
        ///             |      +--+---------+--+               +---------------+
        ///             |         |         |
        ///        Edit +---------+         | Delete
        ///        (complete)               |
        ///                    +------------v--+
        ///                    |               |
        ///                    |    Deleted    |
        ///                    |     (end)     |
        ///                    |               |
        ///                    +---------------+
        /// </code>
        /// <para>
        ///     To assist with testing it has the following notable points:
        ///     <list type="bullet">
        ///         <item>
        ///             <description>
        ///                 The initial state, "Initializing" will validate the context properties
        ///                 and self-trigger a transition to "Waiting for documentation.
        ///             </description>
        ///         </item>
        ///         <item>
        ///             <description>
        ///                 Every state has a TraceAction added to its entry and exit actions lists
        ///                 so that tests can verify the expected actions were called in the expected
        ///                 order.
        ///             </description>
        ///         </item>
        ///         <item>
        ///             <description>
        ///                 Every transition has a TraceAction added to it for the same reason.
        ///             </description>
        ///         </item>
        ///     </list>
        /// </para>
        /// </remarks>
        public static Workflow Create(string id, IWorkflowMessageQueue workflowMessageQueue)
        {
            var dataCatalogItemRepositoryFactory = new DataCatalogItemRepositoryFactory();

            var workflow = new Workflow(
                id,
                "Data Catalog item workflow",
                "Controls the lifecycle of a data catalog item");

            WorkflowState initializing            = workflow.CreateState(displayName: "Waiting for initialization");
            WorkflowState waitingForDocumentation = workflow.CreateState(displayName: "Waiting for documentation");
            WorkflowState published  = workflow.CreateState(displayName: "Published");
            WorkflowState deleted    = workflow.CreateState(displayName: "Deleted");
            WorkflowState deprecated = workflow.CreateState(displayName: "Deprecated");

            workflow.SetInitialState(initializing);

            initializing.EntryConditions.Add(
                new ContextItemsPresentCondition {
                RequiredContextItems = new[] { "Identifier", "Type" }
            });
            initializing.AddTraceActionForEntry();
            initializing.EntryActions.Add(new SendCreateCatalogItemTriggerAction(workflowMessageQueue));
            initializing.AddTraceActionForExit();

            waitingForDocumentation.AddTraceActionForEntry();
            waitingForDocumentation.AddTraceActionForExit();
            waitingForDocumentation.ExitConditions.Add(
                new ContextItemsPresentCondition {
                RequiredContextItems = new[] { "AllowWaitingForDocumentationExit" }
            });

            published.AddTraceActionForEntry();
            published.AddTraceActionForExit();
            published.EntryConditions.Add(
                new ContextItemsPresentCondition {
                RequiredContextItems = new[] { "AllowPublishedEntry" }
            });

            deleted.AddTraceActionForEntry();
            deleted.AddTraceActionForExit();

            deprecated.AddTraceActionForEntry();
            deprecated.AddTraceActionForExit();

            WorkflowTransition createCatalogItemTransition =
                initializing.CreateTransition(waitingForDocumentation, displayName: "Create catalog item");

            createCatalogItemTransition.Conditions.Add(
                new TriggerContentTypeCondition
            {
                TriggerContentType = CreateCatalogItemTrigger.RegisteredContentType,
            });
            createCatalogItemTransition.Conditions.Add(new CatalogItemIdCondition());
            createCatalogItemTransition.Actions.Add(new CreateCatalogItemAction(dataCatalogItemRepositoryFactory));
            createCatalogItemTransition.AddTraceAction();

            WorkflowTransition waitingForDocumentationEditTransition =
                waitingForDocumentation.CreateTransition(waitingForDocumentation, displayName: "Edit");

            waitingForDocumentationEditTransition.Conditions.Add(
                new TriggerContentTypeCondition {
                TriggerContentType = EditCatalogItemTrigger.RegisteredContentType
            });
            waitingForDocumentationEditTransition.Conditions.Add(new CatalogItemIdCondition());
            waitingForDocumentationEditTransition.Actions.Add(
                new ApplyCatalogItemPatchAction(dataCatalogItemRepositoryFactory));
            waitingForDocumentationEditTransition.AddTraceAction();

            WorkflowTransition waitingForDocumentationPublishTransition =
                waitingForDocumentation.CreateTransition(published, displayName: "Publish");

            waitingForDocumentationPublishTransition.Conditions.Add(
                new TriggerContentTypeCondition
            {
                TriggerContentType = PublishCatalogItemTrigger.RegisteredContentType,
            });
            waitingForDocumentationPublishTransition.Conditions.Add(new CatalogItemIdCondition());
            waitingForDocumentationPublishTransition.Conditions.Add(
                new CatalogItemCompleteCondition(dataCatalogItemRepositoryFactory));
            waitingForDocumentationPublishTransition.AddTraceAction();

            WorkflowTransition publishedEditCompleteTransition =
                published.CreateTransition(published, displayName: "Edit (complete)");

            publishedEditCompleteTransition.Conditions.Add(
                new TriggerContentTypeCondition {
                TriggerContentType = EditCatalogItemTrigger.RegisteredContentType
            });
            publishedEditCompleteTransition.Conditions.Add(new CatalogItemIdCondition());
            publishedEditCompleteTransition.Conditions.Add(
                new CatalogItemWillBeCompleteCondition(dataCatalogItemRepositoryFactory)
            {
                ExpectedResult = true
            });
            publishedEditCompleteTransition.Actions.Add(
                new ApplyCatalogItemPatchAction(dataCatalogItemRepositoryFactory));
            publishedEditCompleteTransition.AddTraceAction();

            WorkflowTransition publishedEditIncompleteTransition =
                published.CreateTransition(waitingForDocumentation, displayName: "Edit (incomplete)");

            publishedEditIncompleteTransition.Conditions.Add(
                new TriggerContentTypeCondition {
                TriggerContentType = EditCatalogItemTrigger.RegisteredContentType
            });
            publishedEditIncompleteTransition.Conditions.Add(new CatalogItemIdCondition());
            publishedEditIncompleteTransition.Conditions.Add(
                new CatalogItemWillBeCompleteCondition(dataCatalogItemRepositoryFactory)
            {
                ExpectedResult = false
            });
            publishedEditIncompleteTransition.Actions.Add(
                new ApplyCatalogItemPatchAction(dataCatalogItemRepositoryFactory));
            publishedEditIncompleteTransition.AddTraceAction();

            WorkflowTransition publishedDeleteTransition = published.CreateTransition(deleted, displayName: "Delete");

            publishedDeleteTransition.Conditions.Add(
                new TriggerContentTypeCondition
            {
                TriggerContentType = DeleteCatalogItemTrigger.RegisteredContentType,
            });
            publishedDeleteTransition.Conditions.Add(new CatalogItemIdCondition());
            publishedDeleteTransition.AddTraceAction();

            WorkflowTransition publishedDeprecateTransition = published.CreateTransition(deprecated, displayName: "Deprecate");

            publishedDeprecateTransition.Conditions.Add(
                new TriggerContentTypeCondition
            {
                TriggerContentType = DeprecateCatalogItemTrigger.RegisteredContentType,
            });
            publishedDeprecateTransition.Conditions.Add(new CatalogItemIdCondition());
            publishedDeprecateTransition.AddTraceAction();

            return(workflow);
        }
Example #23
0
 public static WorkflowTransitionDto FromWorkflowTransition(WorkflowTransition transition)
 {
     return(new WorkflowTransitionDto {
         Expression = transition.Expression, Roles = transition.Roles?.ToArray()
     });
 }
Example #24
0
 public void Execute(IWorkflow <string, Customer> workflow, WorkflowTransition <string, Customer> transition)
 {
     WriteLine($"ActionThree action executed: {workflow.GetType().Name}. Context Object: {workflow.Context.GetType().Name}");
 }
Example #25
0
 public async Task ExecuteAsync(IWorkflow <string, Customer> workflow, WorkflowTransition <string, Customer> transition)
 {
     //TODO: implement async
     throw new NotImplementedException();
 }
 public JsonWorkflowTransition(WorkflowTransition transition)
 {
     SimpleMapper.Map(transition, this);
 }
Example #27
0
        public static SocketDesignGraph Build()
        {
            ScanState scanState = new ScanState()
            {
                Name = ScanState.Identifier
            };
            RectifyState rectifyState = new RectifyState()
            {
                Name = RectifyState.Identifier
            };
            SocketDesignState socketState = new SocketDesignState()
            {
                Name = SocketDesignState.Identifier
            };

            SocketDesignGraph graph   = new SocketDesignGraph();
            WorkflowBuilder   builder = new WorkflowBuilder(graph);

            graph.AddState(scanState);
            graph.AddState(rectifyState);
            graph.AddState(socketState);


            WorkflowTransition toRectify = graph.AddTransition(scanState, rectifyState);

            toRectify.BeforeTransition.Add(() => {
                OG.Context.TransformManager.SetActiveGizmoType(TransformManager.NoGizmoType);
                OGActions.InitializeLegFromScan();
            });


            WorkflowTransition toSocket = graph.AddTransition(rectifyState, socketState);

            toSocket.BeforeTransition.Add(() => {
                OG.Context.TransformManager.SetActiveGizmoType(TransformManager.NoGizmoType);
            });

            WorkflowTransition backToRectify = graph.AddTransition(socketState, rectifyState);

            backToRectify.BeforeTransition.Add(() => {
                OG.Context.TransformManager.SetActiveGizmoType(TransformManager.NoGizmoType);
            });



            // scan tool states

            var trimScanTool = builder.AddState(OGWorkflow.TrimScanState, OGActions.BeginTrimScanTool);

            builder.AddTransition(scanState, trimScanTool, OGWorkflow.TrimScanStartT, OGActions.CanTrimScan, null, null);
            builder.AddTransition(trimScanTool, scanState, OGWorkflow.TrimScanAcceptT, OGActions.CanAcceptTrimScanTool, OGActions.AcceptTrimScanTool, null);
            builder.AddTransition(trimScanTool, scanState, OGWorkflow.TrimScanCancelT, null, OGActions.CancelTrimScanTool, null);

            var alignScanTool = builder.AddState(OGWorkflow.AlignScanState, OGActions.BeginAlignScanTool);

            builder.AddTransition(scanState, alignScanTool, OGWorkflow.AlignScanStartT, OGActions.CanAlignScan, null, null);
            builder.AddTransition(alignScanTool, scanState, OGWorkflow.AlignScanAcceptT, OGActions.CanAcceptAlignScanTool, OGActions.AcceptAlignScanTool, null);
            builder.AddTransition(alignScanTool, scanState, OGWorkflow.AlignScanCancelT, null, OGActions.CancelAlignScanTool, null);


            // rectify tool states

            var drawAreaTool = builder.AddState(OGWorkflow.DrawAreaState, OGActions.BeginDrawAreaTool);

            builder.AddTransition(rectifyState, drawAreaTool, OGWorkflow.DrawAreaStartT, OGActions.CanDrawArea, null, null);
            builder.AddTransition(drawAreaTool, rectifyState, OGWorkflow.DrawAreaExitT, null, OGActions.EndDrawAreaTool, null);

            var deformRingTool = builder.AddState(OGWorkflow.AddDeformRingState, OGActions.BeginDeformRingTool);

            builder.AddTransition(rectifyState, deformRingTool, OGWorkflow.AddDeformRingStartT, OGActions.CanAddDeformRing, null, null);
            builder.AddTransition(deformRingTool, rectifyState, OGWorkflow.AddDeformRingAcceptT, OGActions.CanAcceptDeformRingTool, OGActions.AcceptDeformRingTool, null);
            builder.AddTransition(deformRingTool, rectifyState, OGWorkflow.AddDeformRingCancelT, null, OGActions.CancelDeformRingTool, null);

            var sculptAreaTool = builder.AddState(OGWorkflow.SculptAreaState, OGActions.BeginSculptCurveTool);

            builder.AddTransition(rectifyState, sculptAreaTool, OGWorkflow.SculptAreaStartT, OGActions.CanSculptCurve, null, null);
            builder.AddTransition(sculptAreaTool, rectifyState, OGWorkflow.SculptAreaExitT, null, OGActions.EndSculptCurveTool, null);



            // socket tool states
            var drawTrimlineTool = builder.AddState(OGWorkflow.DrawTrimlineState, OGActions.BeginDrawTrimLineTool);

            builder.AddTransition(socketState, drawTrimlineTool, OGWorkflow.DrawTrimlineStartT, OGActions.CanDrawTrimLine, null, null);
            builder.AddTransition(drawTrimlineTool, socketState, OGWorkflow.DrawTrimlineExitT, null, OGActions.EndDrawTrimLineTool, null);

            var planeTrimlineTool = builder.AddState(OGWorkflow.PlaneTrimlineState, OGActions.BeginPlaneTrimLineTool);

            builder.AddTransition(socketState, planeTrimlineTool, OGWorkflow.PlaneTrimlineStartT, OGActions.CanAddPlaneTrimLine, null, null);
            builder.AddTransition(planeTrimlineTool, socketState, OGWorkflow.PlaneTrimlineAcceptT, OGActions.CanAcceptPlaneTrimLineTool, OGActions.AcceptPlaneTrimLineTool, null);
            builder.AddTransition(planeTrimlineTool, socketState, OGWorkflow.PlaneTrimlineCancelT, null, OGActions.CancelPlaneTrimLineTool, null);

            var sculptTrimlineTool = builder.AddState(OGWorkflow.SculptTrimlineState, OGActions.BeginSculptCurveTool);

            builder.AddTransition(socketState, sculptTrimlineTool, OGWorkflow.SculptTrimlineStartT, OGActions.CanSculptCurve, null, null);
            builder.AddTransition(sculptTrimlineTool, socketState, OGWorkflow.SculptTrimlineExitT, null, OGActions.EndSculptCurveTool, null);


            graph.LogF = DebugUtil.Log;   // print debug output


            return(graph);
        }
Example #28
0
        public static void ProcessWorkflow(this RigOapChecklist rigOapChecklist, IRigOapChecklistWorkflowService rigOapChecklistWorkflowService, IWorkflowEngineService workflowEngineService, IWorkflowService workflowService, WorkflowTransition transition, WorkflowRequest request, ILog log)
        {
            var workflow = workflowService.GetActiveWorkflow(rigOapChecklist.OapChecklist.OapType.ChecklistLayoutId.Value);

            //Create the Workflow Activity
            var workflowActivity = workflow.GetActivity(rigOapChecklist.Id);

            if (workflowActivity == null)
            {
                log.Error($" Workflow Activity was not found for checklist : { rigOapChecklist.Id}");
                return;
            }

            //Create the RigOapChecklistWorkflow instance
            var rigChecklistWorkflow = rigOapChecklistWorkflowService.GetWorkflowByChecklist(rigOapChecklist.Id);

            if (rigChecklistWorkflow == null)
            {
                log.Error($" Workflow instance was not found for checklist : { rigOapChecklist.Id}");
                return;
            }

            var version = new Version(workflow.Major, workflow.Minor);

            //Start the Workflow Instance and All the store the instance details

            //Get the Current Principal And Assign Him to Workflow to
            workflowEngineService.Process(workflowActivity, version, rigChecklistWorkflow, transition, request);
        }
Example #29
0
 public JsonWorkflowTransition(WorkflowTransition client)
 {
     SimpleMapper.Map(client, this);
 }
        private void UpdateWorkflowState(WorkflowInstance workflow, WorkflowResult result, WorkflowTransition transition)
        {
            if (result.NewState?.Name != null && (workflow.WorkflowState?.Name == null || result.NewState?.Name != workflow.WorkflowState?.Name))
            {
                workflow.WorkflowState = result.NewState;

                if (transition != null)
                {
                    workflow.Transition = transition;
                }
            }
        }