public DependencyAnalyzer(Connection _conn, Dictionary <string, ItemType> itemTypes)
        {
            _parser.SchemaToKeep = "innovator";

            _coreMethods = new HashSet <ItemReference>();
            ItemReference itemRef;
            var           methodItems = _conn.GetItems("ApplyItem", Properties.Resources.GetCoreMethods);

            foreach (var methodItem in methodItems)
            {
                itemRef           = new ItemReference("Method", "[Method].[config_id] = '" + methodItem.Element("config_id", "") + "'");
                itemRef.KeyedName = methodItem.Element("id").Attribute("keyed_name", "");
                _coreMethods.Add(itemRef);
            }

            _systemIdentities = new Dictionary <string, ItemReference>();
            var sysIdents = _conn.GetItems("ApplyItem", Properties.Resources.SystemIdentities);

            foreach (var sysIdent in sysIdents)
            {
                itemRef           = ItemReference.FromFullItem(sysIdent, false);
                itemRef.KeyedName = sysIdent.Element("name", "");
                _systemIdentities.Add(itemRef.Unique, itemRef);
            }

            _sql = new Dictionary <string, ItemReference>();
            var sqlItems = _conn.GetItems("ApplyItem", Properties.Resources.SqlItems);

            foreach (var sql in sqlItems)
            {
                itemRef           = ItemReference.FromFullItem(sql, false);
                itemRef.KeyedName = sql.Element("name", "");
                _sql.Add(itemRef.KeyedName.ToLowerInvariant(), itemRef);
            }

            _customProps = new Dictionary <ItemProperty, ItemReference>();
            var        customPropItems = _conn.GetItems("ApplyItem", Properties.Resources.CustomUserProperties);
            XmlElement itemType;

            foreach (var customProp in customPropItems)
            {
                itemType = customProp.Elements("source_id").Element("Item");
                _customProps.Add(new ItemProperty()
                {
                    ItemType   = itemType.Element("name").InnerText,
                    ItemTypeId = itemType.Element("id").InnerText,
                    Property   = customProp.Element("name").InnerText,
                    PropertyId = customProp.Element("id").InnerText
                }, new ItemReference("Property", customProp.Element("id").InnerText)
                {
                    KeyedName = customProp.Element("name").InnerText
                });
            }

            _itemTypes = itemTypes;
        }
        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 (_itemTypes.TryGetValue(elem.Attribute("type").ToLowerInvariant(), out itemType))
                {
                    AddDependency(itemType.Reference, elem, elem, masterRef);
                }
                else
                {
                    AddDependency(new ItemReference("ItemType", "[ItemType].[name] = '" + 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 = _parser.FindSqlServerObjectNames(elem.InnerText)
                            .Select(n => n.StartsWith(_parser.SchemaToKeep + ".", StringComparison.OrdinalIgnoreCase) ?
                                    n.Substring(_parser.SchemaToKeep.Length + 1).ToLowerInvariant() :
                                    n.ToLowerInvariant())
                            .Distinct();

                ItemType      itemType;
                ItemReference sql;
                foreach (var name in names)
                {
                    if (_itemTypes.TryGetValue(name.Replace('_', ' '), out itemType))
                    {
                        AddDependency(itemType.Reference, elem.Parent(), elem, masterRef);
                    }
                    else if (_sql.TryGetValue(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 != null && parent.LocalName == "Item" && parent.Attribute("type") == "Property")
                {
                    var keyedName = elem.Attribute("keyed_name");
                    var itemtype  = _itemTypes.Values.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"))
                {
                    _definitions.Add(ItemReference.FromFullItem(elem, false));
                }
                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 (_customProps.TryGetValue(newProp, out propRef))
                        {
                            propRef = propRef.Clone();
                            AddDependency(propRef, elem, child, masterRef);
                        }
                    }
                    VisitNode(child, masterRef);
                }
            }
        }
Пример #3
0
        public static InstallItem FromScript(XmlElement elem)
        {
            var result = new InstallItem();

            result._elem    = elem;
            result._itemRef = ItemReference.FromFullItem(elem, true);
            if (result._itemRef.Type.IsGuid())
            {
                result.InstalledId = result._itemRef.Type;
            }
            else
            {
                result.InstalledId = elem.Attribute("id", "");
            }

            if (elem.HasAttribute("_dependency_check"))
            {
                result._type = InstallType.DependencyCheck;
            }
            else if (elem.HasAttribute("action"))
            {
                switch (elem.Attributes["action"].Value)
                {
                case "add":
                case "merge":
                case "create":
                    result._type = InstallType.Create;
                    break;

                case "ActivateActivity":
                case "AddItem":
                case "AddHistory":
                case "ApplyUpdate":
                case "BuildProcessReport":
                case "CancelWorkflow":
                case "checkImportedItemType":
                case "closeWorkflow":
                case "copy":
                case "copyAsIs":
                case "copyAsNew":
                case "delete":
                case "edit":
                case "EmailItem":
                case "EvaluateActivity":
                case "exportItemType":
                case "get":
                case "getItemAllVersions":
                case "getAffectedItems":
                case "getItemConfig":
                case "getItemLastVersion":
                case "getItemNextStates":
                case "getItemRelationships":
                case "GetItemRepeatConfig":
                case "getItemWhereUsed":
                case "GetMappedPath":
                case "getPermissions":
                case "getRelatedItem":
                case "GetUpdateInfo":
                case "instantiateWorkflow":
                case "lock":
                case "New Workflow Map":
                case "PromoteItem":
                case "purge":
                case "recache":
                case "replicate":
                case "resetAllItemsAccess":
                case "resetItemAccess":
                case "resetLifecycle":
                case "setDefaultLifecycle":
                case "skip":
                case "startWorkflow":
                case "unlock":
                case "update":
                case "ValidateWorkflowMap":
                case "version":
                    if ((elem.Attributes["type"].Value != "Form" && elem.Attributes["type"].Value != "View") ||
                        elem.Attributes["action"].Value != "delete")
                    {
                        result._dependencies = Enumerable.Repeat(result._itemRef, 1);
                    }
                    result._itemRef = new ItemReference("*Script", result._itemRef.ToString() + " " + Utils.GetChecksum(Encoding.UTF8.GetBytes(elem.OuterXml)))
                    {
                        KeyedName = RenderAttributes(elem)
                    };
                    result._type = InstallType.Script;
                    break;

                default:
                    result._dependencies = Enumerable.Repeat(new ItemReference("Method", "[Method].[name] = '" + elem.Attributes["action"].Value + "'")
                    {
                        KeyedName = elem.Attributes["action"].Value
                    }, 1);
                    result._itemRef = new ItemReference("*Script", result._itemRef.ToString() + " " + Utils.GetChecksum(Encoding.UTF8.GetBytes(elem.OuterXml)))
                    {
                        KeyedName = RenderAttributes(elem)
                    };
                    result._type = InstallType.Script;
                    break;
                }
            }

            if (elem.Attribute(XmlFlags.Attr_IsScript) == "1")
            {
                if (string.IsNullOrEmpty(result._itemRef.KeyedName))
                {
                    result._itemRef.KeyedName = RenderAttributes(elem);
                }
                result._type = InstallType.Script;
            }
            return(result);
        }