Example #1
0
        public static VocabularyInfoCollection GetPublishedVocabularies()
        {
            Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver dd = new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
            SqlRuleStore ruleStore = (SqlRuleStore)dd.GetRuleStore();

            return(ruleStore.GetVocabularies(RuleStore.Filter.Published));
        }
Example #2
0
        private static void ExportPolicies()
        {
            // RuleSetDeploymentDriver has the following important methods
            Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver dd = new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();

            // SqlRuleStore - gives access t0 the rule engine database
            SqlRuleStore sqlRuleStore = (SqlRuleStore)dd.GetRuleStore();

            // Establish the export file
            FileRuleStore fileRuleStore = new FileRuleStore(policyExportPath);

            CopyPolicies(sqlRuleStore, fileRuleStore, dd);
        }
Example #3
0
        public static int DeleteVocabulary(string name, int majorVersion, int minorVersion, out string message)
        {
            int result = 0;

            try
            {
                VocabularyInfo vInfo = new VocabularyInfo(name, majorVersion, minorVersion);
                Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver rdd = new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
                SqlRuleStore ruleStore = (SqlRuleStore)rdd.GetRuleStore();
                ruleStore.Remove(vInfo);
                message = "Successfully Deleted";
            }
            catch (Exception exe)
            {
                message = exe.Message;
                return(-1);
            }

            return(result);
        }
Example #4
0
        public static int Import(string fileName, out string message)
        {
            int result = 0;

            try
            {
                Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver dd = new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
                // SqlRuleStore - gives access t the rule engine database
                SqlRuleStore sqlRuleStore = (SqlRuleStore)dd.GetRuleStore();
                dd.ImportAndPublishFileRuleStore(fileName);
                message = "Successfully imported and published";
            }
            catch (Exception exe)
            {
                message = exe.Message;
                return(-1);
            }

            return(result);
        }
Example #5
0
        public void TestBre2()
        {
            const string       connStr = "Data Source=(local);Initial Catalog=BizTalkMgmtDb;Integrated Security=True;Min Pool Size=10;MultipleActiveResultSets=True;Connect Timeout=30;Network Library=dbnmpntw;Application Name=ShoBiz";
            BtsCatalogExplorer bce     = new BtsCatalogExplorer();

            bce.ConnectionString = connStr;

            SqlRuleStore srs = new SqlRuleStore(connStr.Replace("BizTalkMgmtDb", "BizTalkRuleEngineDb"));

            RuleSetInfoCollection rsic = srs.GetRuleSets(RuleStore.Filter.LatestPublished);

            foreach (Policy p in bce.Applications["EPS Cloud Catalog"].Policies)
            {
                PrintLine("Policy Name: {0}", p.Name);
            }

            foreach (RuleSetInfo info in rsic)
            {
                PrintLine("RuleSet found: {0} ({1}.{2})", info.Name, info.MajorRevision, info.MinorRevision);

                RuleSet rs = srs.GetRuleSet(info);

                RuleDisplayStringExtractor rdse = new RuleDisplayStringExtractor(srs, info);

                PrintLine("rules count: {0}", rs.Rules.Count);
                if (rs.Rules.Count == 0)
                {
                    continue;
                }
                IEnumerator iter = rs.Rules.GetEnumerator();
                while (iter.MoveNext())
                {
                    DictionaryEntry de = (DictionaryEntry)iter.Current;
                    Rule            r  = de.Value as Rule;
                    PrintLine("Rule Display String Extractor ({0}): {1}", r.Name, rdse.ExtractRuleDisplayString(r));
                }
            }
        }
        /// <summary>
        /// Evaluate the policy
        /// </summary>
        /// <param name="policyName">
        /// The name of the policy.
        /// </param>
        /// <param name="version">
        /// The policy version.
        /// </param>
        /// <param name="providerName">
        /// The provider name
        /// </param>
        /// <param name="serviceName">
        /// The service name
        /// </param>
        /// <param name="bindingAccessPoint">
        /// The binding access point.
        /// </param>
        /// <param name="bindingUrlType">
        /// The binding URL type.
        /// </param>
        /// <param name="messageType">
        /// The message type.
        /// </param>
        /// <param name="operationName">
        /// The operation name
        /// </param>
        /// <param name="messageRole">
        /// The role of the message.
        /// </param>
        /// <param name="parameters">
        /// A dictionary of parameters.
        /// </param>
        /// <param name="messageDirection">
        /// The direction of the message flow.
        /// </param>
        /// <returns>
        /// An interchange object containing the information resolved.
        /// </returns>
        internal static Facts.Interchange Eval(
            string policyName,
            Version version,
            string providerName,
            string serviceName,
            string bindingAccessPoint,
            string bindingUrlType,
            string messageType,
            string operationName,
            string messageRole,
            Facts.Dictionaries.Parameters parameters,
            Facts.Interchange.MessageDirectionTypes messageDirection)
        {
            var trace        = Convert.ToBoolean(ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBreTrace]);
            var tempFileName = string.Empty;

            if (trace)
            {
                var traceFileFolder = ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBreTraceFileLocation];

                if (!string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    while (traceFileFolder.EndsWith(@"\"))
                    {
                        traceFileFolder = traceFileFolder.Substring(0, traceFileFolder.Length - 1);
                    }
                }

                if (string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    traceFileFolder = @".";
                }

                tempFileName = string.Format(
                    @"{0}\DirectivePolicyTrace_{1}_{2}.txt",
                    traceFileFolder,
                    DateTime.Now.ToString("yyyyMMdd"),
                    Guid.NewGuid());
            }

            // Create the array of short-term facts
            var interchange = new Facts.Interchange
            {
                ProviderName       = providerName,
                ServiceName        = serviceName,
                BindingAccessPoint = bindingAccessPoint,
                BindingUrlType     = bindingUrlType,
                MessageType        = messageType,
                OperationName      = operationName,
                MessageRole        = messageRole,
                Parameters         = parameters,
                MessageDirection   = messageDirection
            };

            // Creates a fact array with an optional UDDI fact. Safely create a UDDI Inquiry Service
            // object using a dynamic reference.  UDDI use is optional, and the UDDI library may not
            // be installed.
            Func <object[]> createFactsWithOptionalUddi = () =>
            {
                try
                {
                    return(new[]
                    {
                        interchange,
                        Activator.CreateInstance(Properties.Resources.UddiAssembly, Properties.Resources.UddiInquiryService).Unwrap()
                    });
                }
                catch
                {
                    return(new object[] { interchange });
                }
            };

            // Determine if static support is being used by rule engine and only assert InquiryServices if not.
            var shortTermFacts = IsStaticSupport()
                ? new object[] { interchange }
                : createFactsWithOptionalUddi();

            if (Convert.ToBoolean(ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBrePolicyTester]))
            {
                PolicyTester policyTester = null;

                int min;
                int maj;

                if (version == null)
                {
                    maj = 1;
                    min = 0;
                }
                else
                {
                    maj = version.Major;
                    min = version.Minor;
                }

                try
                {
                    // Use PolicyTester
                    var srs     = new SqlRuleStore(GetRuleStoreConnectionString());
                    var rsi     = new RuleSetInfo(policyName, maj, min);
                    var ruleSet = srs.GetRuleSet(rsi);

                    if (ruleSet == null)
                    {
                        throw new EsbResolutionServiceException(string.Format(Properties.Resources.ExceptionRsNotInStore, policyName, maj, min));
                    }

                    policyTester = new PolicyTester(ruleSet);

                    if (trace)
                    {
                        // Create the debug tacking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policyTester.Execute(shortTermFacts, dti);

                        // This is deliberately using Trace, rather than Debug
                        Trace.Write("[BusinessRuleEnginePolicyEvaluator] Eval Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policyTester.Execute(shortTermFacts);
                    }
                }
                catch (Exception ex)
                {
                    EventLog.WriteEntry("ESBResolutionService", GetFullMessage(ex));
                    throw;
                }
                finally
                {
                    if (policyTester != null)
                    {
                        policyTester.Dispose();
                    }
                }
            }
            else
            {
                var policy = version == null ? new Policy(policyName) : new Policy(policyName, version.Major, version.Minor);

                try
                {
                    if (trace)
                    {
                        // Create the debug tacking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policy.Execute(shortTermFacts, dti);

                        // This is deliberately using Trace, rather than Debug
                        Trace.Write("[BusinessRuleEnginePolicyEvaluator] Eval Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policy.Execute(shortTermFacts);
                    }
                }
                catch (Exception ex)
                {
                    EventLog.WriteEntry("ESBResolutionService", GetFullMessage(ex));
                    throw;
                }
                finally
                {
                    policy.Dispose();
                }
            }

            Debug.Write("[BusinessRuleEnginePolicyEvaluator] Eval - Returned # directives: " + interchange.Directives.Count);

            // Perform any directive-level validations
            interchange.ValidateDirectives();

            // If any directives are invalid, raise an exception.
            var validityStrings = from directive in interchange.Directives
                                  where !directive.Value.IsValid
                                  select directive.Value.ValidErrors;

            var validityStringList = validityStrings as IList <string> ?? validityStrings.ToList();

            if (validityStringList.Any())
            {
                throw new EsbResolutionServiceException(validityStringList.Aggregate((s1, s2) => s1 + s2).Trim());
            }

            return(interchange);
        }
        /// <summary>
        /// Return the BAM policy for a given business activity.
        /// </summary>
        /// <param name="policyName">Policy name</param>
        /// <param name="version">Policy version</param>
        /// <param name="activityName">Activity Name</param>
        /// <param name="stepName">Step name</param>
        /// <returns>A BamActivityStep object containing the resolved interceptor configuration information</returns>
        internal static Facts.BamActivityStep GetBamActivityPolicy(string policyName, Version version, string activityName, string stepName)
        {
            var trace        = Convert.ToBoolean(ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBreTrace]);
            var tempFileName = string.Empty;

            if (trace)
            {
                var traceFileFolder = ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBreTraceFileLocation];

                if (!string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    while (traceFileFolder.EndsWith(@"\"))
                    {
                        traceFileFolder = traceFileFolder.Substring(0, traceFileFolder.Length - 1);
                    }
                }

                if (string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    traceFileFolder = @".";
                }

                tempFileName = string.Format(
                    @"{0}\BAMPolicyTrace_{1}_{2}.txt",
                    traceFileFolder,
                    DateTime.Now.ToString("yyyyMMdd"),
                    Guid.NewGuid());
            }

            // Create the array of short-term facts
            var bamActivityStep = new Facts.BamActivityStep(activityName, stepName);
            var shortTermFacts  = new object[] { bamActivityStep };

            if (Convert.ToBoolean(ConfigurationManager.AppSettings[Properties.Resources.AppSettingsEsbBrePolicyTester]))
            {
                PolicyTester policyTester = null;

                int min;
                int maj;

                if (version == null)
                {
                    maj = 1;
                    min = 0;
                }
                else
                {
                    maj = version.Major;
                    min = version.Minor;
                }

                try
                {
                    // Use PolicyTester
                    var srs     = new SqlRuleStore(GetRuleStoreConnectionString());
                    var rsi     = new RuleSetInfo(policyName, maj, min);
                    var ruleSet = srs.GetRuleSet(rsi);

                    if (ruleSet == null)
                    {
                        throw new EsbResolutionServiceException(
                                  string.Format(Properties.Resources.ExceptionRsNotInStore, policyName, maj, min));
                    }

                    policyTester = new PolicyTester(ruleSet);

                    if (trace)
                    {
                        // Create the debug tracking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policyTester.Execute(shortTermFacts, dti);

                        // This is deliberately using Trace, rather than Debug
                        Trace.Write("[BusinessRuleEnginePolicyEvaluator] GetBamActivityPolicy Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policyTester.Execute(shortTermFacts);
                    }
                }
                catch (Exception ex)
                {
                    EventLog.WriteEntry("ESBResolutionService", GetFullMessage(ex));
                    throw;
                }
                finally
                {
                    if (policyTester != null)
                    {
                        policyTester.Dispose();
                    }
                }
            }
            else
            {
                var policy = version == null
                                 ? new Policy(policyName)
                                 : new Policy(policyName, version.Major, version.Minor);

                try
                {
                    if (trace)
                    {
                        // Create the debug tacking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policy.Execute(shortTermFacts, dti);

                        // This is deliberately using Trace, rather than Debug
                        Trace.Write("[BusinessRuleEnginePolicyEvaluator] GetBamActivityPolicy Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policy.Execute(shortTermFacts);
                    }
                }
                catch (Exception ex)
                {
                    EventLog.WriteEntry("ESBResolutionService", GetFullMessage(ex));
                    throw;
                }
                finally
                {
                    policy.Dispose();
                }
            }

            if (!bamActivityStep.IsValid)
            {
                throw new EsbResolutionServiceException(bamActivityStep.ValidErrors.Trim());
            }

            Debug.Write("[BusinessRuleEnginePolicyEvaluator] GetBamActivityPolicy - Returned a BAM policy.");

            return(bamActivityStep);
        }
Example #8
0
        void SaveTopic()
        {
            //var bce = CatalogExplorerFactory.CatalogExplorer();
            //bce.ConnectionString = CatalogExplorerFactory.CatalogExplorer().ConnectionString;
            try
            {
                root = CreateDeveloperConceptualElement();
                var      srs = new SqlRuleStore(CatalogExplorerFactory.CatalogExplorer().ConnectionString.Replace("BizTalkMgmtDb", rulesDb));
                XElement intro;
                //find our policy in the crowd
                Policy p = null;
                foreach (Policy policy in CatalogExplorerFactory.CatalogExplorer().Applications[appName].Policies)
                {
                    if (!policy.Name.Equals(ruleName))
                    {
                        continue;
                    }
                    p = policy;
                    break;
                }
                if (p == null)
                {
                    intro = new XElement(xmlns + "introduction", new XElement(xmlns + "para", new XText("Policy was not found!")));
                    root.Add(intro);
                    if (doc.Root != null)
                    {
                        doc.Root.Add(root);
                    }
                    ReadyToSave = true;
                    return;
                }

                var rs = srs.GetRuleSet(new RuleSetInfo(p.Name, p.MajorRevision, p.MinorRevision));

                root  = CreateDeveloperXmlReference();
                intro = new XElement(xmlns + "introduction", new XElement(xmlns + "para", new XText(string.Format("This section outlines the properties for the {0} rule set.", p.Name))));

                var exeConfInfo = new XElement(xmlns + "section",
                                               new XElement(xmlns + "title", new XText("Execution Configuration Properties")),
                                               new XElement(xmlns + "content",
                                                            new XElement(xmlns + "table",
                                                                         new XElement(xmlns + "tableHeader",
                                                                                      new XElement(xmlns + "row",
                                                                                                   new XElement(xmlns + "entry", new XText("Property")),
                                                                                                   new XElement(xmlns + "entry", new XText("Value")))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Fact Retriever Class Name")),
                                                                                      new XElement(xmlns + "entry", new XText(null == rs.ExecutionConfiguration.FactRetriever ? "N/A" : rs.ExecutionConfiguration.FactRetriever.ClassName ?? "N/A"))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Fact Retriever Assembly Name")),
                                                                                      new XElement(xmlns + "entry", new XText(null == rs.ExecutionConfiguration.FactRetriever ? "N/A" : rs.ExecutionConfiguration.FactRetriever.AssemblyName ?? "N/A"))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Max Execution Loop Depth")),
                                                                                      new XElement(xmlns + "entry", new XText(rs.ExecutionConfiguration.MaxExecutionLoopDepth.ToString()))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Maximum Working Memory Size")),
                                                                                      new XElement(xmlns + "entry", new XText(rs.ExecutionConfiguration.MaxWorkingMemorySize.ToString()))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Translation Duration (milliseconds)")),
                                                                                      new XElement(xmlns + "entry", new XText(rs.ExecutionConfiguration.TranslationDuration.ToString()))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Translator Class")),
                                                                                      new XElement(xmlns + "entry", new XText(null == rs.ExecutionConfiguration.Translator ? "N/A" : rs.ExecutionConfiguration.Translator.ClassName ?? "N/A"))),
                                                                         new XElement(xmlns + "row",
                                                                                      new XElement(xmlns + "entry", new XText("Translator Assembly")),
                                                                                      new XElement(xmlns + "entry", new XText(null == rs.ExecutionConfiguration.Translator ? "N/A" : rs.ExecutionConfiguration.Translator.AssemblyName ?? "N/A")))
                                                                         )));

                var         rulesList = new List <XElement>();
                IEnumerator iter      = rs.Rules.GetEnumerator();

                while (iter.MoveNext())
                {
                    var de = (DictionaryEntry)iter.Current;
                    var r  = de.Value as Rule;
                    if (null == r)
                    {
                        continue;
                    }
                    var rsi  = new RuleSetInfo(p.Name, p.MajorRevision, p.MinorRevision);
                    var rdse = new RuleDisplayStringExtractor(srs, rsi);
                    var s    = new XElement(xmlns + "section",
                                            new XElement(xmlns + "title", new XText(string.Format("Rule: {0}", r.Name))),
                                            new XElement(xmlns + "content",
                                                         new XElement(xmlns + "para", new XElement(xmlns + "legacyBold", new XText("Rule display:"))),
                                                         new XElement(xmlns + "code", new XAttribute("language", "other"), new XText(rdse.ExtractRuleDisplayString(r))),
                                                         new XElement(xmlns + "para", new XElement(xmlns + "legacyBold", new XText("Rule properties:"))),
                                                         new XElement(xmlns + "table",
                                                                      new XElement(xmlns + "tableHeader",
                                                                                   new XElement(xmlns + "row",
                                                                                                new XElement(xmlns + "entry", new XText("Property")),
                                                                                                new XElement(xmlns + "entry", new XText("Value")))),
                                                                      new XElement(xmlns + "row",
                                                                                   new XElement(xmlns + "entry", new XText("Active")),
                                                                                   new XElement(xmlns + "entry", new XText(r.Active.ToString()))),
                                                                      new XElement(xmlns + "row",
                                                                                   new XElement(xmlns + "entry", new XText("Priority")),
                                                                                   new XElement(xmlns + "entry", new XText(r.Priority.ToString()))),
                                                                      new XElement(xmlns + "row",
                                                                                   new XElement(xmlns + "entry", new XText("Vocabulary Definition Id")),
                                                                                   new XElement(xmlns + "entry", new XText(r.VocabularyLink == null ? "N/A" : r.VocabularyLink.DefinitionId ?? "N/A"))),
                                                                      new XElement(xmlns + "row",
                                                                                   new XElement(xmlns + "entry", new XText("Vocabulary Id")),
                                                                                   new XElement(xmlns + "entry", new XText(r.VocabularyLink == null ? "N/A" : r.VocabularyLink.VocabularyId ?? "N/A")))
                                                                      )));

                    rulesList.Add(s);
                }

                //parent section
                var section = new XElement(xmlns + "section",
                                           new XElement(xmlns + "title", new XText("Business RuleSet Properties")),
                                           new XElement(xmlns + "content",
                                                        new XElement(xmlns + "para", new XText(rs.CurrentVersion.Description ?? "The current version of this rule set has no comments associated with it.")),
                                                        new XElement(xmlns + "table",
                                                                     new XElement(xmlns + "tableHeader",
                                                                                  new XElement(xmlns + "row",
                                                                                               new XElement(xmlns + "entry", new XText("Property")),
                                                                                               new XElement(xmlns + "entry", new XText("Value")))),
                                                                     new XElement(xmlns + "row",
                                                                                  new XElement(xmlns + "entry", new XText("Current Version")),
                                                                                  new XElement(xmlns + "entry", new XText(rs.CurrentVersion.MajorRevision + "." + rs.CurrentVersion.MinorRevision))),
                                                                     new XElement(xmlns + "row",
                                                                                  new XElement(xmlns + "entry", new XText("Last Modified By")),
                                                                                  new XElement(xmlns + "entry", new XText(rs.CurrentVersion.ModifiedBy))),
                                                                     new XElement(xmlns + "row",
                                                                                  new XElement(xmlns + "entry", new XText("Modification Timestamp")),
                                                                                  new XElement(xmlns + "entry", new XText(rs.CurrentVersion.ModifiedTime.ToString())))),
                                                        new XElement(xmlns + "sections", rulesList.ToArray(), exeConfInfo)
                                                        ));

                root.Add(intro, section);
                if (doc.Root != null)
                {
                    doc.Root.Add(root);
                }
            }
            catch (Exception ex)
            {
                HandleException("BusinessRuleTopic.DoWork", ex);
            }
        }
Example #9
0
        /// <summary>
        /// Validate an XML document using a BRE policy.
        /// </summary>
        /// <param name="xmlDocument">
        /// The XML message document to be validated.
        /// </param>
        /// <param name="documentType">
        /// The document type of the XML document, as used in the validation rules.
        /// </param>
        /// <returns>
        /// A <see cref="Validations"/> object containing the results of all validations.
        /// </returns>
        public Validations ValidateDocument(XmlNode xmlDocument, string documentType)
        {
            var validations = new Validations();

            if (this.directive == null)
            {
                return(validations);
            }

            if (string.IsNullOrWhiteSpace(this.directive.ValidationPolicyName))
            {
                return(validations);
            }

            var trace        = Convert.ToBoolean(ConfigurationManager.AppSettings[Resources.AppSettingsEsbBreTrace]);
            var tempFileName = string.Empty;

            if (trace)
            {
                var traceFileFolder = ConfigurationManager.AppSettings[Resources.AppSettingsEsbBreTraceFileLocation];

                if (!string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    while (traceFileFolder.EndsWith(@"\"))
                    {
                        traceFileFolder = traceFileFolder.Substring(0, traceFileFolder.Length - 1);
                    }
                }

                if (string.IsNullOrWhiteSpace(traceFileFolder))
                {
                    traceFileFolder = @".";
                }

                tempFileName = string.Format(
                    @"{0}\ValidationPolicyTrace_{1}_{2}.txt",
                    traceFileFolder,
                    DateTime.Now.ToString("yyyyMMdd"),
                    Guid.NewGuid());
            }

            var breValidations = new Libraries.Facts.Validations();

            // Determine if static support is being used by rule engine and create the array of short-term facts
            var shortTermFacts = IsStaticSupport()
                                          ? new object[]
            {
                new TypedXmlDocument(documentType, xmlDocument), breValidations
            }
                                          : new object[]
            {
                new TypedXmlDocument(documentType, xmlDocument), breValidations,
                new XmlHelper()
            };

            // Assert the XML messsage and a validation object.
            var     policyName = this.directive.ValidationPolicyName;
            Version version;

            Version.TryParse(this.directive.ValidationPolicyVersion, out version);

            if (Convert.ToBoolean(ConfigurationManager.AppSettings[Resources.AppSettingsEsbBrePolicyTester]))
            {
                PolicyTester policyTester = null;

                int min;
                int maj;

                if (version == null)
                {
                    maj = 1;
                    min = 0;
                }
                else
                {
                    maj = version.Major;
                    min = version.Minor;
                }

                try
                {
                    // Use PolicyTester
                    var srs     = new SqlRuleStore(GetRuleStoreConnectionString());
                    var rsi     = new RuleSetInfo(policyName, maj, min);
                    var ruleSet = srs.GetRuleSet(rsi);

                    if (ruleSet == null)
                    {
                        throw new RuleSetNotFoundException(
                                  string.Format(Resources.ExceptionRsNotInStore, policyName, maj, min));
                    }

                    policyTester = new PolicyTester(ruleSet);

                    if (trace)
                    {
                        // Create the debug tracking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policyTester.Execute(shortTermFacts, dti);

                        Trace.Write(
                            "[Esb.BizTalk.Orchestration.Directive] ValidateMessage Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policyTester.Execute(shortTermFacts);
                    }
                }
                finally
                {
                    if (policyTester != null)
                    {
                        policyTester.Dispose();
                    }
                }
            }
            else
            {
                var policy = version == null
                                    ? new Policy(policyName)
                                    : new Policy(policyName, version.Major, version.Minor);

                try
                {
                    if (trace)
                    {
                        // Create the debug tacking object
                        var dti = new DebugTrackingInterceptor(tempFileName);

                        // Execute the policy with trace
                        policy.Execute(shortTermFacts, dti);

                        Trace.Write(
                            "[Esb.BizTalk.Orchestration.Directive] ValidateMessage Trace: " + dti.GetTraceOutput());
                    }
                    else
                    {
                        // Execute the policy
                        policy.Execute(shortTermFacts);
                    }
                }
                finally
                {
                    policy.Dispose();
                }
            }

            // Throw an exception if dictated by the policy
            if (this.directive.ErrorOnInvalid && breValidations.ErrorCount > 0)
            {
                throw new ValidationException(string.Format("\r\nValidation Errors:\r\n{0}", breValidations.ToString(Libraries.Facts.ValidationLevel.Error)));
            }

            return(validations.InitialiseFromBreValidations(breValidations));
        }