protected virtual IEnumerable <XmlConnectionGroup> ReadConnectionGroup(ComponentDescription description, XElement connectionGroupElement, XmlConnectionGroup parentGroup) { IConditionTreeItem conditionCollection = ConditionTree.Empty; var conditionsAttribute = connectionGroupElement.Attribute("conditions"); if (conditionsAttribute != null) { if (!conditionParser.Parse(conditionsAttribute, description, logger, out conditionCollection)) { yield break; } } var connectionGroup = new XmlConnectionGroup(new ConditionTree(ConditionTree.ConditionOperator.AND, parentGroup.Conditions, conditionCollection)); autoRotateOptionsReader.TrySetAutoRotateOptions(connectionGroupElement, parentGroup, connectionGroup); var childGroups = connectionGroupElement.Elements().SelectMany(x => ReadElement(x, description, connectionGroup)); yield return(connectionGroup); foreach (var child in childGroups) { yield return(child); } }
public void ReadSection(XElement element, ComponentDescription description) { var groups = new List <XmlConnectionGroup>(); var defaultGroup = new XmlConnectionGroup(ConditionTree.Empty); autoRotateOptionsReader.TrySetAutoRotateOptions(element, defaultGroup); groups.Add(defaultGroup); foreach (var child in element.Elements()) { groups.AddRange(ReadElement(child, description, defaultGroup)); } var flatGroups = groups.SelectMany(x => x.FlattenRoot(logger)).ToArray(); description.Connections = flatGroups.GroupBy(x => ConditionsReducer.SimplifyConditions(x.Conditions)).Select(g => new ConnectionGroup(g.Key, g.SelectMany(x => x.Value).ToArray())).ToArray(); }
public virtual IEnumerable <XmlConnectionGroup> ReadElement(XElement element, ComponentDescription description, XmlConnectionGroup groupContext) { if (element.Name == GroupElementName || element.Name == GElementName) { return(ReadConnectionGroup(description, element, groupContext)); } else if (element.Name == ConnectionElementName) { if (ReadConnection(element, out var connection)) { groupContext.Value.Add(connection); } return(Enumerable.Empty <XmlConnectionGroup>()); } else { if (element.Name.Namespace == XmlLoader.ComponentNamespace) { logger.LogWarning(element, $"Unknown connection element '{element.Name.LocalName}'"); } return(Enumerable.Empty <XmlConnectionGroup>()); } }