using System; using System.IO; using System.Xml.Linq; using Pinwheel; namespace TFS_Notification_Service { public class TfsEventSubscriber : ITfsEventSubscriber { protected internal readonly AwardsEngine engine; public TfsEventSubscriber() { try { engine = IocContainer.Resolve(); } catch(Exception ex) { var error = string.Format( "Error initializing TfsEventSubscriber:\n{0}\nStack Trace:\n{1}", ex.Message, ex.StackTrace); // ReSharper disable DoNotCallOverridableMethodsInConstructor // This virtual method call is to allow testing // to make sure the logging is called. LogMessage(error); // ReSharper restore DoNotCallOverridableMethodsInConstructor } } public TfsEventSubscriber(AwardsEngine engine) { this.engine = engine; } public void Notify(string eventXml, string tfsIdentityXml) { try { SaveEventData(eventXml, tfsIdentityXml); var context = TfsAwardContextFactory.CreateFromXml(eventXml, tfsIdentityXml); if (context != null) engine.Execute(context); } catch(Exception ex) { var error = string.Format( "Error handling notification:\n{0}\nEvent Source:{1}\n\nStack Trace:\n{2}", ex.Message, eventXml, ex.StackTrace); LogMessage(error); } } protected internal virtual void LogMessage(string message) { System.Diagnostics.Trace.WriteLine(message); } private const string FILEPATH = @"C:\Temp\TFS_Events"; protected internal virtual void SaveEventData(string eventXml, string tfsIdentityXml) { var rootNode = new XElement("NotifyData"); rootNode.Add(new XElement("EventXml", eventXml)); rootNode.Add(new XElement("TfsIdentityXml", tfsIdentityXml)); if(!Directory.Exists(FILEPATH)) Directory.CreateDirectory(FILEPATH); var filename = string.Format(@"{0}\{1:MMddyyhhmm}.xml", FILEPATH, DateTime.Now); rootNode.Save(filename); } } }