You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			134 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | using System; | ||
|  | using System.Diagnostics; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Collections; | ||
|  | using System.Reflection; | ||
|  | using System.Runtime.Serialization; | ||
|  | using System.Workflow.ComponentModel; | ||
|  | using System.Workflow.Runtime; | ||
|  | using System.Workflow.Runtime.Hosting; | ||
|  | 
 | ||
|  | namespace System.Workflow.Activities | ||
|  | { | ||
|  |     [Serializable] | ||
|  |     internal sealed class CorrelationTokenInvalidatedHandler : IActivityEventListener<CorrelationTokenEventArgs> | ||
|  |     { | ||
|  |         IActivityEventListener<QueueEventArgs> eventHandler; | ||
|  |         EventQueueName queueName; | ||
|  |         Guid subscriptionId; | ||
|  |         Guid instanceId; | ||
|  | 
 | ||
|  |         bool queueCreator; | ||
|  |         Type interfaceType; | ||
|  |         string followerOperation; | ||
|  | 
 | ||
|  |         internal CorrelationTokenInvalidatedHandler(Type interfaceType, string operation, IActivityEventListener<QueueEventArgs> eventHandler, Guid instanceId) | ||
|  |         { | ||
|  |             this.eventHandler = eventHandler; | ||
|  |             this.interfaceType = interfaceType; | ||
|  |             this.followerOperation = operation; | ||
|  |             this.instanceId = instanceId; | ||
|  |         } | ||
|  | 
 | ||
|  |         #region IActivityEventListener<CorrelationTokenEventArgs> Members | ||
|  |         void IActivityEventListener<CorrelationTokenEventArgs>.OnEvent(object sender, CorrelationTokenEventArgs dataChangeEventArgs) | ||
|  |         { | ||
|  |             if (sender == null) | ||
|  |                 throw new ArgumentException("sender"); | ||
|  |             if (dataChangeEventArgs == null) | ||
|  |                 throw new ArgumentException("dataChangeEventArgs"); | ||
|  | 
 | ||
|  |             ActivityExecutionContext context = sender as ActivityExecutionContext; | ||
|  |             Activity activity = context.Activity; | ||
|  | 
 | ||
|  |             ICollection<CorrelationProperty> correlationValues = dataChangeEventArgs.CorrelationToken.Properties; | ||
|  |             if (dataChangeEventArgs.IsInitializing) | ||
|  |             { | ||
|  |                 CreateSubscription(this.instanceId, context, correlationValues); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (queueName != null) | ||
|  |             { | ||
|  |                 if (!CorrelationResolver.IsInitializingMember(queueName.InterfaceType, queueName.MethodName, | ||
|  |                     correlationValues == null ? null : new object[] { correlationValues })) | ||
|  |                 { | ||
|  |                     DeleteSubscription(context); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             dataChangeEventArgs.CorrelationToken.UnsubscribeFromCorrelationTokenInitializedEvent(activity, this); | ||
|  |         } | ||
|  |         #endregion | ||
|  | 
 | ||
|  |         private void CreateSubscription(Guid instanceId, ActivityExecutionContext context, ICollection<CorrelationProperty> correlationValues) | ||
|  |         { | ||
|  |             WorkflowQueuingService queueSvcs = context.GetService<WorkflowQueuingService>(); | ||
|  |             EventQueueName queueId = new EventQueueName(this.interfaceType, this.followerOperation, correlationValues); | ||
|  | 
 | ||
|  |             WorkflowQueue workflowQueue = null; | ||
|  |             if (!queueSvcs.Exists(queueId)) | ||
|  |             { | ||
|  |                 WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "CorrelationTokenInvalidatedHandler: creating q {0} ", queueId.GetHashCode()); | ||
|  |                 workflowQueue = queueSvcs.CreateWorkflowQueue(queueId, true); | ||
|  |                 queueCreator = true; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 workflowQueue = queueSvcs.GetWorkflowQueue(queueId); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (this.eventHandler != null) | ||
|  |             { | ||
|  |                 workflowQueue.RegisterForQueueItemAvailable(this.eventHandler); | ||
|  |             } | ||
|  | 
 | ||
|  |             WorkflowSubscriptionService subscriptionService = (WorkflowSubscriptionService)context.GetService(typeof(WorkflowSubscriptionService)); | ||
|  | 
 | ||
|  |             MessageEventSubscription subscription = new MessageEventSubscription(queueId, instanceId); | ||
|  |             this.queueName = queueId; | ||
|  |             this.subscriptionId = subscription.SubscriptionId; | ||
|  |             subscription.InterfaceType = this.interfaceType; | ||
|  |             subscription.MethodName = this.followerOperation; | ||
|  | 
 | ||
|  |             this.interfaceType = null; | ||
|  |             this.followerOperation = null; | ||
|  | 
 | ||
|  |             if (correlationValues != null) | ||
|  |             { | ||
|  |                 foreach (CorrelationProperty property in correlationValues) | ||
|  |                 { | ||
|  |                     subscription.CorrelationProperties.Add(property); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             if (this.eventHandler != null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             if (subscriptionService == null) | ||
|  |                 return; | ||
|  |             subscriptionService.CreateSubscription(subscription); | ||
|  |         } | ||
|  | 
 | ||
|  |         private void DeleteSubscription(ActivityExecutionContext context) | ||
|  |         { | ||
|  |             if (this.queueName == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             WorkflowQueuingService queueSvcs = context.GetService<WorkflowQueuingService>(); | ||
|  |             if (queueCreator) | ||
|  |                 queueSvcs.DeleteWorkflowQueue(this.queueName); | ||
|  | 
 | ||
|  |             if (this.eventHandler != null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             WorkflowSubscriptionService subscriptionService = context.GetService<WorkflowSubscriptionService>(); | ||
|  |             if (subscriptionService != null) | ||
|  |                 subscriptionService.DeleteSubscription(this.subscriptionId); | ||
|  | 
 | ||
|  |             WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "CorrelationTokenInvalidatedHandler subscription deleted SubId {0} QueueId {1}", this.subscriptionId, this.queueName); | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  | } |