using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using Microsoft.TeamFoundation.Client; using Pinwheel; using Pinwheel.SCM; using Pinwheel.SCM.AwardContexts; namespace TFS_Notification_Service { public class TfsAwardContextFactory { protected internal static TfsAwardContextFactory Current { get; set; } static TfsAwardContextFactory() { Current = new TfsAwardContextFactory(); } public static AwardContext CreateFromXml(string eventXml, string tfsIdentityXml) { return Current.GetContextFromXml(eventXml, tfsIdentityXml); } protected internal virtual AwardContext GetContextFromXml(string eventXml, string tfsIdentityXml) { ScmAwardContext context = null; var sourceDetails = XDocument.Parse(eventXml); switch (sourceDetails.Root.Name.ToString()) { case "CheckinEvent": context = new CheckinAwardContext(); break; case "BuildCompleteEvent": context = new BuildAwardContext { BuildSuccessful = true }; break; } if (context != null) { context.AwardService = IocContainer.Resolve(); context.ChangesetID = GetChangesetId(sourceDetails); context.Server = GetTfsServer(tfsIdentityXml); context.Timestamp = DateTime.Now; context.User = GetUser(sourceDetails); context.WorkItemIDs = GetWorkItemIds(sourceDetails); } return context; } protected internal virtual int? GetChangesetId(XContainer sourceDetails) { return 1000; } protected internal virtual IEnumerable GetWorkItemIds(XDocument sourceDetails) { return new[] { 1, 2, 3 }; } protected internal virtual User GetUser(XContainer sourceDetails) { var username = (from e in sourceDetails.Elements("CheckinEvent") select e.Element("Committer").Value).FirstOrDefault(); return new ScmUser { Username = username }; } protected internal virtual IScmServer GetTfsServer(string tfsIdentityXml) { var serverUrl = XDocument.Parse(tfsIdentityXml) .Element("TeamFoundationServer") .Attribute("url").Value; return new TfsServer(TeamFoundationServerFactory.GetServer(serverUrl)); } } }