Beispiel #1
0
        public FlowDiagram BuildDiagram(Type requestType, Type responseType, IFlowDefinition flowDefinition, bool isOverride = false)
        {
            var requestInfo = new FlowRequestInfo
            {
                RequestType = requestType,
                Description = GetDescriptionAttributeValue(requestType),
                Properties  = GetFlowPropertyInfos(requestType),
            };

            var responseInfo = new FlowResponseInfo
            {
                ResponseType = responseType,
                Description  = GetDescriptionAttributeValue(responseType),
                Properties   = GetFlowPropertyInfos(responseType),
            };

            var flowDiagram = new FlowDiagram(flowDefinition.Criteria, requestInfo, responseInfo, isOverride);

            var startNode = flowDiagram.AddNode(new FlowDiagramNode
            {
                NodeType = FlowDiagramNodeType.Start,
                Name     = "Start"
            });

            var endCount = AddFlowDiagramDefaultLink(startNode, -1, flowDefinition, flowDiagram, 0);

            var previousNode = startNode;

            for (var stepIndex = 0; stepIndex < flowDefinition.Steps.Count; stepIndex++)
            {
                previousNode = AddFlowDiagramNode(stepIndex, flowDefinition, previousNode, flowDiagram, ref endCount);
            }

            return(flowDiagram);
        }
Beispiel #2
0
        private FlowDiagramNode AddFlowDiagramDecisionNode(int stepIndex, IFlowDefinition flowDefinition, FlowDiagram flowDiagram,
                                                           FlowStep flowStep, DecisionFlowStepBase decisionFlowStep, ref int endCount)
        {
            var decisionRequest = GetFlowStepRequest(flowStep.Definition);

            var decisionNode = flowDiagram.AddNode(new FlowDiagramNode
            {
                NodeType            = FlowDiagramNodeType.Decision,
                Name                = flowStep.Name,
                Text                = GetFlowDiagramNodeText(flowStep, decisionRequest),
                OverrideKey         = flowStep.OverrideKey?.Value,
                OverrideDescription = flowStep.OverrideKey?.Description,
            });

            SetFlowDiagramNodeInputSummaries(flowStep, decisionRequest, decisionNode);

            foreach (var branch in decisionFlowStep.Branches)
            {
                if (branch.IsUnhandled)
                {
                    continue;
                }

                var linkCriteria = branch.Targets?.ToList().ConvertAll(c => c?.ToString());

                if (branch.IsEnd)
                {
                    var endNode = AddFlowDiagramEndNode(flowDiagram, ref endCount);

                    decisionNode.Links.Add(new FlowDiagramLink
                    {
                        TargetNodeName = endNode.Name,
                        Criteria       = linkCriteria
                    });
                }
                else
                {
                    if (string.IsNullOrEmpty(branch.NextStepName))
                    {
                        endCount = AddFlowDiagramDefaultLink(decisionNode, stepIndex, flowDefinition, flowDiagram, endCount);
                    }
                    else
                    {
                        decisionNode.Links.Add(new FlowDiagramLink
                        {
                            TargetNodeName = branch.NextStepName,
                            Criteria       = linkCriteria
                        });
                    }
                }
            }

            return(decisionNode);
        }
Beispiel #3
0
        private static FlowDiagramNode AddFlowDiagramEndNode(FlowDiagram flowDiagram, ref int endCount)
        {
            endCount += 1;

            var endNode = flowDiagram.AddNode(new FlowDiagramNode
            {
                NodeType = FlowDiagramNodeType.End,
                Name     = "End_" + endCount
            });

            return(endNode);
        }
Beispiel #4
0
        private FlowDiagramNode AddFlowDiagramLabelNode(int stepIndex, IFlowDefinition flowDefinition, FlowDiagram flowDiagram,
                                                        FlowStep flowStep, ref int endCount)
        {
            var labelNode = flowDiagram.AddNode(new FlowDiagramNode
            {
                NodeType = FlowDiagramNodeType.Label,
                Name     = flowStep.Name,
                Text     = flowStep.Text ?? flowStep.Name
            });

            endCount = AddFlowDiagramDefaultLink(labelNode, stepIndex, flowDefinition, flowDiagram, endCount);
            return(labelNode);
        }
Beispiel #5
0
        private FlowDiagramNode AddFlowDiagramActivityNode(int stepIndex, IFlowDefinition flowDefinition, FlowDiagram flowDiagram,
                                                           FlowStep flowStep, ref int endCount)
        {
            var activityRequest = GetFlowStepRequest(flowStep.Definition);

            var activityNode = flowDiagram.AddNode(new FlowDiagramNode
            {
                NodeType            = FlowDiagramNodeType.Activity,
                Name                = flowStep.Name,
                Text                = GetFlowDiagramNodeText(flowStep, activityRequest),
                OverrideKey         = flowStep.OverrideKey?.Value,
                OverrideDescription = flowStep.OverrideKey?.Description,
            });

            SetFlowDiagramNodeInputSummaries(flowStep, activityRequest, activityNode);

            activityNode.OutputBindings = GetBoundOutputSummary(flowStep, activityRequest);

            endCount = AddFlowDiagramDefaultLink(activityNode, stepIndex, flowDefinition, flowDiagram, endCount);

            return(activityNode);
        }