public ExecutableRcvPipeline(ReceivePipeline source)
        {
            XmlDocument conf = new XmlDocument();

            conf.LoadXml(source.XmlContent);

            foreach (XmlNode stageConf in conf.SelectNodes("/*[local-name()='Document']/*[local-name()='Stages']/*[local-name()='Stage']"))
            {
                XmlNode       fileStageConf = stageConf.SelectSingleNode("*[local-name()='PolicyFileStage']");
                ExecutionMode mode          = ExecutionMode.allRecognized;
                switch (fileStageConf.Attributes["execMethod"].Value.ToLower())
                {
                case "all":
                    mode = ExecutionMode.all;
                    break;

                case "firstmatch":
                    mode = ExecutionMode.firstRecognized;
                    break;

                default:
                    mode = ExecutionMode.allRecognized;
                    break;
                }


                CustomStage tempStage = new CustomStage
                {
                    StageID    = Guid.Parse(fileStageConf.Attributes["stageId"].Value),
                    StageLevel = Int32.Parse(fileStageConf.Attributes["_locID"].Value),
                    Mode       = mode
                };
                this.Stages.Add(tempStage);


                foreach (XmlNode componentConf in stageConf.SelectNodes("*[local-name()='Components']/*[local-name()='Component']"))
                {
                    IBaseComponent realComponent = (IBaseComponent)Activator.CreateInstance(Type.GetType(componentConf.SelectSingleNode("*[local-name()='Name']").InnerText));
                    MethodInfo     initNewInfo   = realComponent.GetType().GetMethod("InitNew");
                    if (initNewInfo != null)
                    {
                        initNewInfo.Invoke(realComponent, new object[] { });
                    }

                    IPropertyBag componentProps = new CustomPropertyBag();

                    List <string> hiddenProps = new List <string>();
                    XmlNode       hiddenNode  = componentConf.SelectSingleNode("*[local-name()='Properties']/*[local-name()='Property' and @Name='HiddenProperties']");
                    if (hiddenNode != null)
                    {
                        hiddenProps.AddRange(hiddenNode.InnerText.Split(','));
                    }
                    hiddenProps.Add("HiddenProperties");

                    foreach (XmlNode propConf in componentConf.SelectNodes("*[local-name()='Properties']/*[local-name()='Property']"))
                    {
                        if (!String.IsNullOrEmpty(propConf.SelectSingleNode("*[local-name()='Value']").InnerText) && !hiddenProps.Contains(propConf.Attributes["Name"].Value))
                        {
                            componentProps.Write(
                                propConf.Attributes["Name"].Value,
                                this.TryConvertToSchemaList(propConf.SelectSingleNode("*[local-name()='Value']").InnerText,
                                                            propConf.SelectSingleNode("*[local-name()='Value']").Attributes["xsi:type"].Value));
                            //switch (propConf.Attributes["Name"].Value)
                            //{
                            //    case "Microsoft.BizTalk.Component.Utilities.SchemaList":
                            //        componentProps.Write(
                            //                            propConf.Attributes["Name"].Value,
                            //                            this.ConvertToSchemaList(propConf.SelectSingleNode("*[local-name()='Value']").InnerText));
                            //        break;
                            //    default:
                            //        componentProps.Write(
                            //                            propConf.Attributes["Name"].Value,
                            //                            Convert.ChangeType(propConf.SelectSingleNode("*[local-name()='Value']").InnerText, propertyInfo.PropertyType));
                            //        break;
                            //}
                        }
                    }

                    if (realComponent.GetType().GetInterfaces().Contains(typeof(IPersistPropertyBag)))
                    {
                        MethodInfo loadInfo = realComponent.GetType().GetMethod("Load");
                        if (loadInfo != null)
                        {
                            loadInfo.Invoke(realComponent, new object[] { componentProps, null });
                        }
                    }

                    tempStage.Components.Add(realComponent);
                }
            }
        }
        private void executeComponent(CustomStage stage, IBaseComponent component, IPipelineContext context, IBaseMessage msgIn)
        {
            msgIn.BodyPart.Data.Position = 0;

            MethodInfo probeInfo = null;

            switch (stage.StageLevel)
            {
            case 1:
                probeInfo = component.GetType().GetMethod("Execute");
                IBaseMessage stage1Msg = (IBaseMessage)probeInfo.Invoke(component, new object[] { context, msgIn });

                msgIn = stage1Msg;
                break;

            case 2:
                probeInfo = component.GetType().GetMethod("Disassemble");
                probeInfo.Invoke(component, new object[] { context, msgIn });
                //msgIn.BodyPart.Data.Position = 0;

                MethodInfo   nextInfo        = component.GetType().GetMethod("GetNext");
                object[]     compArgs        = new object[] { context };
                IBaseMessage disassembledMsg = (IBaseMessage)nextInfo.Invoke(component, compArgs);

                //this.OutputMsgs.Add(disassembledMsg);
                Guid lastID = Guid.Empty;
                while (disassembledMsg != null && disassembledMsg.MessageID != lastID)
                {
                    MemoryStream tempStream = new MemoryStream();
                    disassembledMsg.BodyPart.Data.CopyTo(tempStream);
                    //BizWTF.Core.Entities.MultipartMessage msg = BizWTF.Core.Entities.Mocking.MultipartMessageManager.GenerateFromMessage(disassembledMsg);
                    tempStream.Position           = 0;
                    disassembledMsg.BodyPart.Data = tempStream;

                    this.OutputMsgs.Add(disassembledMsg);
                    lastID = disassembledMsg.MessageID;

                    disassembledMsg = (IBaseMessage)nextInfo.Invoke(component, compArgs);
                }
                break;

            case 3:
                probeInfo = component.GetType().GetMethod("Execute");

                List <IBaseMessage> stage3Msgs = new List <IBaseMessage>();
                foreach (IBaseMessage previousStageMsg in this.OutputMsgs)
                {
                    stage3Msgs.Add((IBaseMessage)probeInfo.Invoke(component, new object[] { context, previousStageMsg }));
                }
                this.OutputMsgs = stage3Msgs;

                break;

            case 4:
                probeInfo = component.GetType().GetMethod("Execute");

                List <IBaseMessage> stage4Msgs = new List <IBaseMessage>();
                foreach (IBaseMessage previousStageMsg in this.OutputMsgs)
                {
                    stage4Msgs.Add((IBaseMessage)probeInfo.Invoke(component, new object[] { context, previousStageMsg }));
                }
                this.OutputMsgs = stage4Msgs;

                break;

            default:
                break;
            }
        }