public override void RegisterSupportedLinkTypes() { LinkType linkType = new WorkItemChangeListLinkType(); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; linkType = new WorkItemHyperlinkLinkType(); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; linkType = new WorkItemLatestFileLinkType(); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; linkType = new WorkItemRevisionFileLinkType(); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; linkType = new Tfs2010WorkItemRelatedLinkType(); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; foreach (RegisteredLinkType registeredLinkType in m_migrationSource.WorkItemStore.WorkItemStore.RegisteredLinkTypes) { Debug.Assert(!string.IsNullOrEmpty(registeredLinkType.Name)); if (!TfsDefaultLinkType(registeredLinkType)) { linkType = new WorkItemExternalLinkType(registeredLinkType.Name); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; } } // skipping WorkItemRelatedLinkType, using TFS2010 WorkItemLinkType(s) foreach (WorkItemLinkType wiLinkType in m_migrationSource.WorkItemStore.WorkItemStore.WorkItemLinkTypes) { Debug.Assert(!string.IsNullOrEmpty(wiLinkType.ReferenceName)); ExtendedLinkProperties extendedLinkProperties = GetExtendedLinkProperties(wiLinkType); #region TFS 2010 specific logic if (!wiLinkType.ReferenceName.Equals(Tfs2010WorkItemRelatedLinkType.Tfs2010RelatedLinkTypeReferenceName, StringComparison.OrdinalIgnoreCase)) { // for backward compatibility, v1 'Related' Work Item Link Type has a special reference name #endregion linkType = new WorkItemLinkTypeBase(wiLinkType.ReferenceName, wiLinkType.ReferenceName, extendedLinkProperties, m_migrationSource.WorkItemStore.WorkItemStore); SupportedLinkTypes.Add(linkType.ReferenceName, linkType); ExtractLinkChangeActionsCallback += ((ILinkHandler)linkType).ExtractLinkChangeActions; } } }
private LinkChangeGroup GetLinkChangeGroupFromLinkChanges(TfsMigrationWorkItem source) { LinkChangeGroup linkChangeGroup = new LinkChangeGroup( source.WorkItem.Id.ToString(CultureInfo.InvariantCulture), LinkChangeGroup.LinkChangeGroupStatus.Created, false); Dictionary <string, LinkType> linkTypesByName = new Dictionary <string, LinkType>(); foreach (WorkItemLinkChange linkChange in source.LinkChanges) { LinkType linkType; if (!linkTypesByName.TryGetValue(linkChange.LinkType, out linkType)) { ExtendedLinkProperties extendedLinkProperties = new ExtendedLinkProperties(); linkType = new WorkItemLinkTypeBase(linkChange.LinkType, linkChange.LinkType, extendedLinkProperties, m_migrationSource.WorkItemStore.WorkItemStore); linkTypesByName.Add(linkChange.LinkType, linkType); } bool actionAdded = false; if (linkChange.IsActive) // Link added { // Get matching link l from WorkItem links collection WorkItemLink l = GetWorkItemLinkFromLinkChange(source, linkChange); if (l != null) { LinkChangeAction addLinkChangeAction = GetAddLinkChangeActionFromWorkItemLink(l, linkType); addLinkChangeAction.ServerLinkChangeId = linkChange.RowVersion.ToString(); linkChangeGroup.AddChangeAction(addLinkChangeAction); actionAdded = true; } else { TraceManager.TraceInformation(String.Format( "Unable to find link on work item {0} corresponding to detected link addition from {1} to {2} of type {3}; it may have been recently deleted", source.WorkItem.Id, linkChange.SourceID, linkChange.TargetID, linkChange.LinkType)); } } else // Link deleted { var deleteLinkChangeAction = new LinkChangeAction( WellKnownChangeActionId.Delete, new ToolkitLinking.ArtifactLink(linkChange.SourceID.ToString(), new ToolkitLinking.Artifact(TfsWorkItemHandler.UriFromId(linkChange.SourceID.ToString()), WorkItemLinkTypeBase.s_sourceArtifactType), new ToolkitLinking.Artifact(TfsWorkItemHandler.UriFromId(linkChange.TargetID.ToString()), WorkItemLinkTypeBase.s_targetArtifactType), string.Empty, linkType), LinkChangeAction.LinkChangeActionStatus.Created, false); deleteLinkChangeAction.ServerLinkChangeId = linkChange.RowVersion.ToString(); linkChangeGroup.AddChangeAction(deleteLinkChangeAction); actionAdded = true; } if (actionAdded) { TraceManager.TraceVerbose("Adapter: Generating link change action: {0} '{1}'->'{2}' (Type: {3})", linkChange.IsActive ? "Add" : "Delete", linkChange.SourceID, linkChange.TargetID, linkChange.LinkType); } } return(linkChangeGroup); }
private void CreateLinkChangeGroupsForForceSyncItem(TfsMigrationWorkItem tfsMigrationWorkItem) { if (m_linkService == null) { Debug.Fail("LinkService is null"); return; } var linkChangeGroups = new List <LinkChangeGroup>(); var detectedLinkChangeGroups = new List <LinkChangeGroup>(); ExtractLinkChangeActionsCallback(tfsMigrationWorkItem, detectedLinkChangeGroups, null); if (detectedLinkChangeGroups.Count == 0) { TraceManager.TraceInformation("Number of non-Work Item links: {0}", 0); } else { Dictionary <string, LinkChangeGroup> perWorkItemConsolidatedLinkChangeGroup = new Dictionary <string, LinkChangeGroup>(); for (int i = 0; i < detectedLinkChangeGroups.Count; ++i) { foreach (LinkChangeAction action in detectedLinkChangeGroups[i].Actions) { if (!perWorkItemConsolidatedLinkChangeGroup.ContainsKey(action.Link.SourceArtifact.Uri)) { var linkChangeGroup = new LinkChangeGroup( action.Link.SourceArtifactId, LinkChangeGroup.LinkChangeGroupStatus.Created, false); perWorkItemConsolidatedLinkChangeGroup.Add(action.Link.SourceArtifact.Uri, linkChangeGroup); } perWorkItemConsolidatedLinkChangeGroup[action.Link.SourceArtifact.Uri].AddChangeAction(action); } } foreach (var workItemLinkGroup in perWorkItemConsolidatedLinkChangeGroup) { string workItemIdStr = TfsWorkItemHandler.IdFromUri(workItemLinkGroup.Key); TraceManager.TraceInformation("Detected {0} non-Work Item links for force sync Work Item '{1}'", workItemLinkGroup.Value.Actions.Count, workItemIdStr); if (workItemLinkGroup.Value.Actions.Count > 0) { workItemLinkGroup.Value.IsForcedSync = true; linkChangeGroups.Add(workItemLinkGroup.Value); } } } if (tfsMigrationWorkItem.WorkItem.WorkItemLinks.Count > 0) { // Handle work item to work item links LinkChangeGroup workItemlinkChangeGroup = new LinkChangeGroup( tfsMigrationWorkItem.WorkItem.Id.ToString(CultureInfo.InvariantCulture), LinkChangeGroup.LinkChangeGroupStatus.Created, false); Dictionary <string, LinkType> linkTypesByName = new Dictionary <string, LinkType>(); foreach (WorkItemLink workItemLink in tfsMigrationWorkItem.WorkItem.WorkItemLinks) { string linkTypeName = workItemLink.LinkTypeEnd.LinkType.ReferenceName; LinkType linkType; if (!linkTypesByName.TryGetValue(linkTypeName, out linkType)) { ExtendedLinkProperties extendedLinkProperties = new ExtendedLinkProperties(); linkType = new WorkItemLinkTypeBase(linkTypeName, linkTypeName, extendedLinkProperties, m_migrationSource.WorkItemStore.WorkItemStore); linkTypesByName.Add(linkTypeName, linkType); } LinkChangeAction addLinkChangeAction = GetAddLinkChangeActionFromWorkItemLink(workItemLink, linkType); workItemlinkChangeGroup.AddChangeAction(addLinkChangeAction); } if (workItemlinkChangeGroup.Actions.Count > 0) { workItemlinkChangeGroup.IsForcedSync = true; linkChangeGroups.Add(workItemlinkChangeGroup); TraceManager.TraceInformation("Detected {0} Work Item links for force sync Work Item '{1}'", workItemlinkChangeGroup.Actions.Count, tfsMigrationWorkItem.WorkItem.Id); } } // Persist link change groups to DB if (linkChangeGroups.Count > 0) { m_linkService.AddChangeGroups(linkChangeGroups); } }