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); } } }
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); }