e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
301 lines
8.6 KiB
C#
301 lines
8.6 KiB
C#
#region Using directives
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.Reflection;
|
|
using System.Diagnostics;
|
|
using System.Runtime.Remoting.Messaging;
|
|
using System.Workflow.ComponentModel;
|
|
using System.Workflow.ComponentModel.Design;
|
|
using System.Workflow.Runtime;
|
|
using System.Workflow.Runtime.Hosting;
|
|
|
|
#endregion Using directives
|
|
|
|
namespace System.Workflow.Activities
|
|
{
|
|
[Serializable]
|
|
internal class StateMachineAction
|
|
{
|
|
private string _stateName;
|
|
[NonSerialized]
|
|
private StateActivity _state;
|
|
[NonSerialized]
|
|
private StateActivity _currentState;
|
|
private StateMachineExecutionState _executionState;
|
|
private StateMachineSubscriptionManager _subscriptionManager;
|
|
|
|
internal string StateName
|
|
{
|
|
get
|
|
{
|
|
return _stateName;
|
|
}
|
|
}
|
|
|
|
protected StateActivity State
|
|
{
|
|
get
|
|
{
|
|
return _state;
|
|
}
|
|
}
|
|
|
|
protected StateActivity CurrentState
|
|
{
|
|
get
|
|
{
|
|
return _currentState;
|
|
}
|
|
}
|
|
|
|
protected StateMachineExecutionState ExecutionState
|
|
{
|
|
get
|
|
{
|
|
return _executionState;
|
|
}
|
|
}
|
|
|
|
protected StateMachineSubscriptionManager SubscriptionManager
|
|
{
|
|
get
|
|
{
|
|
return _subscriptionManager;
|
|
}
|
|
}
|
|
|
|
internal StateMachineAction(string stateName)
|
|
{
|
|
_stateName = stateName;
|
|
}
|
|
|
|
internal virtual void Execute(ActivityExecutionContext context)
|
|
{
|
|
if (context == null)
|
|
throw new ArgumentNullException("context");
|
|
Debug.Assert(context.Activity.QualifiedName.Equals(this.StateName));
|
|
_state = (StateActivity)context.Activity;
|
|
_currentState = StateMachineHelpers.GetCurrentState(context);
|
|
StateActivity rootState = StateMachineHelpers.GetRootState(_state);
|
|
_executionState = StateMachineExecutionState.Get(rootState);
|
|
_subscriptionManager = _executionState.SubscriptionManager;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class CloseStateAction : StateMachineAction
|
|
{
|
|
|
|
internal CloseStateAction(string stateName)
|
|
: base(stateName)
|
|
{
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
StateActivity.LeavingState(context);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class ExecuteChildStateAction : StateMachineAction
|
|
{
|
|
private string _childStateName;
|
|
|
|
internal ExecuteChildStateAction(string stateName, string childStateName)
|
|
: base(stateName)
|
|
{
|
|
_childStateName = childStateName;
|
|
}
|
|
|
|
internal string ChildStateName
|
|
{
|
|
get
|
|
{
|
|
return _childStateName;
|
|
}
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
StateActivity childState = (StateActivity)this.State.Activities[this.ChildStateName];
|
|
Debug.Assert(childState.Enabled);
|
|
StateActivity.ExecuteState(context, childState);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class SubscribeAction : StateMachineAction
|
|
{
|
|
private string _eventDrivenName;
|
|
|
|
internal SubscribeAction(string stateName, string eventDrivenName)
|
|
: base(stateName)
|
|
{
|
|
_eventDrivenName = eventDrivenName;
|
|
}
|
|
|
|
internal string EventDrivenName
|
|
{
|
|
get
|
|
{
|
|
return _eventDrivenName;
|
|
}
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
EventDrivenActivity eventDriven = (EventDrivenActivity)this.State.Activities[this.EventDrivenName];
|
|
Debug.Assert(eventDriven.Enabled);
|
|
this.SubscriptionManager.SubscribeEventDriven(context, eventDriven);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class UnsubscribeAction : StateMachineAction
|
|
{
|
|
private string _eventDrivenName;
|
|
|
|
internal UnsubscribeAction(string stateName, string eventDrivenName)
|
|
: base(stateName)
|
|
{
|
|
_eventDrivenName = eventDrivenName;
|
|
}
|
|
|
|
internal string EventDrivenName
|
|
{
|
|
get
|
|
{
|
|
return _eventDrivenName;
|
|
}
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
EventDrivenActivity eventDriven = (EventDrivenActivity)this.State.Activities[this.EventDrivenName];
|
|
Debug.Assert(eventDriven.Enabled);
|
|
this.SubscriptionManager.UnsubscribeEventDriven(context, eventDriven);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class ExternalEventAction : StateMachineAction
|
|
{
|
|
private string _eventDrivenName;
|
|
|
|
internal ExternalEventAction(string stateName, string eventDrivenName)
|
|
: base(stateName)
|
|
{
|
|
_eventDrivenName = eventDrivenName;
|
|
}
|
|
|
|
internal string EventDrivenName
|
|
{
|
|
get
|
|
{
|
|
return _eventDrivenName;
|
|
}
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
EventDrivenActivity eventDriven = (EventDrivenActivity)this.State.Activities[this.EventDrivenName];
|
|
Debug.Assert(eventDriven.Enabled);
|
|
StateActivity.ExecuteEventDriven(context, eventDriven);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class SetStateAction : StateMachineAction
|
|
{
|
|
private string _targetStateName;
|
|
internal SetStateAction(string stateName, string targetStateName)
|
|
: base(stateName)
|
|
{
|
|
_targetStateName = targetStateName;
|
|
}
|
|
|
|
internal string TargetStateName
|
|
{
|
|
get
|
|
{
|
|
return _targetStateName;
|
|
}
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
this.ExecutionState.CalculateStateTransition(this.CurrentState, this.TargetStateName);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
internal class DisableQueuesAction : StateMachineAction
|
|
{
|
|
internal DisableQueuesAction(string stateName)
|
|
: base(stateName)
|
|
{
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
|
|
StateActivity state = this.State;
|
|
StateActivity rootState = StateMachineHelpers.GetRootState(state);
|
|
Queue<StateActivity> states = new Queue<StateActivity>();
|
|
states.Enqueue(rootState);
|
|
while (states.Count > 0)
|
|
{
|
|
state = states.Dequeue();
|
|
foreach (Activity activity in state.EnabledActivities)
|
|
{
|
|
EventDrivenActivity eventDriven = activity as EventDrivenActivity;
|
|
if (eventDriven != null)
|
|
{
|
|
IEventActivity eventActivity = StateMachineHelpers.GetEventActivity(eventDriven);
|
|
IComparable queueName = eventActivity.QueueName;
|
|
if (queueName != null)
|
|
{
|
|
WorkflowQueue queue = StateMachineSubscriptionManager.GetWorkflowQueue(context, queueName);
|
|
if (queue != null)
|
|
queue.Enabled = this.SubscriptionManager.Subscriptions.ContainsKey(queueName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
StateActivity childState = activity as StateActivity;
|
|
if (childState != null)
|
|
states.Enqueue(childState);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
[Serializable]
|
|
internal class EnteringStateAction : StateMachineAction
|
|
{
|
|
internal EnteringStateAction(string stateName)
|
|
: base(stateName)
|
|
{
|
|
}
|
|
|
|
internal override void Execute(ActivityExecutionContext context)
|
|
{
|
|
base.Execute(context);
|
|
context.TrackData(StateActivity.StateChangeTrackingDataKey, this.CurrentState.QualifiedName);
|
|
}
|
|
}
|
|
}
|