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); }
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); }
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; }