private static void RemoveExceptionCausingRules(MSRuleSetTranslationResult ruleSetTranslationResult, T instanceOfObject) { Evaluator <T> evaluator = new Evaluator <T>(); MSRuleSetEvaluationResult evaluationResult = evaluator.Evaluate(ruleSetTranslationResult, instanceOfObject); ruleSetTranslationResult.RemoveExceptionCausingRules(evaluationResult.EvaluationErrors.Keys.ToList()); }
private void EvaluateRule(Rule rule, ref MSRuleSetEvaluationResult ruleSetEvaluationResult, ref RuleValidation rv) { rv.Errors.Clear(); IRuleExpression ruleExpression = (IRuleExpression)((RuleExpressionCondition)rule.Condition).Expression; RuleExecution re = new RuleExecution(rv, _instanceOfObject); RuleExpressionInfo info = RuleExpressionWalker.Validate(rv, (CodeExpression)ruleExpression, true); if (rv.Errors.Count > 0) { //string validationErrorMessages = Helper.GetErrorMessageFromValidationErrorsCollection(errors); ruleSetEvaluationResult.AddValidationError(rule.Name, rule.Description, rv.Errors); } else { RuleExpressionResult result = RuleExpressionWalker.Evaluate(re, (CodeExpression)ruleExpression); ruleSetEvaluationResult.AddEvaluationResult(rule.Name, rule.Description, result); } }
public MSRuleSetEvaluationResult EvaluateRuleSet(System.Workflow.Activities.Rules.RuleSet ruleSet, bool translatedRule) { MSRuleSetEvaluationResult ruleSetEvaluationResult = null; if (translatedRule) { ruleSetEvaluationResult = new MSRuleSetEvaluationResult(_msRuleSetTranslationResult); } else { ruleSetEvaluationResult = new MSRuleSetEvaluationResult(); } RuleValidation rv = new RuleValidation(typeof(T), null); ruleSet.Validate(rv); ValidationErrorCollection errors = rv.Errors; if (errors.Count > 0) { //string validationErrorMessages = Helper.GetErrorMessageFromValidationErrorsCollection(errors); // if the rule set has errors at top level should we stop here or try each individual rule? i think for now //we can continue to try each individual rule and then after evaluations report the errors in the return execution result //object ruleSetEvaluationResult.AddRuleSetValidationErrors(errors); } foreach (System.Workflow.Activities.Rules.Rule rule in ruleSet.Rules) { if (rule.Active) { try { EvaluateRule(rule, ref ruleSetEvaluationResult, ref rv); } catch (RuleEvaluationException rex) { //_log.Error("Rule Name: " + rule.Name + "threw a Rule Evaluation Exception during its evaluation. ", rex); //loop again cause if this one failed we still want to try to evaluate the other rules in this rule set if (rex.InnerException != null) { ruleSetEvaluationResult.AddEvaluationError(rule.Name, rule.Description, (Exception)rex.InnerException); } else { ruleSetEvaluationResult.AddEvaluationError(rule.Name, rule.Description, (Exception)rex); } continue; } catch (Exception ex) { //_log.Error("Unhandled exception during evaluation of Rule Name: " + rule.Name, ex); ruleSetEvaluationResult.AddEvaluationError(rule.Name, rule.Description, ex); continue; } } else { ruleSetEvaluationResult.AddRuleToInactive(rule.Name, rule.Description); } } return(ruleSetEvaluationResult); }