Esempio n. 1
0
        private int AddFlowDiagramDefaultLink(FlowDiagramNode node, int stepIndex, IFlowDefinition flowDefinition,
                                              FlowDiagram flowDiagram, int endCount)
        {
            if (stepIndex + 1 == flowDefinition.Steps.Count)
            {
                var endNode = AddFlowDiagramEndNode(flowDiagram, ref endCount);
                node.Links.Add(new FlowDiagramLink {
                    TargetNodeName = endNode.Name
                });
            }
            else
            {
                var nextStep = flowDefinition.Steps[stepIndex + 1];

                switch (nextStep)
                {
                case GotoFlowStep _:
                case EndFlowStep _:
                    // These steps add a link to the previous node, so we don't add one here
                    break;

                default:
                    node.Links.Add(new FlowDiagramLink {
                        TargetNodeName = nextStep.Name
                    });
                    break;
                }
            }

            return(endCount);
        }
Esempio n. 2
0
        private FlowDiagramNode AddFlowDiagramNode(int stepIndex, IFlowDefinition flowDefinition,
                                                   FlowDiagramNode previousNode, FlowDiagram flowDiagram, ref int endCount)
        {
            var flowStep = flowDefinition.Steps[stepIndex];

            switch (flowStep)
            {
            case ActivityFlowStep _:
                var activityNode = AddFlowDiagramActivityNode(stepIndex, flowDefinition, flowDiagram, flowStep, ref endCount);
                previousNode = activityNode;
                break;

            case LabelFlowStep _:
                var labelNode = AddFlowDiagramLabelNode(stepIndex, flowDefinition, flowDiagram, flowStep, ref endCount);
                previousNode = labelNode;
                break;

            case EndFlowStep _:
                var endFlowNode = AddFlowDiagramEndNode(flowDiagram, ref endCount);
                previousNode.Links.Add(new FlowDiagramLink {
                    TargetNodeName = endFlowNode.Name
                });
                break;

            case GotoFlowStep gotoFlowStep:
                previousNode.Links.Add(new FlowDiagramLink {
                    TargetNodeName = gotoFlowStep.NextStepName
                });
                break;

            case DecisionFlowStepBase decisionFlowStep:
                var decisionNode = AddFlowDiagramDecisionNode(stepIndex, flowDefinition, flowDiagram, flowStep, decisionFlowStep, ref endCount);
                previousNode = decisionNode;
                break;

            default:
                throw new FlowException($"Unhandled flow step type: {flowStep.GetType().FullName}");
            }

            return(previousNode);
        }
Esempio n. 3
0
        private void SetFlowDiagramNodeInputSummaries(FlowStep flowStep, IFlowStepRequest request, FlowDiagramNode node)
        {
            var setInputs      = new Dictionary <string, string>();
            var boundInputs    = new Dictionary <string, string>();
            var inputOverrides = new Dictionary <string, IList <FlowInputOverride> >();

            var requestType = request.GetType().GetFlowObjectType();

            foreach (var requestProperty in requestType.Properties)
            {
                var isSetInput = flowStep.Definition.Setters.Any(s => s.Item1.Name == requestProperty.Name);

                if (isSetInput)
                {
                    setInputs[requestProperty.PropertyInfo.Name] = requestProperty.PropertyInfo.GetValue(request)?.ToString();
                }
                else
                {
                    var binding = flowStep.Definition.GetInputBinding(requestProperty);
                    var summary = binding.GetSummary(request);

                    boundInputs[requestProperty.PropertyInfo.Name] = summary;
                }
            }

            if (!string.IsNullOrEmpty(flowStep.OverrideKey?.Value))
            {
                var flowRequestOverrides = _overrideProvider?.GetRequestOverrides(flowStep.OverrideKey?.Value);

                if (flowRequestOverrides != null)
                {
                    foreach (var flowRequestOverride in flowRequestOverrides)
                    {
                        var inputOverride = new FlowInputOverride
                        {
                            Value    = flowRequestOverride.Value?.ToString(),
                            Criteria = flowRequestOverride.Criteria
                        };

                        if (inputOverrides.TryGetValue(flowRequestOverride.Name, out var propertyInputOverrides))
                        {
                            propertyInputOverrides.Add(inputOverride);
                        }
                        else
                        {
                            inputOverrides.Add(flowRequestOverride.Name, new List <FlowInputOverride>(new[] { inputOverride }));
                        }
                    }
                }
            }

            node.InputSetters   = setInputs;
            node.InputBindings  = boundInputs;
            node.InputOverrides = inputOverrides;
        }