diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs index 682d5348..8e536065 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs @@ -56,6 +56,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes /// Returns the custom name of the object assigned to the node. If the object doesn't have custom name, returns empty string /// public abstract string GetNodeCustomName(object smoObject, SmoQueryContext smoContext); + + /// + /// Returns the name of the object as shown in its Object Explorer node path + /// + public abstract string GetNodePathName(object smoObject); public abstract bool CanCreateChild(TreeNode parent, object context); public abstract TreeNode CreateChild(TreeNode parent, object context); diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs index a33c04e4..9a6bb58c 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs @@ -26,6 +26,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes private TreeNode parent; private string nodePath; private string label; + private string nodePathName; public const char PathPartSeperator = '/'; /// @@ -62,6 +63,23 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes /// public string NodeValue { get; set; } + /// + /// The name of this object as included in its node path + /// + public string NodePathName { + get + { + if (string.IsNullOrEmpty(nodePathName)) + { + return NodeValue; + } + return nodePathName; + } + set + { + nodePathName = value; + } + } /// /// Object metadata for smo objects @@ -175,7 +193,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes } // Otherwise add this value to the beginning of the path and keep iterating up path = string.Format(CultureInfo.InvariantCulture, - "{0}{1}{2}", node.NodeValue, string.IsNullOrEmpty(path) ? "" : PathPartSeperator.ToString(), path); + "{0}{1}{2}", node.NodePathName, string.IsNullOrEmpty(path) ? "" : PathPartSeperator.ToString(), path); return true; }); nodePath = path; diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs index 0cdb24fa..00d65495 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs @@ -241,6 +241,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel if (!string.IsNullOrEmpty(customizedName)) { childAsMeItem.NodeValue = customizedName; + childAsMeItem.NodePathName = GetNodePathName(context); } childAsMeItem.NodeSubType = GetNodeSubType(context, smoContext); @@ -321,5 +322,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { return string.Empty; } + + public override string GetNodePathName(object smoObject) + { + return (smoObject as NamedSmoObject).Name; + } } } diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeTests.cs index d2e773b2..aef8bad8 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeTests.cs @@ -184,21 +184,23 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer } } + [Fact] public void MultiLevelTreeShouldFormatPath() { TreeNode root = new TreeNode("root"); - Assert.Equal("/root" , root.GetNodePath()); + Assert.Equal("root" , root.GetNodePath()); - TreeNode level1Child1 = new TreeNode("L1C1"); + TreeNode level1Child1 = new TreeNode("L1C1 (with extra info)"); + level1Child1.NodePathName = "L1C1"; TreeNode level1Child2 = new TreeNode("L1C2"); root.AddChild(level1Child1); root.AddChild(level1Child2); - Assert.Equal("/root/L1C1" , level1Child1.GetNodePath()); - Assert.Equal("/root/L1C2", level1Child2.GetNodePath()); + Assert.Equal("root/L1C1" , level1Child1.GetNodePath()); + Assert.Equal("root/L1C2", level1Child2.GetNodePath()); TreeNode level2Child1 = new TreeNode("L2C2"); level1Child1.AddChild(level2Child1); - Assert.Equal("/root/L1C1/L2C2", level2Child1.GetNodePath()); + Assert.Equal("root/L1C1/L2C2", level2Child1.GetNodePath()); } [Fact]