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); }
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); }
public IRuleValidation SetCondition(IBooleanBase condition, SuccessfulConditionsInvokedDelegate successfulResultInvocation, FailedConditionsInvokedDelegate failedResultInvocation) { _condition = condition; _successfulResultInvocation = successfulResultInvocation; _failedResultInvocation = failedResultInvocation; return(this); }
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); }
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); }
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); }
public static IBooleanBase New(IBooleanBase boolean) { return(new NotExpression(boolean)); }
public NotExpression(IBooleanBase boolean) { _boolean = boolean; }
public IRuleValidation SetCondition(IBooleanBase condition) { SetCondition(condition, null, null); return(this); }