/// <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);
        }
        /// <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);
        }
Exemplo n.º 3
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));
        }