Example #1
0
            public action(XElement actionNode, pattern[] patterns, ParentTwoChildRule ownerRule) : base(actionNode)
            {
                OwnerRule = ownerRule;

                SNT = actionNode.AttributeValue2Enum <TonalityType>("SNT");
                CreateNewElementType = actionNode.AttributeValue2Enum <TypeOfXmlElement>("createnewelement");

                ROLE = actionNode.GetAttributeROLE("setattribute_ROLE");
                if (!ROLE.HasValue)
                {
                    var role = actionNode.GetAttribute("determineattribute_ROLE");
                    if (!role.IsEmptyOrNull())
                    {
                        determineattribute_ROLE = role.ToEnum <determine_attribute>();
                    }
                }
                TYPE = actionNode.GetAttributeTYPE("setattribute_TYPE");
                if (!TYPE.HasValue)
                {
                    var type = actionNode.GetAttribute("determineattribute_TYPE");
                    if (!type.IsEmptyOrNull())
                    {
                        determineattribute_TYPE = type.ToEnum <determine_attribute>();
                    }
                }

                foreach (var condition in actionNode.GetMultiNodes("condition")
                         .RevealConfigNodes()
                         )
                {
                    var a_attributes = condition.GetAttributeNodes("@*[ starts-with( local-name(), 'a' ) ]").ToArray();
                    if (2 < a_attributes.Length)
                    {
                        throw (new ArgumentException("@*[ starts-with( local-name(), 'a' ) ].Length > 2 (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                    }

                    if (a_attributes.Except(condition.Attributes()).Any())
                    {
                        throw (new ArgumentException("Action-element has not only a[1,2,3..] attributes (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                    }

                    //for check
                    foreach (var a in a_attributes)
                    {
                        var number = 0;
                        if (!int.TryParse(a.Name.LocalName.Substring(1), out number))
                        {
                            throw (new ArgumentException("Action-element has wrong name-format a[1,2,3..] attribute (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                        }

                        var type = a.Value.TryConvert2Enum <TonalityType>();
                        if (!type.HasValue)
                        {
                            throw (new ArgumentException("Action-element has wrong value in a[1,2,3..] attribute (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                        }
                    }


                    var a_type = from a in a_attributes
                                 let number = int.Parse(a.Name.LocalName.Substring(1))
                                              orderby number
                                              select new
                    {
                        index = number - 1,
                        value = a.Value.ToEnum <TonalityType>()
                    };

                    var sb = new StringBuilder();
                    foreach (var a_ in a_type)
                    {
                        sb.Append(a_.value.ToText() + '|');
                    }
                    _ConditionHashset.Add(sb.ToString());

                    if (Indexies4GettingSNT == null)
                    {
                        Indexies4GettingSNT = a_type.Select(_ => _.index).ToArray();
                    }
                    else
                    {
                        if (Indexies4GettingSNT.Except(a_type.Select(_ => _.index)).Any())
                        {
                            throw (new ArgumentException("Action-element has condition-element with different a[1,2,3..] attributes sets (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                        }
                    }

                    //check corresponding patterns & action @SNT-attribute indexies
                    foreach (var pattern in patterns)
                    {
                        foreach (var i in Indexies4GettingSNT)
                        {
                            if (pattern.Items.Length <= i)
                            {
                                throw (new ArgumentException("a[1,2,3..] has index length more than pattern-item-count (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }

                            var item = pattern.Items[i];
                            switch (item.TypeOfXmlElement)
                            {
                            case TypeOfXmlElement.U:
                            case TypeOfXmlElement.CET:
                                throw (new ArgumentException("U-element & CET-element can't have @SNT-attribute (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }
                        }


                        if (determineattribute_ROLE.HasValue)
                        {
                            var index = extensions.ToIndex(determineattribute_ROLE.Value);
                            if (pattern.Items.Length < index)
                            {
                                throw (new ArgumentException("@determineattribute_ROLE-attribute point to not exists element (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }

                            switch (pattern.Items[index].TypeOfXmlElement)
                            {
                            case TypeOfXmlElement.U:
                            case TypeOfXmlElement.CET:
                                throw (new ArgumentException("@determineattribute_ROLE-attribute can't point on U-element | CET-element (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }
                        }
                        if (determineattribute_TYPE.HasValue)
                        {
                            var index = extensions.ToIndex(determineattribute_TYPE.Value);
                            if (pattern.Items.Length < index)
                            {
                                throw (new ArgumentException("@determineattribute_TYPE-attribute point to not exists element (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }

                            switch (pattern.Items[index].TypeOfXmlElement)
                            {
                            case TypeOfXmlElement.U:
                            case TypeOfXmlElement.CET:
                                throw (new ArgumentException("@determineattribute_TYPE-attribute can't point on U-element | CET-element (rule " + OwnerRule.Id.InSingleQuote() + ')'));
                            }
                        }
                    }
                }
            }
Example #2
0
            public pattern(XElement patternNode, ParentTwoChildRule ownerRule)
            {
                #region [.parent.]
                if (patternNode.Elements().Count() != 1)
                {
                    throw (new ArgumentException("patternNode.Elements().Count() != 1 (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                var parent = patternNode.Elements().First();
                if (parent.Attributes().Count() != 1)
                {
                    throw (new ArgumentException("parent.Attributes().Count() != 1 (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                ParentName = parent.Name.LocalName;
                var attr = parent.FirstAttribute;
                ParentAttributeName = attr.Name.LocalName;
                if (ParentAttributeName == "TYPE")
                {
                    ParentAttributeValue = attr.Value.ToEnum <TypeAttributeValue>().ToString();
                }
                else if (ParentAttributeName == "ROLE")
                {
                    ParentAttributeValue = attr.Value.ToEnum <RoleAttributeValue>().ToString();
                }
                else
                {
                    throw (new ArgumentException("parent.FirstAttribute.Name is " + attr.Name.LocalName.InSingleQuote() + " (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                if (parent.Elements().Count() != 2)
                {
                    throw (new ArgumentException("parent.Elements().Count() != 2 (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }
                #endregion

                #region [.first.]
                var first = parent.Elements().First();
                if (first.Attributes().Count() != 1)
                {
                    throw (new ArgumentException("first.Attributes().Count() != 1 (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }
                FirstName          = first.Name.LocalName;
                attr               = first.FirstAttribute;
                FirstAttributeName = attr.Name.LocalName;
                if (FirstAttributeName == "TYPE")
                {
                    FirstAttributeValue = attr.Value.ToEnum <TypeAttributeValue>().ToString();
                }
                else if (FirstAttributeName == "ROLE")
                {
                    FirstAttributeValue = attr.Value.ToEnum <RoleAttributeValue>().ToString();
                }
                else
                {
                    throw (new ArgumentException("first.FirstAttribute.Name is " + attr.Name.LocalName.InSingleQuote() + " (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                var firstInnerText = first.Value.Trim();
                if (!firstInnerText.IsEmptyOrNull())
                {
                    FirstMatchString = firstInnerText.ToLowerEx().Replace('\'', '"');
                }
                #endregion

                #region [.second.]
                var second = first.ElementsAfterSelf().First();
                if (second.Attributes().Count() != 1)
                {
                    throw (new ArgumentException("second.Attributes().Count() != 1 (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }
                SecondName          = second.Name.LocalName;
                attr                = second.FirstAttribute;
                SecondAttributeName = attr.Name.LocalName;
                if (SecondAttributeName == "TYPE")
                {
                    SecondAttributeValue = attr.Value.ToEnum <TypeAttributeValue>().ToString();
                }
                else if (SecondAttributeName == "ROLE")
                {
                    SecondAttributeValue = attr.Value.ToEnum <RoleAttributeValue>().ToString();
                }
                else
                {
                    throw (new ArgumentException("second.FirstAttribute.Name is " + attr.Name.LocalName.InSingleQuote() + " (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                var secondInnerText = second.Value.Trim();
                if (!secondInnerText.IsEmptyOrNull())
                {
                    SecondMatchString = secondInnerText.ToLowerEx().Replace('\'', '"');
                }
                #endregion

                #region [.first + second = items.]
                var nodes = parent.GetMultiNodes("./*").ToArray();
                if (nodes.Length != 2)
                {
                    throw (new ArgumentException("Pattern element != 2 items (rule " + ownerRule.Id.InSingleQuote() + ')'));
                }

                Items = (from node in nodes
                         select new item(node)
                         ).ToArray();
                #endregion
            }