Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Behaviors / Compensate.cs / 1305376 / Compensate.cs
namespace System.Workflow.ComponentModel { using System; using System.Drawing; using System.ComponentModel; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel.Design; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.ComponentModel.Compiler; [SRDescription(SR.CompensateActivityDescription)] [ToolboxItem(typeof(ActivityToolboxItem))] [Designer(typeof(CompensateDesigner), typeof(IDesigner))] [ToolboxBitmap(typeof(CompensateActivity), "Resources.Compensate.png")] [ActivityValidator(typeof(CompensateValidator))] [SRCategory(SR.Standard)] public sealed class CompensateActivity : Activity, IPropertyValueProvider, IActivityEventListener{ public CompensateActivity() { } public CompensateActivity(string name) : base(name) { } public static readonly DependencyProperty TargetActivityNameProperty = DependencyProperty.Register("TargetActivityName", typeof(string), typeof(CompensateActivity), new PropertyMetadata("",DependencyPropertyOptions.Metadata)); [SRCategory(SR.Activity)] [SRDescription(SR.CompensatableActivityDescr)] [TypeConverter(typeof(PropertyValueProviderTypeConverter))] [MergableProperty(false)] [DefaultValue("")] public string TargetActivityName { get { return base.GetValue(TargetActivityNameProperty) as string; } set { base.SetValue(TargetActivityNameProperty, value); } } #region Protected Methods protected internal override void Initialize(IServiceProvider provider) { if (this.Parent == null) throw new InvalidOperationException(SR.GetString(SR.Error_MustHaveParent)); base.Initialize(provider); } protected internal override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); return CompensateTargetActivity(executionContext); } #endregion #region IActivityEventListener Members void IActivityEventListener .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { if (sender == null) throw new ArgumentNullException("sender"); if (e == null) throw new ArgumentNullException("e"); ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); if (e.ExecutionStatus == ActivityExecutionStatus.Closed) { // Remove status change subscription. e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this); // Do it again if there are any more. ActivityExecutionStatus status = CompensateTargetActivity(context); if (status == ActivityExecutionStatus.Closed) context.CloseActivity(); } } #endregion #region Execution Helpers private ActivityExecutionStatus CompensateTargetActivity(ActivityExecutionContext context) { Activity targetActivity = null; Activity commonParentActivity = context.Activity; do { commonParentActivity = commonParentActivity.Parent; targetActivity = commonParentActivity.GetActivityByName(this.TargetActivityName, true); } while (targetActivity == null); if (targetActivity is ICompensatableActivity && targetActivity.ExecutionStatus == ActivityExecutionStatus.Closed && targetActivity.ExecutionResult == ActivityExecutionResult.Succeeded) { // same execution context targetActivity.RegisterForStatusChange(Activity.ClosedEvent, this); context.CompensateActivity(targetActivity); return context.Activity.ExecutionStatus; } else if (targetActivity.ExecutionStatus == ActivityExecutionStatus.Initialized) { // Template activity // walk through active contexts ActivityExecutionContextManager contextManager = context.ExecutionContextManager; foreach (ActivityExecutionContext activeContext in contextManager.ExecutionContexts) { if (targetActivity.GetActivityByName(activeContext.Activity.QualifiedName, true) != null) { if (activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Compensating || activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Faulting || activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Canceling ) return context.Activity.ExecutionStatus; } } // walk through all completed execution contexts for (int index = contextManager.CompletedExecutionContexts.Count - 1; index >= 0; index--) { //only compensate direct child during explicit compensation ActivityExecutionContextInfo completedActivityInfo = contextManager.CompletedExecutionContexts[index]; if (((completedActivityInfo.Flags & PersistFlags.NeedsCompensation) != 0)) { ActivityExecutionContext revokedExecutionContext = contextManager.DiscardPersistedExecutionContext(completedActivityInfo); if (revokedExecutionContext.Activity is ICompensatableActivity) { revokedExecutionContext.Activity.RegisterForStatusChange(Activity.ClosedEvent, this); revokedExecutionContext.CompensateActivity(revokedExecutionContext.Activity); } return context.Activity.ExecutionStatus; } } } else { // currently faulting, canceling, or compensating if (CompensationUtils.TryCompensateLastCompletedChildActivity(context, targetActivity, this)) return context.Activity.ExecutionStatus; } return ActivityExecutionStatus.Closed; } #endregion #region IPropertyValueProvider Members ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { if (context == null) throw new ArgumentNullException("context"); return GetCompensatableTargets(this); } #endregion #region Validation Helpers internal static StringCollection GetCompensatableTargets(CompensateActivity compensate) { StringCollection targetList = new StringCollection(); CompositeActivity parent = compensate.Parent; while (parent != null) { if ((parent is CompensationHandlerActivity) || (parent is FaultHandlersActivity) || (parent is CancellationHandlerActivity)) { parent = parent.Parent; if (parent != null) { if (Helpers.IsCustomActivity(parent)) targetList.Add(parent.UserData[UserDataKeys.CustomActivityDefaultName] as string); else targetList.Add(parent.Name); foreach (Activity activity in parent.EnabledActivities) { if(activity is ICompensatableActivity) targetList.Add(activity.Name); } } break; } parent = parent.Parent; } return targetList; } #endregion } #region Validator internal sealed class CompensateValidator : ActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { ValidationErrorCollection validationErrors = base.Validate(manager, obj); CompensateActivity compensate = obj as CompensateActivity; if (compensate == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(CompensateActivity).FullName), "obj"); // Compensate must be in a CompensationHandler or FaultHandler CompositeActivity parent = compensate.Parent; while (parent != null) { if (parent is CompensationHandlerActivity || parent is FaultHandlerActivity || parent is CancellationHandlerActivity) break; parent = parent.Parent; } if (parent == null) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_CompensateBadNesting), ErrorNumbers.Error_CompensateBadNesting)); ValidationError error = null; StringCollection targets = CompensateActivity.GetCompensatableTargets(compensate); if (String.IsNullOrEmpty(compensate.TargetActivityName)) { error = ValidationError.GetNotSetValidationError("TargetActivityName"); } else if (!targets.Contains(compensate.TargetActivityName)) { error = new ValidationError(SR.GetString(SR.Error_CompensateBadTargetTX, "TargetActivityName", compensate.TargetActivityName, compensate.QualifiedName), ErrorNumbers.Error_CompensateBadTargetTX, false, "TargetActivityName"); } if (error != null) validationErrors.Add(error); return validationErrors; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.ComponentModel { using System; using System.Drawing; using System.ComponentModel; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel.Design; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.ComponentModel.Compiler; [SRDescription(SR.CompensateActivityDescription)] [ToolboxItem(typeof(ActivityToolboxItem))] [Designer(typeof(CompensateDesigner), typeof(IDesigner))] [ToolboxBitmap(typeof(CompensateActivity), "Resources.Compensate.png")] [ActivityValidator(typeof(CompensateValidator))] [SRCategory(SR.Standard)] public sealed class CompensateActivity : Activity, IPropertyValueProvider, IActivityEventListener { public CompensateActivity() { } public CompensateActivity(string name) : base(name) { } public static readonly DependencyProperty TargetActivityNameProperty = DependencyProperty.Register("TargetActivityName", typeof(string), typeof(CompensateActivity), new PropertyMetadata("",DependencyPropertyOptions.Metadata)); [SRCategory(SR.Activity)] [SRDescription(SR.CompensatableActivityDescr)] [TypeConverter(typeof(PropertyValueProviderTypeConverter))] [MergableProperty(false)] [DefaultValue("")] public string TargetActivityName { get { return base.GetValue(TargetActivityNameProperty) as string; } set { base.SetValue(TargetActivityNameProperty, value); } } #region Protected Methods protected internal override void Initialize(IServiceProvider provider) { if (this.Parent == null) throw new InvalidOperationException(SR.GetString(SR.Error_MustHaveParent)); base.Initialize(provider); } protected internal override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); return CompensateTargetActivity(executionContext); } #endregion #region IActivityEventListener Members void IActivityEventListener .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { if (sender == null) throw new ArgumentNullException("sender"); if (e == null) throw new ArgumentNullException("e"); ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); if (e.ExecutionStatus == ActivityExecutionStatus.Closed) { // Remove status change subscription. e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this); // Do it again if there are any more. ActivityExecutionStatus status = CompensateTargetActivity(context); if (status == ActivityExecutionStatus.Closed) context.CloseActivity(); } } #endregion #region Execution Helpers private ActivityExecutionStatus CompensateTargetActivity(ActivityExecutionContext context) { Activity targetActivity = null; Activity commonParentActivity = context.Activity; do { commonParentActivity = commonParentActivity.Parent; targetActivity = commonParentActivity.GetActivityByName(this.TargetActivityName, true); } while (targetActivity == null); if (targetActivity is ICompensatableActivity && targetActivity.ExecutionStatus == ActivityExecutionStatus.Closed && targetActivity.ExecutionResult == ActivityExecutionResult.Succeeded) { // same execution context targetActivity.RegisterForStatusChange(Activity.ClosedEvent, this); context.CompensateActivity(targetActivity); return context.Activity.ExecutionStatus; } else if (targetActivity.ExecutionStatus == ActivityExecutionStatus.Initialized) { // Template activity // walk through active contexts ActivityExecutionContextManager contextManager = context.ExecutionContextManager; foreach (ActivityExecutionContext activeContext in contextManager.ExecutionContexts) { if (targetActivity.GetActivityByName(activeContext.Activity.QualifiedName, true) != null) { if (activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Compensating || activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Faulting || activeContext.Activity.ExecutionStatus == ActivityExecutionStatus.Canceling ) return context.Activity.ExecutionStatus; } } // walk through all completed execution contexts for (int index = contextManager.CompletedExecutionContexts.Count - 1; index >= 0; index--) { //only compensate direct child during explicit compensation ActivityExecutionContextInfo completedActivityInfo = contextManager.CompletedExecutionContexts[index]; if (((completedActivityInfo.Flags & PersistFlags.NeedsCompensation) != 0)) { ActivityExecutionContext revokedExecutionContext = contextManager.DiscardPersistedExecutionContext(completedActivityInfo); if (revokedExecutionContext.Activity is ICompensatableActivity) { revokedExecutionContext.Activity.RegisterForStatusChange(Activity.ClosedEvent, this); revokedExecutionContext.CompensateActivity(revokedExecutionContext.Activity); } return context.Activity.ExecutionStatus; } } } else { // currently faulting, canceling, or compensating if (CompensationUtils.TryCompensateLastCompletedChildActivity(context, targetActivity, this)) return context.Activity.ExecutionStatus; } return ActivityExecutionStatus.Closed; } #endregion #region IPropertyValueProvider Members ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { if (context == null) throw new ArgumentNullException("context"); return GetCompensatableTargets(this); } #endregion #region Validation Helpers internal static StringCollection GetCompensatableTargets(CompensateActivity compensate) { StringCollection targetList = new StringCollection(); CompositeActivity parent = compensate.Parent; while (parent != null) { if ((parent is CompensationHandlerActivity) || (parent is FaultHandlersActivity) || (parent is CancellationHandlerActivity)) { parent = parent.Parent; if (parent != null) { if (Helpers.IsCustomActivity(parent)) targetList.Add(parent.UserData[UserDataKeys.CustomActivityDefaultName] as string); else targetList.Add(parent.Name); foreach (Activity activity in parent.EnabledActivities) { if(activity is ICompensatableActivity) targetList.Add(activity.Name); } } break; } parent = parent.Parent; } return targetList; } #endregion } #region Validator internal sealed class CompensateValidator : ActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { ValidationErrorCollection validationErrors = base.Validate(manager, obj); CompensateActivity compensate = obj as CompensateActivity; if (compensate == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(CompensateActivity).FullName), "obj"); // Compensate must be in a CompensationHandler or FaultHandler CompositeActivity parent = compensate.Parent; while (parent != null) { if (parent is CompensationHandlerActivity || parent is FaultHandlerActivity || parent is CancellationHandlerActivity) break; parent = parent.Parent; } if (parent == null) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_CompensateBadNesting), ErrorNumbers.Error_CompensateBadNesting)); ValidationError error = null; StringCollection targets = CompensateActivity.GetCompensatableTargets(compensate); if (String.IsNullOrEmpty(compensate.TargetActivityName)) { error = ValidationError.GetNotSetValidationError("TargetActivityName"); } else if (!targets.Contains(compensate.TargetActivityName)) { error = new ValidationError(SR.GetString(SR.Error_CompensateBadTargetTX, "TargetActivityName", compensate.TargetActivityName, compensate.QualifiedName), ErrorNumbers.Error_CompensateBadTargetTX, false, "TargetActivityName"); } if (error != null) validationErrors.Add(error); return validationErrors; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EntityContainerEmitter.cs
- XPathParser.cs
- Emitter.cs
- LayoutUtils.cs
- DurableRuntimeValidator.cs
- EntityContainerEmitter.cs
- ActiveXSerializer.cs
- DesigntimeLicenseContext.cs
- PageThemeCodeDomTreeGenerator.cs
- DataRowExtensions.cs
- RemoteWebConfigurationHostServer.cs
- StatusBarPanelClickEvent.cs
- XmlSerializerAssemblyAttribute.cs
- WinEventWrap.cs
- ElementMarkupObject.cs
- AutomationPeer.cs
- ResourcesBuildProvider.cs
- CheckBox.cs
- Attachment.cs
- TimeSpanParse.cs
- TraceHandler.cs
- SerializationInfoEnumerator.cs
- SamlNameIdentifierClaimResource.cs
- EventLogLink.cs
- PreProcessor.cs
- XmlSchemaSimpleContent.cs
- LineVisual.cs
- SqlGenericUtil.cs
- ValueUnavailableException.cs
- EnlistmentState.cs
- JsonClassDataContract.cs
- FormConverter.cs
- TypeGeneratedEventArgs.cs
- CompatibleComparer.cs
- FieldTemplateUserControl.cs
- DefaultTypeArgumentAttribute.cs
- StringCollectionMarkupSerializer.cs
- OrderedDictionaryStateHelper.cs
- StringFormat.cs
- TableCell.cs
- TableLayoutPanel.cs
- DefaultTypeArgumentAttribute.cs
- SourceCollection.cs
- HttpRequestWrapper.cs
- Color.cs
- EnvelopedPkcs7.cs
- DownloadProgressEventArgs.cs
- HostedElements.cs
- NumberFormatInfo.cs
- CategoryAttribute.cs
- HyperLinkField.cs
- UIElement.cs
- InstanceStoreQueryResult.cs
- BooleanAnimationUsingKeyFrames.cs
- ControlAdapter.cs
- RectangleF.cs
- RefType.cs
- ServiceContractGenerator.cs
- WorkerRequest.cs
- PropertyGridCommands.cs
- MbpInfo.cs
- TcpSocketManager.cs
- XmlValidatingReaderImpl.cs
- TypefaceCollection.cs
- Utils.cs
- ReversePositionQuery.cs
- BidPrivateBase.cs
- SessionState.cs
- Win32.cs
- AttachedPropertyMethodSelector.cs
- TemplatedAdorner.cs
- PartialCachingControl.cs
- HijriCalendar.cs
- Site.cs
- wgx_sdk_version.cs
- InputLangChangeEvent.cs
- ParameterEditorUserControl.cs
- GridViewRow.cs
- FamilyMapCollection.cs
- ObjRef.cs
- Thread.cs
- SyndicationLink.cs
- ResizeGrip.cs
- PrintControllerWithStatusDialog.cs
- ElementProxy.cs
- ListView.cs
- GraphicsContext.cs
- RequestCacheValidator.cs
- IncrementalReadDecoders.cs
- TextSelectionHighlightLayer.cs
- BindingContext.cs
- CorrelationInitializer.cs
- HostnameComparisonMode.cs
- MatchingStyle.cs
- ObjectItemAttributeAssemblyLoader.cs
- MetadataPropertyAttribute.cs
- SelectionProcessor.cs
- BaseConfigurationRecord.cs
- SqlBinder.cs
- WhileDesigner.cs