コード例 #1
0
        public IRule CreateRule(string sourceCode, out string successAction, out string failAction)
        {
            IDictionary <string, Tuple <string, IData, bool> > variables = new Dictionary <string, Tuple <string, IData, bool> >();
            IContext context         = new Context();
            string   conditionTokens = string.Empty;

            successAction = string.Empty;
            failAction    = string.Empty;

            IRule rule = null;

            try
            {
                string id = string.Empty;

                GetDeclarationFromSourceCode(sourceCode, ref variables, ref context, ref conditionTokens, ref successAction, ref failAction, ref id);

                rule = new Rule(id);

                IBooleanBase condition = ConvertTokenToCondition(conditionTokens, variables, ref rule);

                if (!condition.Evaluate(context))
                {
                    throw new ArgumentException("Built-in self-test for rule creation failed.");
                }

                rule.SetCondition(condition);
            }
            catch (Exception ex)
            {
                throw new ArgumentException("Failed to parse source code, please see inner exception.", ex);
            }

            return(rule);
        }
コード例 #2
0
ファイル: RuleTests.cs プロジェクト: evelasco85/LogSystem
        void SetupRules()
        {
            IRule accessRightsViolationRule = new Rule(Guid.NewGuid().ToString());

            accessRightsViolationRule
            .AddVariableScope(_componentVar)
            .AddVariableScope(_eventNameVar)
            .AddVariableScope(_isAdminVar, true)
            .AddVariableScope(_accessRightsVar, true);

            //Event-trigger condition
            IBooleanBase componentCondition     = EqualToExpression.New(_componentVar, new Literal(AUTHENTICATION_COMPONENT_NAME));
            IBooleanBase eventCondition         = EqualToExpression.New(_eventNameVar, new Literal(AUTHENTICATION_EVENT_NAME));
            IBooleanBase matchingEventCondition = AndExpression.New(componentCondition, eventCondition);

            //Parameter-trigger condition
            IBooleanBase accessRightsCondition           = EqualToExpression.New(_accessRightsVar, new Literal(Rights.Full));
            IBooleanBase isAdministratorCondition        = EqualToExpression.New(_isAdminVar, new Literal(true));
            IBooleanBase notAllowedAccessRightsCondition = AndExpression.New(accessRightsCondition, NotExpression.New(isAdministratorCondition));

            //Trigger condition
            IBooleanBase triggerCondition = AndExpression.New(matchingEventCondition, notAllowedAccessRightsCondition);

            accessRightsViolationRule.SetCondition(triggerCondition,
                                                   (resultContext, resultRule) =>
            {
                Console.WriteLine("Access rights violation alert!");
            },
                                                   (resultContext, resultRule) =>
            {
                Console.WriteLine("All is well...");
            });

            RuleManager.GetInstance().AddRule(accessRightsViolationRule);
        }
コード例 #3
0
ファイル: Rule.cs プロジェクト: mmousa8189/LogSystem
        public IRuleValidation SetCondition(IBooleanBase condition,
                                            SuccessfulConditionsInvokedDelegate successfulResultInvocation,
                                            FailedConditionsInvokedDelegate failedResultInvocation)
        {
            _condition = condition;
            _successfulResultInvocation = successfulResultInvocation;
            _failedResultInvocation     = failedResultInvocation;

            return(this);
        }
コード例 #4
0
        public void TestCondition2()
        {
            Variable     x = new Variable("index");
            IBooleanBase resultExpression = GreatherThanExpression.New(x, new Literal("L2", 1));
            Context      context          = new Context();

            context.Assign(x.Name, 2);

            bool result = resultExpression.Evaluate(context);

            Assert.IsTrue(result);
        }
コード例 #5
0
        public void TestCondition()
        {
            Variable     x = new Variable("index");
            IBooleanBase resultExpression = EqualToExpression.New(x, new Literal("L1", "1"));
            IBooleanBase all     = AndExpression.New(resultExpression, BooleanExpression.True());
            Context      context = new Context();

            context.Assign(x.Name, "1");

            bool invertResult = (NotExpression.New(all)).Evaluate(context);
            bool result       = all.Evaluate(context);

            Assert.IsTrue(result);
        }
コード例 #6
0
        IBooleanBase ConvertTokenToCondition(string conditionTokens, IDictionary <string, Tuple <string, IData, bool> > variables, ref IRule rule)
        {
            IList <string> postFixConditionTokens = ParseConditionToPostFixTokenList(new StringBuilder(conditionTokens));

            Stack <object> stack = new Stack <object>();

            for (int index = 0; index < postFixConditionTokens.Count; index++)
            {
                string token = postFixConditionTokens[index];

                if (IsOperator(token))
                {
                    IList <object> operands = new List <object>();

                    if (((token == AndExpression.Operator) || (token == OrExpression.Operator)))
                    {
                        while (stack.Any())
                        {
                            operands.Add(stack.Pop());
                        }
                    }
                    else
                    {
                        operands.Add(stack.Pop());
                        operands.Add(stack.Pop());
                    }

                    Type operatorType = GetOperatorType(token);

                    stack.Push(CreateConditionInstance(operatorType, operands.ToArray()));
                }
                else
                {
                    stack.Push(variables[token].Item2);
                    rule.AddVariableScope(variables[token].Item2, variables[token].Item3);
                }
            }

            IBooleanBase condition = (IBooleanBase)stack.Pop();

            return(condition);
        }
コード例 #7
0
ファイル: NotExpression.cs プロジェクト: mmousa8189/LogSystem
 public static IBooleanBase New(IBooleanBase boolean)
 {
     return(new NotExpression(boolean));
 }
コード例 #8
0
ファイル: NotExpression.cs プロジェクト: mmousa8189/LogSystem
 public NotExpression(IBooleanBase boolean)
 {
     _boolean = boolean;
 }
コード例 #9
0
ファイル: Rule.cs プロジェクト: mmousa8189/LogSystem
 public IRuleValidation SetCondition(IBooleanBase condition)
 {
     SetCondition(condition, null, null);
     return(this);
 }