Exemple #1
0
        protected internal void ValidateListsBasedOnAttributes(string parent)
        {
            var metadata     = CfgMetadataCache.GetMetadata(Type);
            var elementNames = CfgMetadataCache.ElementNames(Type).ToList();

            foreach (var listName in elementNames)
            {
                var listMetadata = metadata[listName];
                var list         = (IList)listMetadata.Getter(this);
                ValidateUniqueAndRequiredProperties(parent, listName, listMetadata, list);
            }
        }
Exemple #2
0
        void LoadCollections(INode node, string parentName, IDictionary <string, string> parameters, uint sequence)
        {
            var metadata     = CfgMetadataCache.GetMetadata(Type);
            var elementNames = CfgMetadataCache.ElementNames(Type).ToList();
            var elements     = new Dictionary <string, IList>();
            var elementHits  = new HashSet <string>();
            var addHits      = new HashSet <string>();

            //initialize all the lists
            for (var i = 0; i < elementNames.Count; i++)
            {
                var key = elementNames[i];
                elements.Add(key, (IList)metadata[key].Getter(this));
            }

            for (var i = 0; i < node.SubNodes.Count; i++)
            {
                var subNode    = node.SubNodes[i];
                var subNodeKey = CfgMetadataCache.NormalizeName(Type, subNode.Name);
                if (metadata.ContainsKey(subNodeKey))
                {
                    elementHits.Add(subNodeKey);
                    var item = metadata[subNodeKey];

                    for (var j = 0; j < subNode.SubNodes.Count; j++)
                    {
                        var add = subNode.SubNodes[j];
                        if (add.Name.Equals("add", StringComparison.Ordinal))
                        {
                            var addKey = CfgMetadataCache.NormalizeName(Type, subNode.Name);
                            addHits.Add(addKey);
                            if (item.Loader == null)
                            {
                                if (item.ImplementsProperties)
                                {
                                    object obj = null;

                                    //todo: these activator.createinstances should be cached
                                    foreach (var cp in item.Constructors)
                                    {
                                        if (!cp.Any())
                                        {
                                            obj = Activator.CreateInstance(item.ListType);
                                            break;
                                        }

                                        if (cp.Count() == 1)
                                        {
                                            if (cp.First().ParameterType == typeof(int))
                                            {
                                                obj = Activator.CreateInstance(item.ListType, add.Attributes.Count);
                                                break;
                                            }

                                            if (cp.First().ParameterType == typeof(string[]))
                                            {
                                                var names = add.Attributes.Select(a => a.Name).ToArray();
                                                obj = Activator.CreateInstance(item.ListType, new object[] { names });
                                                break;
                                            }
                                        }
                                    }
                                    if (obj == null)
                                    {
                                        Events.ConstructorNotFound(parentName, subNode.Name);
                                    }
                                    else
                                    {
                                        var properties = (IProperties)obj;
                                        for (var k = 0; k < add.Attributes.Count; k++)
                                        {
                                            foreach (var c in Customizers)
                                            {
                                                c.Customize(string.Empty, add, parameters, Events.Logger);
                                            }
                                            var attribute = add.Attributes[k];
                                            properties[attribute.Name] = attribute.Value;
                                        }
                                        elements[addKey].Add(obj);
                                    }
                                }
                            }
                            else
                            {
                                elements[addKey].Add(item.Loader().Process(add, subNode.Name, Serializer, Events, parameters, Customizers, ++sequence, Enabled));
                            }
                        }
                        else
                        {
                            Events.UnexpectedElement(add.Name, subNode.Name);
                        }
                    }
                }
                else
                {
                    Events.InvalidElement(parentName, node.Name, subNode.Name);
                }
            }
        }