Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WebPartHelpVerb.cs
- MatrixTransform3D.cs
- FacetChecker.cs
- DataObject.cs
- PartialArray.cs
- AlphaSortedEnumConverter.cs
- ConfigXmlWhitespace.cs
- HitTestWithGeometryDrawingContextWalker.cs
- DataBoundLiteralControl.cs
- DESCryptoServiceProvider.cs
- M3DUtil.cs
- ColumnMapTranslator.cs
- TemporaryBitmapFile.cs
- RectangleGeometry.cs
- WindowHelperService.cs
- CodeRemoveEventStatement.cs
- Stroke.cs
- MachineKeySection.cs
- CodeDelegateCreateExpression.cs
- ObjectContext.cs
- FixedPageProcessor.cs
- PromptBuilder.cs
- BitmapMetadataEnumerator.cs
- ErrorReporting.cs
- LayoutEditorPart.cs
- TextTreeTextElementNode.cs
- SelectionItemPattern.cs
- FilteredDataSetHelper.cs
- ContainerFilterService.cs
- ControlHelper.cs
- FormsIdentity.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- DataGridViewRowCollection.cs
- dsa.cs
- PipelineModuleStepContainer.cs
- SqlOuterApplyReducer.cs
- HttpContext.cs
- WebHeaderCollection.cs
- MaterializeFromAtom.cs
- QilInvoke.cs
- TaskFormBase.cs
- SoundPlayer.cs
- SemaphoreSecurity.cs
- recordstatescratchpad.cs
- StylusButton.cs
- DelegateTypeInfo.cs
- Assembly.cs
- __Error.cs
- ControlValuePropertyAttribute.cs
- HtmlLabelAdapter.cs
- IndexerNameAttribute.cs
- FormattedText.cs
- AutomationPropertyInfo.cs
- ProgressBarBrushConverter.cs
- AppSettingsExpressionBuilder.cs
- OleDbEnumerator.cs
- SchemaType.cs
- PocoEntityKeyStrategy.cs
- ExtendedPropertyDescriptor.cs
- CornerRadius.cs
- SqlDelegatedTransaction.cs
- WindowsListViewGroupHelper.cs
- OracleLob.cs
- DataColumnMappingCollection.cs
- NamespaceCollection.cs
- UIElementIsland.cs
- VisualBasic.cs
- DataGridViewRowPrePaintEventArgs.cs
- GridViewItemAutomationPeer.cs
- SiteMapSection.cs
- ImplicitInputBrush.cs
- TypeGenericEnumerableViewSchema.cs
- ProfileInfo.cs
- BindingFormattingDialog.cs
- CapabilitiesAssignment.cs
- ListParagraph.cs
- BaseProcessProtocolHandler.cs
- Sql8ExpressionRewriter.cs
- SafeHandle.cs
- ReflectEventDescriptor.cs
- HTTPNotFoundHandler.cs
- BaseResourcesBuildProvider.cs
- LinqDataSource.cs
- BamlResourceContent.cs
- InvalidProgramException.cs
- MissingMethodException.cs
- DbDataReader.cs
- DbgUtil.cs
- IPAddress.cs
- LinearKeyFrames.cs
- ConfigXmlWhitespace.cs
- FontFamily.cs
- RsaSecurityTokenAuthenticator.cs
- _HelperAsyncResults.cs
- XMLUtil.cs
- WebPartUtil.cs
- Misc.cs
- OneToOneMappingSerializer.cs
- ExpressionPrefixAttribute.cs
- BitmapScalingModeValidation.cs