From 9b226de9228efaee690d1ba692392affff650d18 Mon Sep 17 00:00:00 2001 From: Lyra1337 Date: Thu, 16 Feb 2017 16:45:11 +0100 Subject: [PATCH 1/2] extended LinkMapper to support external links --- src/Qwiq.Core/IExternalLink.cs | 11 +++++ src/Qwiq.Core/LinkMapper.cs | 53 +++++++++++++--------- src/Qwiq.Core/Proxies/ExternalLinkProxy.cs | 29 ++++++++++++ src/Qwiq.Core/Qwiq.Core.csproj | 3 ++ src/Qwiq.Core/RegisteredLinkTypeMapper.cs | 13 ++++++ 5 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 src/Qwiq.Core/IExternalLink.cs create mode 100644 src/Qwiq.Core/Proxies/ExternalLinkProxy.cs create mode 100644 src/Qwiq.Core/RegisteredLinkTypeMapper.cs diff --git a/src/Qwiq.Core/IExternalLink.cs b/src/Qwiq.Core/IExternalLink.cs new file mode 100644 index 00000000..da8b50a8 --- /dev/null +++ b/src/Qwiq.Core/IExternalLink.cs @@ -0,0 +1,11 @@ +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq +{ + public interface IExternalLink : ILink + { + string LinkedArtifactUri { get; } + + string ArtifactLinkTypeName { get; } + } +} diff --git a/src/Qwiq.Core/LinkMapper.cs b/src/Qwiq.Core/LinkMapper.cs index 756d1a0c..138eaa35 100644 --- a/src/Qwiq.Core/LinkMapper.cs +++ b/src/Qwiq.Core/LinkMapper.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Microsoft.Qwiq.Exceptions; using Microsoft.Qwiq.Proxies; using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; @@ -9,36 +10,46 @@ internal class LinkMapper { public Tfs.Link Map(ILink link, Tfs.WorkItem item) { - if (link.BaseType == BaseLinkType.RelatedLink) + switch (link.BaseType) { - var relatedLink = (IRelatedLink)link; - var linkTypeEnd = LinkTypeEndMapper.Map(item.Store, relatedLink.LinkTypeEnd); - return new Tfs.RelatedLink(linkTypeEnd, relatedLink.RelatedWorkItemId); - } - if (link.BaseType == BaseLinkType.Hyperlink) - { - var hyperlink = (IHyperlink) link; - return new Tfs.Hyperlink(hyperlink.Location); + case BaseLinkType.RelatedLink: + var relatedLink = (IRelatedLink)link; + var linkTypeEnd = LinkTypeEndMapper.Map(item.Store, relatedLink.LinkTypeEnd); + return new Tfs.RelatedLink(linkTypeEnd, relatedLink.RelatedWorkItemId); + + case BaseLinkType.Hyperlink: + var hyperlink = (IHyperlink)link; + return new Tfs.Hyperlink(hyperlink.Location); + + case BaseLinkType.ExternalLink: + var externalLink = (IExternalLink)link; + var registeredLinkType = RegisteredLinkTypeMapper.Map(item.Store, externalLink.ArtifactLinkTypeName); + return new Tfs.ExternalLink(registeredLinkType, externalLink.LinkedArtifactUri); + + default: + throw new ArgumentException("Unknown link type", nameof(link)); } - throw new ArgumentException("Unknown link type", nameof(link)); } public ILink Map(Tfs.Link link) { - if (link.BaseType == Tfs.BaseLinkType.RelatedLink) + switch (link.BaseType) { - var relatedLink = (Tfs.RelatedLink) link; - return ExceptionHandlingDynamicProxyFactory.Create(new RelatedLinkProxy(relatedLink)); + case Tfs.BaseLinkType.RelatedLink: + var relatedLink = (Tfs.RelatedLink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new RelatedLinkProxy(relatedLink)); - } - if (link.BaseType == Tfs.BaseLinkType.Hyperlink) - { - var hyperlink = (Tfs.Hyperlink) link; - return ExceptionHandlingDynamicProxyFactory.Create(new HyperlinkProxy(hyperlink)); - } + case Tfs.BaseLinkType.Hyperlink: + var hyperlink = (Tfs.Hyperlink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new HyperlinkProxy(hyperlink)); + + case Tfs.BaseLinkType.ExternalLink: + var externalLink = (Tfs.ExternalLink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new ExternalLinkProxy(externalLink)); - throw new ArgumentException("Unknown link type", nameof(link)); + default: + throw new ArgumentException("Unknown link type", nameof(link)); + } } } } - diff --git a/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs new file mode 100644 index 00000000..806a4d41 --- /dev/null +++ b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs @@ -0,0 +1,29 @@ +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq.Proxies +{ + public class ExternalLinkProxy : LinkProxy, IExternalLink + { + private readonly Tfs.ExternalLink externalLink; + + internal ExternalLinkProxy(Tfs.ExternalLink externalLink) : base(externalLink) + { + this.externalLink = externalLink; + } + + public string LinkedArtifactUri + { + get { return this.externalLink.LinkedArtifactUri; } + } + + public string ArtifactLinkTypeName + { + get { return this.externalLink.ArtifactLinkType.Name; } + } + + //public Tfs.RegisteredLinkType ArtifactLinkType + //{ + // get { return _hyperLink.ArtifactLinkType; } + //} + } +} diff --git a/src/Qwiq.Core/Qwiq.Core.csproj b/src/Qwiq.Core/Qwiq.Core.csproj index 584bba9f..17c328db 100644 --- a/src/Qwiq.Core/Qwiq.Core.csproj +++ b/src/Qwiq.Core/Qwiq.Core.csproj @@ -259,6 +259,7 @@ + @@ -292,6 +293,7 @@ + @@ -314,6 +316,7 @@ + diff --git a/src/Qwiq.Core/RegisteredLinkTypeMapper.cs b/src/Qwiq.Core/RegisteredLinkTypeMapper.cs new file mode 100644 index 00000000..0dfa3345 --- /dev/null +++ b/src/Qwiq.Core/RegisteredLinkTypeMapper.cs @@ -0,0 +1,13 @@ +using System.Linq; +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq +{ + internal static class RegisteredLinkTypeMapper + { + public static Tfs.RegisteredLinkType Map(Tfs.WorkItemStore store, string linkTypeName) + => store.RegisteredLinkTypes + .OfType() + .FirstOrDefault(x => x.Name == linkTypeName); + } +} From 42a39e017e0084aa6eef3166fc9b165c7c0aaa23 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 16 Feb 2017 20:08:23 +0100 Subject: [PATCH 2/2] removed comments --- src/Qwiq.Core/Proxies/ExternalLinkProxy.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs index 806a4d41..b5798467 100644 --- a/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs +++ b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs @@ -20,10 +20,5 @@ public string ArtifactLinkTypeName { get { return this.externalLink.ArtifactLinkType.Name; } } - - //public Tfs.RegisteredLinkType ArtifactLinkType - //{ - // get { return _hyperLink.ArtifactLinkType; } - //} } }