/// <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); }
/// <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)); }