Robert MacLean
3 June 2010
Note: This post is part of a series and you can find the rest of the parts in the series index.
The WIT adapter needs a custom conflict type and a custom conflict handler, really for no reason other than the platform expects it.
Conflict Handler
If you have no reason for a custom conflict handler, a simple implementation which allows for manual resolution can be created, which is what I have below.
public class SharePointWITGeneralConflictHandler : IConflictHandler { public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule) { return ConflictTypeHandled.ScopeInterpreter.IsInScope(conflict.ScopeHint, rule.ApplicabilityScope); } public ConflictResolutionResult Resolve(MigrationConflict conflict, ConflictResolutionRule rule, out List<MigrationAction> actions) { actions = null; if (rule.ActionRefNameGuid.Equals(new ManualConflictResolutionAction().ReferenceName)) { return ManualResolve(out actions); } return new ConflictResolutionResult(false, ConflictResolutionType.Other); } public ConflictType ConflictTypeHandled { get; set; } private static ConflictResolutionResult ManualResolve(out List<MigrationAction> actions) { actions = null; return new ConflictResolutionResult(true, ConflictResolutionType.Other); } }
Conflict Type
If you have no reason for a custom conflict type, you can do what I did which is to re-implement the generic one with even less features namely only supporting ManualConflictResolution and a very simple scope hint.
public class SharePointWITGeneralConflictType : ConflictType { public static MigrationConflict CreateConflict(Exception exception) { return new MigrationConflict( new SharePointWITGeneralConflictType(), MigrationConflict.Status.Unresolved, exception.ToString(), CreateScopeHint(Guid.NewGuid().ToString())); } public static MigrationConflict CreateConflict(Exception exception, IMigrationAction conflictedAction) { return new SharePointWITGeneralConflictType().CreateConflict(exception.ToString(), CreateScopeHint(Guid.NewGuid().ToString()), conflictedAction); } public override Guid ReferenceName { get { return s_conflictTypeReferenceName; } } public override string FriendlyName { get { return s_conflictTypeFriendlyName; } } public override string Description { get { return s_conflictTypeDescription; } } public SharePointWITGeneralConflictType() : base(new SharePointWITGeneralConflictHandler()) { } public static string CreateScopeHint(string sourceItemId) { return string.Format(CultureInfo.CurrentCulture, "/{0}/{1}", sourceItemId, Guid.NewGuid().ToString()); } protected override void RegisterDefaultSupportedResolutionActions() { AddSupportedResolutionAction(new ManualConflictResolutionAction()); } private static readonly Guid s_conflictTypeReferenceName = new Guid("{606531DF-231A-496B-9996-50F239481988}"); private const string s_conflictTypeFriendlyName = "TFS WIT general conflict type"; private const string s_conflictTypeDescription = "This conflict is detected when an unknown exception is thrown during Work Item data submission."; }