public IModelObject Iterate(IModelObject mp) { var obj = mp.AsComposite(); if (obj == null) { return(null); } HasMore = obj.Value.Count > (currentItem + 1); if (!HasMore) { return(null); } currentItem++; HasMore = obj.Value.Count > (currentItem + 1); //if (obj.Value[currentItem] != null) //{ // obj.Value[currentItem].Resolve(); //} return(obj.Value[currentItem]); }
private void MergePairWithInheritedPropsIntoNewProps(IModelObject pair, List <IModelObject> inheritedProps, List <IModelObject> newProps) { // need to run through the full set, which is the sum of both sets List <string> resultingList = inheritedProps.Select(p => p.Name).ToList(); resultingList.AddRange(pair.AsComposite().Value.Select(p => p.Name)); resultingList = resultingList.Distinct().ToList(); foreach (var item in resultingList) { var itemFromInheritedList = inheritedProps.Find(p => p.Name == item); var itemFromPair = pair.AsComposite().Value.Find(p => p.Name == item); logger.Trace("Merge Properties for {0} - merging {1}", pair.Name, item); if (itemFromPair == null) { // does not exist in the pair, just use the inherited item logger.Trace("Merge Properties for {0} - adding it with value from inherited property {1}", item, itemFromInheritedList.GetText()); newProps.Add(itemFromInheritedList); } if (itemFromInheritedList == null) { // not an inherited item, just use this one if (itemFromPair.Modifier != "-") { logger.Trace("Merge Properties for {0} - adding non-modified property with value {1}", item, itemFromPair.GetText()); newProps.Add(itemFromPair); } else { // removing a non-inherited property logger.Trace("Merge Properties for {0} - removing {1} which is not inherited - ignored", item, item); } } if (itemFromPair != null && itemFromInheritedList != null) { // need to do a proper merge if (itemFromPair.Modifier != "-") { if (itemFromPair.IsComposite() && itemFromInheritedList.IsComposite()) { logger.Trace("Merge Properties for {0} - Property {0} is composite - merging its properties", item); // dive into the tree first List <IModelObject> newSubProps = new List <IModelObject>(); MergePairWithInheritedPropsIntoNewProps(itemFromPair, itemFromInheritedList.AsComposite().Value, newSubProps); itemFromPair.AsComposite().Value = OrderProperties(itemFromPair as ModelCompositeObject, newSubProps); } else { logger.Trace("Merge Properties for {0} - Property {0} is not composite - and exists in property and its parent - set value to {1}", item, itemFromPair.GetText()); } logger.Trace("Merge Properties for {0} - setting merged property to {1}", itemFromPair.Name, itemFromPair.GetText()); newProps.Add(itemFromPair); } else { logger.Trace("Merge Properties for {0} - removing {1}", pair.Name, item); } } } AddInheritedPropertiesToElements(pair.Path, newProps); }