예제 #1
0
 private IEnumerable<IRuleDependency> CompileDependencies(IRuleDefinition ruleDefinition)
 {
     foreach (var dependency in ruleDefinition.DependencyGroup.Dependencies)
     {
         var compiledDependency = new RuleDependency(dependency.Declaration, dependency.ServiceType);
         yield return compiledDependency;
     }
 }
예제 #2
0
 public CompiledRule(IRuleDefinition definition, IEnumerable<IRuleAction> actions, IEnumerable<IRuleDependency> dependencies)
 {
     _priority = definition.Priority;
     _repeatability = definition.Repeatability;
     _definition = definition;
     _actions = new List<IRuleAction>(actions);
     _dependencies = new List<IRuleDependency>(dependencies);
 }
예제 #3
0
        public IRuleDefinition Transform(IRuleDefinition rule)
        {
            var lhsContext = new Context();
            var lhs        = Transform <GroupElement>(lhsContext, rule.LeftHandSide);

            var rhsContext = new Context();
            var rhs        = Transform <ActionGroupElement>(rhsContext, rule.RightHandSide);

            if (lhsContext.IsModified || rhsContext.IsModified)
            {
                var transformedRule = new RuleDefinition(rule.Name, rule.Description, rule.Priority,
                                                         rule.Repeatability, rule.Tags, rule.Properties, rule.DependencyGroup, rule.FilterGroup, lhs, rhs);
                return(transformedRule);
            }
            return(rule);
        }
예제 #4
0
        public void Tags_TagAttributesAndParentAttributesPresent_CustomValues()
        {
            //Arrange
            _repository.Load(x => x.From(typeof(RuleWithMetadataAndParentMetadata)));
            IRuleDefinition rule = _repository.GetRules().Single();

            //Act
            string[] actual = rule.Tags.ToArray();

            //Assert
            Assert.AreEqual(4, actual.Length);
            Assert.Contains("ChildTag", actual);
            Assert.Contains("ChildMetadata", actual);
            Assert.Contains("ParentTag", actual);
            Assert.Contains("ParentMetadata", actual);
        }
예제 #5
0
        public static XmlNode CreateCategoryDefinitionXmlNode(XmlDocument doc, ICategoryDefinition definition)
        {
            // <CategoryDefinition Enabled="true" Id="{GUID}" RefName="Try-Catches" RefId="{GUID}">
            //   <RuleDefinition Enabled="true" Id="{GUID}" RefName="No explicit exception identifier" RefId="{GUID}"/>
            //   <RuleDefinition Enabled="true" Id="{GUID}" RefName="Empty try-catch" RefId="{GUID}"/>
            //   <RuleDefinition Enabled="true" Id="{GUID}" RefName="Try-catch vs. throw exception" RefId="{GUID}"/>
            // </CategoryDefinition>
            XmlNode      categoryDefinitionNode = doc.CreateNode(XmlNodeType.Element, "CategoryDefinition", null);
            XmlAttribute idAttrib      = doc.CreateAttribute("Id");
            XmlAttribute enabledAttrib = doc.CreateAttribute("Enabled");
            XmlAttribute refNameAttrib = doc.CreateAttribute("RefName");
            XmlAttribute refIdAttrib   = doc.CreateAttribute("RefId");

            idAttrib.Value      = definition.Id.ToString();
            enabledAttrib.Value = definition.Enabled.ToString();
            refNameAttrib.Value = definition.CategoryDeclarationReferenceName;
            refIdAttrib.Value   = definition.CategoryDeclarationReferenceId + "";

            categoryDefinitionNode.Attributes.Append(idAttrib);
            categoryDefinitionNode.Attributes.Append(enabledAttrib);
            categoryDefinitionNode.Attributes.Append(refNameAttrib);
            categoryDefinitionNode.Attributes.Append(refIdAttrib);

            foreach (KeyValuePair <int, IRuleDefinition> pair in definition.Rules)
            {
                IRuleDefinition ruleDef = pair.Value;

                XmlNode      ruleDefinitionNode = doc.CreateNode(XmlNodeType.Element, "RuleDefinition", null);
                XmlAttribute id      = doc.CreateAttribute("Id");
                XmlAttribute enabled = doc.CreateAttribute("Enabled");
                XmlAttribute refName = doc.CreateAttribute("RefName");
                XmlAttribute refId   = doc.CreateAttribute("RefId");

                id.Value      = ruleDef.Id.ToString();
                enabled.Value = ruleDef.Enabled.ToString();
                refName.Value = ruleDef.RuleDeclarationReferenceName;
                refId.Value   = ruleDef.RuleDeclarationReferenceId + "";

                ruleDefinitionNode.Attributes.Append(id);
                ruleDefinitionNode.Attributes.Append(enabled);
                ruleDefinitionNode.Attributes.Append(refName);
                ruleDefinitionNode.Attributes.Append(refId);

                categoryDefinitionNode.AppendChild(ruleDefinitionNode);
            }
            return(categoryDefinitionNode);
        }
예제 #6
0
        public void AddFilter(IRuleDefinition rule, IAgendaFilter filter)
        {
            if (!_ruleFilters.TryGetValue(rule, out var filters))
            {
                filters = new List <IAgendaFilter>();
                _ruleFilters.Add(rule, filters);
            }
            filters.Add(filter);

            if (filter is IStatefulAgendaFilter saf)
            {
                if (!_ruleStatefulFilters.TryGetValue(rule, out var statefulFilters))
                {
                    statefulFilters = new List <IStatefulAgendaFilter>();
                    _ruleStatefulFilters.Add(rule, statefulFilters);
                }
                statefulFilters.Add(saf);
            }
        }
예제 #7
0
        private ICompiledRule CompileRule(ReteBuilder reteBuilder, IRuleDefinition ruleDefinition)
        {
            var transformation   = new RuleTransformation();
            var transformedRule  = transformation.Transform(ruleDefinition);
            var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList();

            IEnumerable <ITerminalNode> terminals = reteBuilder.AddRule(transformedRule);
            var rightHandSide = transformedRule.RightHandSide;
            var actions       = new List <IRuleAction>();

            foreach (var action in rightHandSide.Actions)
            {
                var factIndexMap = FactIndexMap.CreateMap(action.References, ruleDeclarations);
                var ruleAction   = new RuleAction(action.Expression, factIndexMap);
                actions.Add(ruleAction);
            }

            var rule = new CompiledRule(ruleDefinition, actions);

            BuildRuleNode(rule, terminals);
            return(rule);
        }
예제 #8
0
            public void ConfigurationFactory_AllSupportedTypes_ReturnsValidObject()
            {
                ConfigurationComponentFactory factory = ConfigurationComponentFactory.Instance;

                factory.InitializeComponentAccessPermissions(AppManager);

                Debug.Assert(factory != null, "proxy != null");
                ILanguageDeclaration languageDeclaration = factory.ConfigurationFactory <ILanguageDeclaration>(typeof(ILanguageDeclaration));
                IRuleDeclaration     ruleDeclaration     = factory.ConfigurationFactory <IRuleDeclaration>(typeof(IRuleDeclaration));
                IProjectDefinition   projectDefinition   = factory.ConfigurationFactory <IProjectDefinition>(typeof(IProjectDefinition));
                ICategoryDefinition  categoryDefinition  = factory.ConfigurationFactory <ICategoryDefinition>(typeof(ICategoryDefinition));
                IRuleDefinition      ruleDefinition      = factory.ConfigurationFactory <IRuleDefinition>(typeof(IRuleDefinition));
                IDirectoryDefinition directoryDefinition = factory.ConfigurationFactory <IDirectoryDefinition>(typeof(IDirectoryDefinition));
                IFileDefinition      fileDefinition      = factory.ConfigurationFactory <IFileDefinition>(typeof(IFileDefinition));

                Assert.IsNotNull(languageDeclaration);
                Assert.IsNotNull(ruleDeclaration);
                Assert.IsNotNull(projectDefinition);
                Assert.IsNotNull(categoryDefinition);
                Assert.IsNotNull(ruleDefinition);
                Assert.IsNotNull(directoryDefinition);
                Assert.IsNotNull(fileDefinition);
            }
예제 #9
0
        private void CompileRule(IReteBuilder reteBuilder, IRuleDefinition ruleDefinition)
        {
            var transformation   = new RuleTransformation();
            var transformedRule  = transformation.Transform(ruleDefinition);
            var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList();
            var ruleDependencies = transformedRule.DependencyGroup.Dependencies.Select(x => x.Declaration).ToList();

            IEnumerable <IRuleDependency> dependencies = CompileDependencies(transformedRule);
            IEnumerable <ITerminalNode>   terminals    = reteBuilder.AddRule(transformedRule);

            var rightHandSide = transformedRule.RightHandSide;
            var actions       = new List <IRuleAction>();

            foreach (var action in rightHandSide.Actions)
            {
                var ruleAction = ExpressionCompiler.CompileAction(action, ruleDeclarations, ruleDependencies);
                actions.Add(ruleAction);
            }

            var rule = new CompiledRule(ruleDefinition, ruleDeclarations, actions, dependencies);

            BuildRuleNode(rule, terminals);
        }
예제 #10
0
        private void CompileRule(ReteBuilder reteBuilder, IRuleDefinition ruleDefinition)
        {
            var transformation = new RuleTransformation();
            var transformedRule = transformation.Transform(ruleDefinition);
            var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList();
            var ruleDependencies = transformedRule.DependencyGroup.Dependencies.Select(x => x.Declaration).ToList();

            IEnumerable<IRuleDependency> dependencies = CompileDependencies(transformedRule);
            IEnumerable<ITerminalNode> terminals = reteBuilder.AddRule(transformedRule);

            var rightHandSide = transformedRule.RightHandSide;
            var actions = new List<IRuleAction>();
            foreach (var action in rightHandSide.Actions)
            {
                var factIndexMap = IndexMap.CreateMap(action.References, ruleDeclarations);
                var dependencyIndexMap = IndexMap.CreateMap(action.References, ruleDependencies);
                var ruleAction = new RuleAction(action.Expression, factIndexMap, dependencyIndexMap);
                actions.Add(ruleAction);
            }

            var rule = new CompiledRule(ruleDefinition, actions, dependencies);
            BuildRuleNode(rule, terminals);
        }
예제 #11
0
        private void CreateRuleDefinitionsFile()
        {
            IConfigurationProxy proxy = ProxyHome.Instance.RetrieveConfigurationProxy(OutputKeyKeeper.Instance.AccessKey);

            XmlNode     node;
            XmlDocument doc = XmlFactory.CreateXmlFile(Ids.XSLT_DIR, Ids.ALL_RULE_DEFINITIONS_XSLT_FILE, "RuleDefinitions", out node);

            //<RuleDefinitions>
            //  <RuleDefinition />
            //</RuleDefinitions>
            foreach (KeyValuePair <int, IProjectDefinition> projectDefinition in proxy.Projects())
            {
                foreach (KeyValuePair <int, IRuleDefinition> pair in proxy.ProjectRules(projectDefinition.Value.Id))
                {
                    IRuleDefinition ruleDefinition = pair.Value;

                    IRuleDeclaration ruleDeclaration = proxy.RuleDeclarationFromRuleId(ruleDefinition.RuleDeclarationReferenceId);
                    node.AppendChild(XmlFactory.CreateRuleDefinitionXmlNode(doc, ruleDeclaration, ruleDefinition));
                    doc.AppendChild(node);
                }
            }

            XmlFactory.SaveXmlFile(Path.Combine(OutputRootDir, Ids.OUTPUT_DIR, Ids.ALL_RULE_DEFINITIONS_XML_FILE), doc);
        }
예제 #12
0
 public ResolutionContext(ISession session, IRuleDefinition rule)
 {
     _session = session;
     _rule    = rule;
 }
예제 #13
0
 public ResolutionContext(ISession session, IRuleDefinition rule)
 {
     _session = session;
     _rule = rule;
 }
예제 #14
0
 public void SetRuleDefinition(IRuleDefinition collection)
 {
     currentCollection = collection;
     RefreshCategories();
 }
예제 #15
0
 public void Add(IRuleDefinition rule, RuleElement element)
 {
     _rules.Add(rule);
     _elements.Add(element);
 }
예제 #16
0
        public static XmlNode CreateRuleDefinitionXmlNode(XmlDocument doc, IRuleDeclaration declaration, IRuleDefinition definition)
        {
            // <RuleDefinition Enabled="true" RefName="No explicit exception identifier" RefId="{6C021885-99A7-48D7-97DB-C1FE3242182A}" >
            //   <Description><CDATA ELEMENT /></Description>
            // </RuleDefinition>
            XmlNode      ruleDefinitionXmlNode   = doc.CreateNode(XmlNodeType.Element, "RuleDefinition", null);
            XmlNode      descriptionXmlNode      = doc.CreateNode(XmlNodeType.Element, "Description", null);
            XmlNode      projectRelationXmlNode  = doc.CreateNode(XmlNodeType.Element, "ProjectDefinitionRelation", null);
            XmlNode      categoryRelationXmlNode = doc.CreateNode(XmlNodeType.Element, "CategoryDeclarationRelation", null);
            XmlAttribute idAttrib      = doc.CreateAttribute("Id");
            XmlAttribute enabledAttrib = doc.CreateAttribute("Enabled");
            XmlAttribute refNameAttrib = doc.CreateAttribute("RefName");
            XmlAttribute refIdAttrib   = doc.CreateAttribute("RefId");

            idAttrib.Value      = definition.Id.ToString();
            enabledAttrib.Value = definition.Enabled.ToString();
            refNameAttrib.Value = definition.RuleDeclarationReferenceName;
            refIdAttrib.Value   = definition.RuleDeclarationReferenceId + "";

            ruleDefinitionXmlNode.Attributes.Append(idAttrib);
            ruleDefinitionXmlNode.Attributes.Append(enabledAttrib);
            ruleDefinitionXmlNode.Attributes.Append(refNameAttrib);
            ruleDefinitionXmlNode.Attributes.Append(refIdAttrib);

            XmlCDataSection cdataNameNode = doc.CreateCDataSection(declaration.Description);

            descriptionXmlNode.AppendChild(cdataNameNode);

            projectRelationXmlNode.InnerText  = definition.ParentDefinition.ParentDefinition.Name;
            categoryRelationXmlNode.InnerText = declaration.ParentDeclaration.Name;

            ruleDefinitionXmlNode.AppendChild(descriptionXmlNode);
            ruleDefinitionXmlNode.AppendChild(projectRelationXmlNode);
            ruleDefinitionXmlNode.AppendChild(categoryRelationXmlNode);
            return(ruleDefinitionXmlNode);
        }
예제 #17
0
 public ActionContext(IRuleDefinition rule, ISession session)
 {
     _rule = rule;
     _session = session;
     _isHalted = false;
 }
예제 #18
0
 public ActionContext(IRuleDefinition rule, ISession session)
 {
     _rule     = rule;
     _session  = session;
     _isHalted = false;
 }
예제 #19
0
파일: NodeInfo.cs 프로젝트: arastoul/NRules
 public void Add(IRuleDefinition rule)
 {
     _rules.Add(rule);
 }
예제 #20
0
 public CompiledRule(IRuleDefinition definition, IEnumerable <IRuleAction> actions)
 {
     Priority   = definition.Priority;
     Definition = definition;
     Actions    = new List <IRuleAction>(actions);
 }
예제 #21
0
        public static Model.RuleDefinition RuleDefinitionMapper(IRuleDefinition ruleDefinition)
        {
            return new Model.RuleDefinition()
              {
            Enabled = ruleDefinition.Enabled,

              };
        }
예제 #22
0
 public ActionContext(IRuleDefinition rule)
 {
     Rule       = rule;
     IsHalted   = false;
     Operations = new Queue <ActionOperation>();
 }
예제 #23
0
        public static XmlNode CreateRuleDefinitionXmlNode(XmlDocument doc, IRuleDeclaration declaration, IRuleDefinition definition)
        {
            // <RuleDefinition Enabled="true" RefName="No explicit exception identifier" RefId="{6C021885-99A7-48D7-97DB-C1FE3242182A}" >
              //   <Description><CDATA ELEMENT /></Description>
              // </RuleDefinition>
              XmlNode ruleDefinitionXmlNode   = doc.CreateNode(XmlNodeType.Element, "RuleDefinition", null);
              XmlNode descriptionXmlNode      = doc.CreateNode(XmlNodeType.Element, "Description", null);
              XmlNode projectRelationXmlNode  = doc.CreateNode(XmlNodeType.Element, "ProjectDefinitionRelation", null);
              XmlNode categoryRelationXmlNode = doc.CreateNode(XmlNodeType.Element, "CategoryDeclarationRelation", null);
              XmlAttribute idAttrib           = doc.CreateAttribute("Id");
              XmlAttribute enabledAttrib      = doc.CreateAttribute("Enabled");
              XmlAttribute refNameAttrib      = doc.CreateAttribute("RefName");
              XmlAttribute refIdAttrib        = doc.CreateAttribute("RefId");

              idAttrib.Value      = definition.Id.ToString();
              enabledAttrib.Value = definition.Enabled.ToString();
              refNameAttrib.Value = definition.RuleDeclarationReferenceName;
              refIdAttrib.Value   = definition.RuleDeclarationReferenceId + "";

              ruleDefinitionXmlNode.Attributes.Append(idAttrib);
              ruleDefinitionXmlNode.Attributes.Append(enabledAttrib);
              ruleDefinitionXmlNode.Attributes.Append(refNameAttrib);
              ruleDefinitionXmlNode.Attributes.Append(refIdAttrib);

              XmlCDataSection cdataNameNode = doc.CreateCDataSection(declaration.Description);
              descriptionXmlNode.AppendChild(cdataNameNode);

              projectRelationXmlNode.InnerText  = definition.ParentDefinition.ParentDefinition.Name;
              categoryRelationXmlNode.InnerText = declaration.ParentDeclaration.Name;

              ruleDefinitionXmlNode.AppendChild(descriptionXmlNode);
              ruleDefinitionXmlNode.AppendChild(projectRelationXmlNode);
              ruleDefinitionXmlNode.AppendChild(categoryRelationXmlNode);
              return ruleDefinitionXmlNode;
        }
예제 #24
0
 public ReteBuilderContext(IRuleDefinition rule, DummyNode dummyNode)
 {
     Rule          = rule;
     _declarations = new List <Declaration>();
     BetaSource    = dummyNode;
 }
예제 #25
0
 /// <summary>
 /// Adds a rule to the rule set.
 /// </summary>
 /// <param name="ruleSet">Rule set instance.</param>
 /// <param name="ruleDefinition">Rule definition to add.</param>
 public static void Add(this IRuleSet ruleSet, IRuleDefinition ruleDefinition)
 {
     ruleSet.Add(Enumerable.Repeat(ruleDefinition, 1));
 }