Exemple #1
0
 public bool CustomPropertyByPath(ItemProperty path, out ItemReference propRef)
 {
     propRef = null;
     return(false);
 }
Exemple #2
0
        private void VisitNode(XmlElement elem, ItemReference masterRef)
        {
            var textChildren = elem.ChildNodes.OfType <XmlText>().ToList();

            // Add a dependency to the relevant itemTypes
            if (elem.LocalName == "Item" && elem.HasAttribute("type"))
            {
                ItemType itemType;
                if (_metadata.ItemTypeByName(elem.Attribute("type").ToLowerInvariant(), out itemType))
                {
                    AddDependency(itemType.Reference, elem, elem, masterRef);
                }
                else
                {
                    AddDependency(new ItemReference("ItemType", ItemTypeByNameWhere + elem.Attributes["type"].Value + "'")
                    {
                        KeyedName = elem.Attributes["type"].Value
                    }, elem, elem, masterRef);
                }
            }

            // Item property node
            if (elem.HasAttribute("type") && textChildren.Count == 1 && !string.IsNullOrEmpty(textChildren[0].Value))
            {
                AddDependency(ItemReference.FromItemProp(elem), elem.Parent(), elem, masterRef);
            }
            else if (elem.LocalName == "sqlserver_body" && elem.Parent().LocalName == "Item" && elem.Parent().Attribute("type") == "SQL")
            {
                var names = GetInnovatorNames(elem.InnerText)
                            .Select(n => n.FullName.StartsWith("innovator.", StringComparison.OrdinalIgnoreCase) ?
                                    n.FullName.Substring(10).ToLowerInvariant() :
                                    n.FullName.ToLowerInvariant())
                            .Distinct();

                ItemType      itemType;
                ItemReference sql;
                foreach (var name in names)
                {
                    if (_metadata.ItemTypeByName(name.Replace('_', ' '), out itemType) ||
                        _metadata.ItemTypeByName(name, out itemType))
                    {
                        AddDependency(itemType.Reference, elem.Parent(), elem, masterRef);
                    }
                    else if (_metadata.SqlRefByName(name, out sql))
                    {
                        AddDependency(sql, elem.Parent(), elem, masterRef);
                    }
                }
            }
            else if (elem.LocalName == "data_source" && textChildren.Count == 1 && !string.IsNullOrEmpty(textChildren[0].Value))
            {
                // Property data source dependencies
                var parent = elem.ParentNode as XmlElement;
                if (parent?.LocalName == "Item" && parent.Attribute("type") == "Property")
                {
                    var keyedName = elem.Attribute("keyed_name");
                    var itemtype  = _metadata.ItemTypes.FirstOrDefault(i => i.Reference.Unique == elem.Parent().Parent().Parent().Attribute("id") && i.IsPolymorphic);
                    if (itemtype == null)
                    {
                        var dataType = parent.Element("data_type");
                        if (dataType != null)
                        {
                            switch (dataType.InnerText.ToLowerInvariant())
                            {
                            case "list":
                            case "mv_list":
                            case "filter list":
                                AddDependency(new ItemReference("List", textChildren[0].Value)
                                {
                                    KeyedName = keyedName
                                }, parent, elem, masterRef);
                                break;

                            case "item":
                                AddDependency(new ItemReference("ItemType", textChildren[0].Value)
                                {
                                    KeyedName = keyedName
                                }, parent, elem, masterRef);
                                break;

                            case "sequence":
                                AddDependency(new ItemReference("Sequence", textChildren[0].Value)
                                {
                                    KeyedName = keyedName
                                }, parent, elem, masterRef);
                                break;
                            }
                        }
                    }
                }
            }
            else if (elem != _elem && elem.LocalName == "Item" && elem.HasAttribute("type") &&
                     elem.Attribute("action", "") == "get" &&
                     (elem.HasAttribute("id") || elem.HasAttribute("where")))
            {
                // Item queries
                AddDependency(ItemReference.FromFullItem(elem, true), elem.Parent().Parent(), elem.Parent(), masterRef);
            }
            else if (textChildren.Count == 1 && textChildren[0].Value.StartsWith("vault:///?fileId=", StringComparison.OrdinalIgnoreCase))
            {
                // Vault Id references for image properties
                AddDependency(new ItemReference("File", textChildren[0].Value.Substring(17)), elem.Parent(), elem, masterRef);
            }
            else
            {
                if (elem != _elem && elem.LocalName == "Item" &&
                    elem.HasAttribute("type") && elem.HasAttribute("id") &&
                    elem.Attribute("action", "") != "edit")
                {
                    _definitions.Add(ItemReference.FromFullItem(elem, elem.Attribute("type") == "ItemType"));
                }
                var           isItem = (elem.LocalName == "Item" && elem.HasAttribute("type"));
                ItemProperty  newProp;
                ItemReference propRef;

                foreach (var child in elem.Elements())
                {
                    if (isItem)
                    {
                        newProp = new ItemProperty()
                        {
                            ItemType   = elem.Attributes["type"].Value,
                            ItemTypeId = (elem.HasAttribute("typeid") ? elem.Attributes["typeid"].Value : null),
                            Property   = child.LocalName
                        };
                        if (_metadata.CustomPropertyByPath(newProp, out propRef))
                        {
                            propRef = propRef.Clone();
                            AddDependency(propRef, elem, child, masterRef);
                        }
                    }
                    VisitNode(child, masterRef);
                }
            }
        }