private void ProcessComponentsFromModelToFlow(IComponentModel compModel, ConvertedFlow newFlow, string projectName, string modelName, List <ConvertedFlow> allFlows) { List <ConvertedStep> allSteps = new List <ConvertedStep>(); foreach (IOrchestrationComponent component in compModel.Components) { if (component is EmbeddedModelComponent) { ConvertedFlow embeddedFlow = new ConvertedFlow(); embeddedFlow.FlowName = component.Name; FieldInfo[] fields = component.GetType().GetFields( BindingFlags.NonPublic | BindingFlags.Instance); IComponentModel internalModel = (IComponentModel)fields.First(xx => xx.Name == "_embeddedModel").GetValue(component); SetupInputDataForFlow(internalModel.InputData, embeddedFlow, true); SetupOutputDataForFlow(internalModel.OutputData, embeddedFlow); embeddedFlow.Tags = new string[] { modelName, "Embedded Model" }; embeddedFlow.FlowId = internalModel.Id; ProcessComponentsFromModelToFlow(internalModel, embeddedFlow, projectName, component.Name + " Embedded", allFlows); allFlows.Add(embeddedFlow); } ConvertedStep x = CreateFlowStepFromComponent(projectName, component, modelName); allSteps.Add(x); } newFlow.Steps = allSteps.ToArray(); List <ConvertedConnection> stepConnections = new List <ConvertedConnection>(); // Now that we have created and mapped all the steps we // need to create all of the necessary links foreach (IOrchestrationComponent component in compModel.Components) { Report("Linking {0}", component.Name); IComponentLink[] links = compModel.GetOutboundLinks(component); foreach (IComponentLink eachLink in links) { string srcPath = eachLink.Path; int srcPortNumber = eachLink.SourcePortNumber + 1; int dstPortNumber = eachLink.DestinationPortNumber - 1; dstPortNumber = dstPortNumber < 0 ? 0 : dstPortNumber; srcPortNumber = srcPortNumber > 3 ? 3 : srcPortNumber; stepConnections.Add(new ConvertedConnection() { TargetStepId = eachLink.DestinationComponentID, SourceStepId = eachLink.SourceComponentID, TargetPortNumberOnStep = dstPortNumber, SourcePortNumberOnStep = srcPortNumber, PathName = eachLink.Path }); } } newFlow.Connections = stepConnections.ToArray(); }