File: LocalService\FollowerQueueCreator.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
#region Using directives
 
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;
using System.Runtime.Remoting.Messaging;
 
#endregion
 
namespace System.Workflow.Activities
{
    [Serializable]
    internal sealed class FollowerQueueCreator : IActivityEventListener<QueueEventArgs>
    {
        string followerOperation;
        object sync = new object();
 
        internal FollowerQueueCreator(string operation)
        {
            this.followerOperation = operation;
        }
 
        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            FollowerQueueCreator equalsObject = obj as FollowerQueueCreator;
            if (this.followerOperation == equalsObject.followerOperation)
                return true;
            return false;
        }
        public override int GetHashCode()
        {
            return this.followerOperation.GetHashCode();
        }
 
        #region IActivityEventListener<QueueEventArgs> Members
 
        void IActivityEventListener<QueueEventArgs>.OnEvent(object sender, QueueEventArgs args)
        {
            lock (sync)
            {
                WorkflowQueue queue = (WorkflowQueue)sender;
 
                // create the queue after extracting the correlation values from the message
                EventQueueName staticId = (EventQueueName)queue.QueueName;
                WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "FollowerQueueCreator: initialized on operation {0} for follower {1}", staticId.InterfaceType.Name + staticId.MethodName, this.followerOperation);
 
                IMethodMessage message = queue.Peek() as IMethodMessage;
 
                ICollection<CorrelationProperty> corrValues = CorrelationResolver.ResolveCorrelationValues(staticId.InterfaceType, staticId.MethodName, message.Args, false);
 
                EventQueueName queueName = new EventQueueName(staticId.InterfaceType, this.followerOperation, corrValues);
                if (!queue.QueuingService.Exists(queueName))
                {
                    WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "FollowerQueueCreator::CreateQueue creating q {0}", queueName.GetHashCode());
                    queue.QueuingService.CreateWorkflowQueue(queueName, true);
                }
            }
        }
 
        #endregion
    }
}