Пример #1
0
        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());
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }