Beispiel #1
0
        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);
        }