private void NotifyChangesToChildExecutors(IWorkflowCoreRuntime workflowCoreRuntime, Activity contextActivity, IList <WorkflowChangeAction> changeActions) { foreach (WorkflowChangeAction action in changeActions) { if (!(action is ActivityChangeAction)) { continue; } CompositeActivity ownerActivity = contextActivity.TraverseDottedPathFromRoot(((ActivityChangeAction)action).OwnerActivityDottedPath) as CompositeActivity; if (ownerActivity == null || !WorkflowChanges.IsActivityExecutable(ownerActivity)) { continue; } ISupportWorkflowChanges compositeActivityExecutor = ActivityExecutors.GetActivityExecutor(ownerActivity) as ISupportWorkflowChanges; if (compositeActivityExecutor == null) { throw new ApplicationException(SR.GetString(SR.Error_WorkflowChangesNotSupported, ownerActivity.GetType().FullName)); } using (workflowCoreRuntime.SetCurrentActivity(ownerActivity)) { using (ActivityExecutionContext executionContext = new ActivityExecutionContext(ownerActivity)) { if (action is AddedActivityAction) { Activity addedActivity = ownerActivity.Activities[((AddedActivityAction)action).Index]; if (WorkflowChanges.IsActivityExecutable(addedActivity)) { addedActivity.OnActivityExecutionContextLoad(executionContext.Activity.RootActivity.WorkflowCoreRuntime); executionContext.InitializeActivity(addedActivity); compositeActivityExecutor.OnActivityAdded(executionContext, addedActivity); } } else if (action is RemovedActivityAction) { RemovedActivityAction removedActivityAction = (RemovedActivityAction)action; if (WorkflowChanges.IsActivityExecutable(removedActivityAction.OriginalRemovedActivity)) { compositeActivityExecutor.OnActivityRemoved(executionContext, removedActivityAction.OriginalRemovedActivity); if (removedActivityAction.OriginalRemovedActivity.ExecutionResult != ActivityExecutionResult.Uninitialized) { removedActivityAction.OriginalRemovedActivity.Uninitialize(executionContext.Activity.RootActivity.WorkflowCoreRuntime); removedActivityAction.OriginalRemovedActivity.SetValue(Activity.ExecutionResultProperty, ActivityExecutionResult.Uninitialized); } removedActivityAction.OriginalRemovedActivity.OnActivityExecutionContextUnload(executionContext.Activity.RootActivity.WorkflowCoreRuntime); removedActivityAction.OriginalRemovedActivity.Dispose(); } } } } } }
private void NotifyChangesToChildExecutors(IWorkflowCoreRuntime workflowCoreRuntime, Activity contextActivity, IList <WorkflowChangeAction> changeActions) { foreach (WorkflowChangeAction action in changeActions) { if (action is ActivityChangeAction) { CompositeActivity activity = contextActivity.TraverseDottedPathFromRoot(((ActivityChangeAction)action).OwnerActivityDottedPath) as CompositeActivity; if ((activity != null) && IsActivityExecutable(activity)) { ISupportWorkflowChanges activityExecutor = ActivityExecutors.GetActivityExecutor(activity) as ISupportWorkflowChanges; if (activityExecutor == null) { throw new ApplicationException(SR.GetString("Error_WorkflowChangesNotSupported", new object[] { activity.GetType().FullName })); } using (workflowCoreRuntime.SetCurrentActivity(activity)) { using (ActivityExecutionContext context = new ActivityExecutionContext(activity)) { if (action is AddedActivityAction) { Activity activity2 = activity.Activities[((AddedActivityAction)action).Index]; if (IsActivityExecutable(activity2)) { activity2.OnActivityExecutionContextLoad(context.Activity.RootActivity.WorkflowCoreRuntime); context.InitializeActivity(activity2); activityExecutor.OnActivityAdded(context, activity2); } } else if (action is RemovedActivityAction) { RemovedActivityAction action2 = (RemovedActivityAction)action; if (IsActivityExecutable(action2.OriginalRemovedActivity)) { activityExecutor.OnActivityRemoved(context, action2.OriginalRemovedActivity); if (action2.OriginalRemovedActivity.ExecutionResult != ActivityExecutionResult.Uninitialized) { action2.OriginalRemovedActivity.Uninitialize(context.Activity.RootActivity.WorkflowCoreRuntime); action2.OriginalRemovedActivity.SetValue(Activity.ExecutionResultProperty, ActivityExecutionResult.Uninitialized); } action2.OriginalRemovedActivity.OnActivityExecutionContextUnload(context.Activity.RootActivity.WorkflowCoreRuntime); action2.OriginalRemovedActivity.Dispose(); } } } } } } } }
public ActivityExecutionContext CreateExecutionContext(Activity activity) { if (this.ownerContext == null) { throw new ObjectDisposedException("ActivityExecutionContextManager"); } if (activity == null) { throw new ArgumentNullException("activity"); } if (!this.ownerContext.IsValidChild(activity, true)) { throw new ArgumentException(SR.GetString(SR.AEC_InvalidActivity), "activity"); } Activity copiedActivity = activity.Clone(); ((IDependencyObjectAccessor)copiedActivity).InitializeInstanceForRuntime(this.ownerContext.Activity.WorkflowCoreRuntime); //Reset the cloned tree for execution. Queue <Activity> activityQueue = new Queue <Activity>(); activityQueue.Enqueue(copiedActivity); while (activityQueue.Count != 0) { Activity clonedActivity = activityQueue.Dequeue(); if (clonedActivity.ExecutionStatus != ActivityExecutionStatus.Initialized) { clonedActivity.ResetAllKnownDependencyProperties(); CompositeActivity compositeActivity = clonedActivity as CompositeActivity; if (compositeActivity != null) { for (int i = 0; i < compositeActivity.EnabledActivities.Count; ++i) { activityQueue.Enqueue(compositeActivity.EnabledActivities[i]); } ISupportAlternateFlow alternateFlow = compositeActivity as ISupportAlternateFlow; if (alternateFlow != null) { for (int i = 0; i < alternateFlow.AlternateFlowActivities.Count; ++i) { activityQueue.Enqueue(alternateFlow.AlternateFlowActivities[i]); } } } } } // get active context activities and add it to this one IList <Activity> activeContexts = (IList <Activity>) this.ownerContext.Activity.ContextActivity.GetValue(Activity.ActiveExecutionContextsProperty); if (activeContexts == null) { activeContexts = new List <Activity>(); this.ownerContext.Activity.ContextActivity.SetValue(Activity.ActiveExecutionContextsProperty, activeContexts); } activeContexts.Add(copiedActivity); // prepare the copied activity as a context activity ActivityExecutionContextInfo contextInfo = new ActivityExecutionContextInfo(activity.QualifiedName, this.ownerContext.WorkflowCoreRuntime.GetNewContextActivityId(), Guid.NewGuid(), this.ownerContext.ContextId); copiedActivity.SetValue(Activity.ActivityExecutionContextInfoProperty, contextInfo); copiedActivity.SetValue(Activity.ActivityContextGuidProperty, contextInfo.ContextGuid); ActivityExecutionContext newExecutionContext = null; try { // inform workflow runtime this.ownerContext.Activity.WorkflowCoreRuntime.RegisterContextActivity(copiedActivity); // return the new context newExecutionContext = new ActivityExecutionContext(copiedActivity); this.executionContexts.Add(newExecutionContext); newExecutionContext.InitializeActivity(newExecutionContext.Activity); return(newExecutionContext); } catch (Exception) { if (newExecutionContext != null) { this.CompleteExecutionContext(newExecutionContext); } else { activeContexts.Remove(copiedActivity); } throw; } }
public ActivityExecutionContext CreateExecutionContext(Activity activity) { ActivityExecutionContext context2; if (this.ownerContext == null) { throw new ObjectDisposedException("ActivityExecutionContextManager"); } if (activity == null) { throw new ArgumentNullException("activity"); } if (!this.ownerContext.IsValidChild(activity, true)) { throw new ArgumentException(SR.GetString("AEC_InvalidActivity"), "activity"); } Activity item = activity.Clone(); ((IDependencyObjectAccessor)item).InitializeInstanceForRuntime(this.ownerContext.Activity.WorkflowCoreRuntime); Queue <Activity> queue = new Queue <Activity>(); queue.Enqueue(item); while (queue.Count != 0) { Activity activity3 = queue.Dequeue(); if (activity3.ExecutionStatus != ActivityExecutionStatus.Initialized) { activity3.ResetAllKnownDependencyProperties(); CompositeActivity activity4 = activity3 as CompositeActivity; if (activity4 != null) { for (int i = 0; i < activity4.EnabledActivities.Count; i++) { queue.Enqueue(activity4.EnabledActivities[i]); } ISupportAlternateFlow flow = activity4; if (flow != null) { for (int j = 0; j < flow.AlternateFlowActivities.Count; j++) { queue.Enqueue(flow.AlternateFlowActivities[j]); } } } } } IList <Activity> list = (IList <Activity>) this.ownerContext.Activity.ContextActivity.GetValue(Activity.ActiveExecutionContextsProperty); if (list == null) { list = new List <Activity>(); this.ownerContext.Activity.ContextActivity.SetValue(Activity.ActiveExecutionContextsProperty, list); } list.Add(item); ActivityExecutionContextInfo info = new ActivityExecutionContextInfo(activity.QualifiedName, this.ownerContext.WorkflowCoreRuntime.GetNewContextActivityId(), Guid.NewGuid(), this.ownerContext.ContextId); item.SetValue(Activity.ActivityExecutionContextInfoProperty, info); item.SetValue(Activity.ActivityContextGuidProperty, info.ContextGuid); ActivityExecutionContext context = null; try { this.ownerContext.Activity.WorkflowCoreRuntime.RegisterContextActivity(item); context = new ActivityExecutionContext(item); this.executionContexts.Add(context); context.InitializeActivity(context.Activity); context2 = context; } catch (Exception) { if (context != null) { this.CompleteExecutionContext(context); } else { list.Remove(item); } throw; } return(context2); }