예제 #1
0
        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();
        }