/// <summary> /// This is the one where all the magic happens. /// </summary> /// <returns>The outcome of the policy Execution as per ISubscriber's contract</returns> /// <param name="requestContext">TFS Request Context</param> /// <param name="notification">The <paramref name="notification"/> containing the WorkItemChangedEvent</param> public ProcessingResult ProcessEvent(IRequestContext requestContext, INotification notification) { var result = new ProcessingResult(); Policy[] policies = this.FilterPolicies(this.settings.Policies, requestContext, notification).ToArray(); if (policies.Any()) { IWorkItem workItem = this.store.GetWorkItem(notification.WorkItemId); foreach (var policy in policies) { this.logger.ApplyingPolicy(policy.Name); this.ApplyRules(workItem, policy.Rules); } this.SaveChangedWorkItems(); result.StatusCode = 0; result.StatusMessage = "Success"; } else { result.StatusCode = 1; result.StatusMessage = "No operation"; } return result; }
/// <summary> /// This is the one where all the magic starts. Main() so to speak. I will load the settings, connect to TFS and apply the aggregation rules. /// </summary> public EventNotificationStatus ProcessEvent( IVssRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties) { var logger = new ServerEventLogger(LogLevel.Normal); var context = new RequestContextWrapper(requestContext, notificationType, notificationEventArgs); var runtime = RuntimeContext.GetContext( GetServerSettingsFullPath, context, logger, (collectionUri, toImpersonate, logEvents) => new WorkItemRepository(collectionUri, toImpersonate, logEvents)); if (runtime.HasErrors) { statusCode = 99; statusMessage = string.Join(". ", runtime.Errors); properties = null; return EventNotificationStatus.ActionPermitted; } var result = new ProcessingResult(); try { // Check if we have a workitem changed event before proceeding if (notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent) { using (EventProcessor eventProcessor = new EventProcessor(runtime)) { logger.StartingProcessing(context, context.Notification); result = eventProcessor.ProcessEvent(context, context.Notification); logger.ProcessingCompleted(result); } } } catch (Exception e) { logger.ProcessEventException(e); // notify failure result.StatusCode = -1; result.StatusMessage = "Unexpected error: " + e.Message; result.NotificationStatus = EventNotificationStatus.ActionPermitted; } statusCode = result.StatusCode; statusMessage = result.StatusMessage; properties = result.ExceptionProperties; return result.NotificationStatus; }
/// <summary> /// This is the one where all the magic starts. Main() so to speak. I will load the settings, connect to TFS and apply the aggregation rules. /// </summary> public EventNotificationStatus ProcessEvent( TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties) { var runtime = RuntimeContext.GetContext( GetServerSettingsFullPath, new RequestContextWrapper(requestContext), new ServerEventLogger(LogLevel.Normal)); if (runtime.HasErrors) { statusCode = 99; statusMessage = string.Join(". ", runtime.Errors); properties = null; return EventNotificationStatus.ActionPermitted; } // HACK: remove cast for ProcessEventException var logger = (ServerEventLogger)runtime.Logger; var result = new ProcessingResult(); try { // Check if we have a workitem changed event before proceeding if (notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent) { var uri = this.GetCollectionUriFromContext(requestContext); IdentityDescriptor toImpersonate = null; if (runtime.Settings.AutoImpersonate) { toImpersonate = this.GetIdentityToImpersonate(requestContext, notificationEventArgs as WorkItemChangedEvent); } using (EventProcessor eventProcessor = new EventProcessor(uri.AbsoluteUri, toImpersonate, runtime)) { var context = runtime.RequestContext; var notification = new NotificationWrapper( notificationType, notificationEventArgs as WorkItemChangedEvent); logger.StartingProcessing(context, notification); result = eventProcessor.ProcessEvent(context, notification); logger.ProcessingCompleted(result); } } } catch (Exception e) { logger.ProcessEventException(e); // notify failure result.StatusCode = -1; result.StatusMessage = "Unexpected error: " + e.Message; result.NotificationStatus = EventNotificationStatus.ActionPermitted; } statusCode = result.StatusCode; statusMessage = result.StatusMessage; properties = result.ExceptionProperties; return result.NotificationStatus; }