/// <summary>
        /// TestStepBase.Execute() implementation
        /// </summary>
        /// <param name='context'>The context for the test, this holds state that is passed beteen tests</param>
        public override void Execute(Context context)
        {
            var fi = new System.IO.FileInfo(RuleStoreName);

            if (!fi.Exists)
            {
                throw new FileNotFoundException("RuleStoreName", RuleStoreName);
            }

            var ruleStore = new FileRuleStore(fi.FullName);
            var rsInfo    = ruleStore.GetRuleSets(RuleSetInfoCollectionName, RuleStore.Filter.Latest);

            if (rsInfo.Count != 1)
            {
                // oops ... error
                throw new ApplicationException(String.Format("RuleStore {0} did not contain RuleSet {1}", RuleStoreName, RuleSetInfoCollectionName));
            }

            var ruleset = ruleStore.GetRuleSet(rsInfo[0]);

            // Create an instance of the DebugTrackingInterceptor
            var dti = new DebugTrackingInterceptor(DebugTracking);

            // Create an instance of the Policy Tester class
            var policyTester = new PolicyTester(ruleset);

            // load the facts into array
            var facts = new object[_factsList.Count];
            var i     = 0;

            foreach (var currentFact in _factsList)
            {
                switch (currentFact.GetType().ToString())
                {
                case "ObjectFact":
                {
                    var fact = currentFact as ObjectFact;

                    object[] objectArgs = null;
                    if (null != fact.Args)
                    {
                        objectArgs = fact.Args.Split(new char[] { ',' });
                    }

                    System.Reflection.Assembly asm;
                    Type type;
                    if (fact.AssemblyPath.Length > 0)
                    {
                        asm = System.Reflection.Assembly.LoadWithPartialName(fact.AssemblyPath);
                        if (asm == null)
                        {
                            // fail
                            throw (new Exception("failed to create type " + fact.Type));
                        }
                        type = asm.GetType(fact.Type, true, false);
                    }
                    else
                    {
                        // must be in path
                        type = Type.GetType(fact.Type);
                    }

                    facts[i] = Activator.CreateInstance(type, objectArgs);
                    break;
                }

                case "DocumentFact":
                {
                    var fact = currentFact as DocumentFact;
                    var xd1  = new XmlDocument();
                    xd1.Load(fact.InstanceDocument);
                    var txd = new TypedXmlDocument(fact.SchemaType, xd1);
                    facts[i] = txd;
                    break;
                }

                case "DataConnectionFact":
                {
                    var fact = currentFact as DataConnectionFact;
                    var conn = new SqlConnection(fact.ConnectionString);
                    conn.Open();
                    var dc = new DataConnection(fact.Dataset, fact.TableName, conn);
                    facts[i] = dc;
                    break;
                }

                case "dataTable":
                case "dataRow":
                {
                    var fact = currentFact as DataTableFact;

                    var dAdapt = new SqlDataAdapter();
                    dAdapt.TableMappings.Add("Table", fact.TableName);
                    var conn = new SqlConnection(fact.ConnectionString);
                    conn.Open();
                    var myCommand = new SqlCommand(fact.Command, conn)
                    {
                        CommandType = CommandType.Text
                    };
                    dAdapt.SelectCommand = myCommand;
                    var ds = new DataSet(fact.Dataset);
                    dAdapt.Fill(ds);
                    var tdt = new TypedDataTable(ds.Tables[fact.TableName]);
                    if (fact.Type == "dataRow")
                    {
                        var tdr = new TypedDataRow(ds.Tables[fact.TableName].Rows[0], tdt);
                        facts[i] = tdr;
                    }
                    else
                    {
                        facts[i] = tdt;
                    }
                    break;
                }
                }
                i++;
            }

            // Execute Policy Tester
            try
            {
                policyTester.Execute(facts, dti);
            }
            catch (Exception e)
            {
                context.LogException(e);
                throw;
            }
            finally
            {
                dti.CloseTraceFile();
            }

            // write out all document instances passed in
            foreach (object fact in facts)
            {
                switch (fact.GetType().Name)
                {
                case "TypedXmlDocument":
                {
                    var txd = (TypedXmlDocument)fact;

                    context.LogData("TypedXmlDocument result: ", txd.Document.OuterXml);
                    Stream data = StreamHelper.LoadMemoryStream(txd.Document.OuterXml);

                    // Validate if configured...
                    // HACK: We need to prevent ExecuteValidator for /each/ TypedXmlDocument
                    if (txd.DocumentType == "UBS.CLAS.PoC.Schemas.INSERTS")
                    {
                        foreach (var subStep in SubSteps)
                        {
                            data = subStep.Execute(data, context);
                        }
                    }

                    break;
                }

                case "DataConnection":
                {
                    var dc = (DataConnection)fact;
                    dc.Update();         // persist any changes
                    break;
                }

                case "TypedDataTable":
                {
                    var tdt = (TypedDataTable)fact;
                    tdt.DataTable.AcceptChanges();
                    break;
                }

                case "TypedDataRow":
                {
                    var tdr = (TypedDataRow)fact;
                    tdr.DataRow.AcceptChanges();
                    break;
                }
                }
            }
        }
        /// <summary>
        /// TestStepBase.Execute() implementation
        /// </summary>
        /// <param name='context'>The context for the test, this holds state that is passed beteen tests</param>
        public override void Execute(Context context)
        {
            var fi = new System.IO.FileInfo(RuleStoreName);

            if (!fi.Exists)
            {
                throw new FileNotFoundException("RuleStoreName", RuleStoreName);
            }

            var ruleStore = new FileRuleStore(fi.FullName);
            var rsInfo = ruleStore.GetRuleSets(RuleSetInfoCollectionName, RuleStore.Filter.Latest);
            if (rsInfo.Count != 1)
            {
                // oops ... error
                throw new ApplicationException(String.Format("RuleStore {0} did not contain RuleSet {1}", RuleStoreName, RuleSetInfoCollectionName));
            }

            var ruleset = ruleStore.GetRuleSet(rsInfo[0]);

            // Create an instance of the DebugTrackingInterceptor
            var dti = new DebugTrackingInterceptor(DebugTracking);

            // Create an instance of the Policy Tester class
            var policyTester = new PolicyTester(ruleset);

            // load the facts into array
            var facts = new object[_factsList.Count]; 
            var i = 0;

            foreach (var currentFact in _factsList)
            {
                switch (currentFact.GetFactType)
                {
                    case "ObjectFact":
                        {
                            var fact = currentFact as ObjectFact;

                            object[] objectArgs = null;
                            if (null != fact.Args)
                            {
                                objectArgs = fact.Args.Split(new char[] { ',' });
                            }

                            System.Reflection.Assembly asm;
                            Type type;
                            if (fact.AssemblyPath.Length > 0)
                            {
                                asm = System.Reflection.Assembly.LoadWithPartialName(fact.AssemblyPath);
                                if (asm == null)
                                {
                                    // fail
                                    throw (new Exception("failed to create type " + fact.Type));
                                }
                                type = asm.GetType(fact.Type, true, false);
                            }
                            else
                            {
                                // must be in path
                                type = Type.GetType(fact.Type);
                            }

                            facts[i] = Activator.CreateInstance(type, objectArgs);
                            break;
                        }
                    case "DocumentFact":
                        {
                            var fact = currentFact as DocumentFact;
                            var xd1 = new XmlDocument();
                            xd1.Load(fact.InstanceDocument);
                            var txd = new TypedXmlDocument(fact.SchemaType, xd1);
                            facts[i] = txd; 
                            break;
                        }
                    case "DataConnectionFact":
                        {
                            var fact = currentFact as DataConnectionFact;
                            var conn = new SqlConnection(fact.ConnectionString);
                            conn.Open();
                            var dc = new DataConnection(fact.Dataset, fact.TableName, conn);
                            facts[i] = dc;
                            break;
                        }
                    case "dataTable":
                    case "dataRow":
                        {
                            var fact = currentFact as DataTableFact;

                            var dAdapt = new SqlDataAdapter();
                            dAdapt.TableMappings.Add("Table", fact.TableName);
                            var conn = new SqlConnection(fact.ConnectionString);
                            conn.Open();
                            var myCommand = new SqlCommand(fact.Command, conn) {CommandType = CommandType.Text};
                            dAdapt.SelectCommand = myCommand;
                            var ds = new DataSet(fact.Dataset);
                            dAdapt.Fill(ds);
                            var tdt = new TypedDataTable(ds.Tables[fact.TableName]);
                            if (fact.Type == "dataRow")
                            {
                                var tdr = new TypedDataRow(ds.Tables[fact.TableName].Rows[0], tdt);
                                facts[i] = tdr;
                            }
                            else
                            {
                                facts[i] = tdt;
                            }
                            break;
                        }
                }
                i++;
            }

            // Execute Policy Tester
            try
            {
                policyTester.Execute(facts, dti);
            }
            catch (Exception e)
            {
                context.LogException(e);
                throw;
            }
            finally
            {
                dti.CloseTraceFile();
            }

            // write out all document instances passed in
            foreach (object fact in facts)
            {
                switch (fact.GetType().Name)
                {
                    case "TypedXmlDocument":
                        {
                            var txd = (TypedXmlDocument)fact;

                            context.LogData("TypedXmlDocument result: ", txd.Document.OuterXml);
                            Stream data = StreamHelper.LoadMemoryStream(txd.Document.OuterXml);

                            // Validate if configured...
                            // HACK: We need to prevent ExecuteValidator for /each/ TypedXmlDocument
                            if (txd.DocumentType == "UBS.CLAS.PoC.Schemas.INSERTS")
                            {
                                foreach (var subStep in SubSteps)
                                {
                                    data = subStep.Execute(data, context);
                                }

                            }

                            break;
                        }
                    case "DataConnection":
                        {
                            var dc = (DataConnection)fact;
                            dc.Update(); // persist any changes
                            break;
                        }
                    case "TypedDataTable":
                        {
                            var tdt = (TypedDataTable)fact;
                            tdt.DataTable.AcceptChanges();
                            break;
                        }
                    case "TypedDataRow":
                        {
                            var tdr = (TypedDataRow)fact;
                            tdr.DataRow.AcceptChanges();
                            break;
                        }
                }
            }
        }
        private void FireRule(XmlDocument xd, string fileName)
        {
            string           destDirectory  = outboundTxtBx.Text.Trim();
            string           traceDirectory = traceTxtBx.Text.Trim();
            TypedXmlDocument doc1           = new TypedXmlDocument("TrackSource.BizTalk.Schemas.InboundToRules", xd);

            string [] policies = new string[14] {
                "Data Preparation",
                "Pre-Processing Group 1",
                "Pre-Processing Group 2",
                "Pre-Processing Group 3",
                "Pre-Processing Group 4",
                "Pre-Processing Group 5",
                "Pre-Processing Group 6",
                "Lender Specific",
                "Insurance Servicing",
                "Post Processing Group 1",
                "Post Processing Group 2",
                "Black Hole",
                "Fidelity Hold",
                "Procedure Set"
            };

            ProcessingTxtBx.Text = ProcessingTxtBx.Text + "Processing Started " + DateTime.Now + "\r\n";
            string traceFileName = fileName + "_RuleTrace";

            traceFileName = traceDirectory + traceFileName + ".txt";
            if (File.Exists(traceFileName))
            {
                File.Delete(traceFileName);
            }
            DebugTrackingInterceptor dti = new DebugTrackingInterceptor(traceFileName);

            try
            {
                for (int i = 0; i < policies.Length; i++)
                {
                    string PolicyName = policies[i].Trim();
                    lblProcessing.Text   = PolicyName;
                    ProcessingTxtBx.Text = ProcessingTxtBx.Text + "Processing ... " + policies[i] + " " + DateTime.Now + "\r\n";
                    Application.DoEvents();
                    Microsoft.RuleEngine.Policy tstPolicy = new Microsoft.RuleEngine.Policy(PolicyName);
                    ArrayList shortTermFacts = new ArrayList();
                    shortTermFacts = GetFacts(PolicyName);
                    shortTermFacts.Add(doc1);
                    tstPolicy.Execute(shortTermFacts.ToArray(), dti);
                    tstPolicy = null;
                }
            }
            catch (Exception ex)
            {
                ProcessingTxtBx.Text = ProcessingTxtBx.Text + "Exception Caught Check _Excepion Text File";
                string exceptionFileName = fileName + "_Exception";
                exceptionFileName = traceDirectory + exceptionFileName + ".txt";
                if (File.Exists(exceptionFileName))
                {
                    File.Delete(exceptionFileName);
                }
                StreamWriter sw2 = new StreamWriter(exceptionFileName);
                ProcessingTxtBx.Text = ProcessingTxtBx.Text + ex.Message;
                sw2.Write(ex.Message.ToString());
                sw2.Close();
            }
            finally
            {
                ProcessingTxtBx.Text = ProcessingTxtBx.Text + "Processing Done " + DateTime.Now + "\r\n";
                lblProcessing.Text   = "Writing output File";
                string processedDoc = fileName + "_Outbound";
                processedDoc = destDirectory + processedDoc + ".xml";
                if (File.Exists(processedDoc))
                {
                    File.Delete(processedDoc);
                }
                StreamWriter sw = new StreamWriter(processedDoc);
                dti.CloseTraceFile();
                sw.Write(doc1.Document.InnerXml.ToString());
                sw.Close();
                xd   = null;
                doc1 = null;
                lblProcessing.Text = "Processing Completed for " + fileName;
            }
            //return xd;
        }