Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Statements / Compensate.cs / 1305376 / Compensate.cs
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//---------------------------------------------------------------
namespace System.Activities.Statements
{
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime;
using System.Activities.Validation;
using System.Linq;
using System.Activities.Expressions;
public sealed class Compensate : NativeActivity
{
static Constraint compensateWithNoTarget = Compensate.CompensateWithNoTarget();
InternalCompensate internalCompensate;
DefaultCompensation defaultCompensation;
Variable currentCompensationToken;
public Compensate()
: base()
{
this.currentCompensationToken = new Variable();
}
[DefaultValue(null)]
public InArgument Target
{
get;
set;
}
DefaultCompensation DefaultCompensation
{
get
{
if (this.defaultCompensation == null)
{
this.defaultCompensation = new DefaultCompensation()
{
Target = new InArgument(this.currentCompensationToken),
};
}
return this.defaultCompensation;
}
}
InternalCompensate InternalCompensate
{
get
{
if (this.internalCompensate == null)
{
this.internalCompensate = new InternalCompensate()
{
Target = new InArgument(new ArgumentValue { ArgumentName = "Target" }),
};
}
return this.internalCompensate;
}
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
RuntimeArgument targetArgument = new RuntimeArgument("Target", typeof(CompensationToken), ArgumentDirection.In);
metadata.Bind(this.Target, targetArgument);
metadata.SetArgumentsCollection(new Collection { targetArgument });
metadata.SetImplementationVariablesCollection(new Collection { this.currentCompensationToken });
Fx.Assert(DefaultCompensation != null, "DefaultCompensation must be valid");
Fx.Assert(InternalCompensate != null, "InternalCompensate must be valid");
metadata.SetImplementationChildrenCollection(
new Collection
{
DefaultCompensation,
InternalCompensate
});
}
internal override IList InternalGetConstraints()
{
return new List(1) { compensateWithNoTarget };
}
static Constraint CompensateWithNoTarget()
{
DelegateInArgument element = new DelegateInArgument { Name = "element" };
DelegateInArgument validationContext = new DelegateInArgument { Name = "validationContext" };
Variable assertFlag = new Variable { Name = "assertFlag" };
Variable> elements = new Variable>() { Name = "elements" };
Variable index = new Variable() { Name = "index" };
return new Constraint
{
Body = new ActivityAction
{
Argument1 = element,
Argument2 = validationContext,
Handler = new Sequence
{
Variables =
{
assertFlag,
elements,
index
},
Activities =
{
new If
{
Condition = new InArgument((env)=>element.Get(env).Target != null),
Then = new Assign
{
To = assertFlag,
Value = true
},
Else = new Sequence
{
Activities =
{
new Assign>
{
To = elements,
Value = new GetParentChain
{
ValidationContext = validationContext,
},
},
new While(env => (assertFlag.Get(env)!=true) && index.Get(env) < elements.Get(env).Count())
{
Body = new Sequence
{
Activities =
{
new If(env => (elements.Get(env).ElementAt(index.Get(env))).GetType() == typeof(CompensationParticipant))
{
Then = new Assign
{
To = assertFlag,
Value = true
},
},
new Assign
{
To=index,
Value=new InArgument(env => index.Get(env)+1)
},
}
}
}
}
}
},
new AssertValidation
{
Assertion = new InArgument(assertFlag),
Message = new InArgument(SR.CompensateWithNoTargetConstraint)
}
}
}
}
};
}
protected override void Execute(NativeActivityContext context)
{
CompensationExtension compensationExtension = context.GetExtension();
if (compensationExtension == null)
{
throw FxTrace.Exception.AsError(new InvalidOperationException(SR.CompensateWithoutCompensableActivity(this.DisplayName)));
}
if (Target.IsEmpty)
{
CompensationToken ambientCompensationToken = (CompensationToken)context.Properties.Find(CompensationToken.PropertyName);
CompensationTokenData ambientTokenData = ambientCompensationToken == null ? null : compensationExtension.Get(ambientCompensationToken.CompensationId);
if (ambientTokenData != null && ambientTokenData.IsTokenValidInSecondaryRoot)
{
this.currentCompensationToken.Set(context, ambientCompensationToken);
if (ambientTokenData.ExecutionTracker.Count > 0)
{
context.ScheduleActivity(DefaultCompensation);
}
}
else
{
throw FxTrace.Exception.AsError(new InvalidOperationException(SR.InvalidCompensateActivityUsage(this.DisplayName)));
}
}
else
{
CompensationToken compensationToken = Target.Get(context);
CompensationTokenData tokenData = compensationToken == null ? null : compensationExtension.Get(compensationToken.CompensationId);
if (compensationToken == null)
{
throw FxTrace.Exception.Argument("Target", SR.InvalidCompensationToken(this.DisplayName));
}
if (compensationToken.CompensateCalled)
{
// No-Op
return;
}
if (tokenData == null || tokenData.CompensationState != CompensationState.Completed)
{
throw FxTrace.Exception.AsError(new InvalidOperationException(SR.CompensableActivityAlreadyConfirmedOrCompensated));
}
// A valid in-arg was passed...
tokenData.CompensationState = CompensationState.Compensating;
compensationToken.CompensateCalled = true;
context.ScheduleActivity(InternalCompensate);
}
}
protected override void Cancel(NativeActivityContext context)
{
// Suppress Cancel
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlOuterApplyReducer.cs
- FixedPosition.cs
- DataTable.cs
- XmlTextReader.cs
- ToolStripComboBox.cs
- ZoomingMessageFilter.cs
- CaseInsensitiveComparer.cs
- ProcessInfo.cs
- Debug.cs
- FixedSOMTableRow.cs
- MobileUserControl.cs
- invalidudtexception.cs
- ToolstripProfessionalRenderer.cs
- WebPartVerb.cs
- SafeNativeMethods.cs
- _NegoState.cs
- DataServiceBehavior.cs
- CheckBox.cs
- HtmlInputFile.cs
- XPathDescendantIterator.cs
- BindingValueChangedEventArgs.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- SignatureGenerator.cs
- Matrix3D.cs
- CalendarItem.cs
- updatecommandorderer.cs
- ConcurrencyMode.cs
- DbgUtil.cs
- TemplateApplicationHelper.cs
- StringStorage.cs
- XmlMembersMapping.cs
- AspNetCompatibilityRequirementsMode.cs
- X509Certificate2Collection.cs
- NetCodeGroup.cs
- SessionStateModule.cs
- SettingsPropertyIsReadOnlyException.cs
- _HTTPDateParse.cs
- ToolStripPanelCell.cs
- MetaModel.cs
- TextProviderWrapper.cs
- SymmetricKey.cs
- MimeTextImporter.cs
- RadioButtonFlatAdapter.cs
- AssociationTypeEmitter.cs
- TextAction.cs
- UrlAuthorizationModule.cs
- DataGridViewColumnDesigner.cs
- DynamicQueryStringParameter.cs
- pingexception.cs
- ButtonDesigner.cs
- TypeInfo.cs
- AttachedPropertyDescriptor.cs
- ConnectorDragDropGlyph.cs
- ClickablePoint.cs
- DocumentViewerHelper.cs
- MethodCallTranslator.cs
- BitArray.cs
- DrawingContext.cs
- FrameworkObject.cs
- ModelPropertyDescriptor.cs
- ResolveMatchesMessageCD1.cs
- LogRestartAreaEnumerator.cs
- ParameterCollection.cs
- WebCodeGenerator.cs
- DataControlFieldHeaderCell.cs
- TableDetailsRow.cs
- InvariantComparer.cs
- WebPartConnectionsCancelVerb.cs
- SymbolPair.cs
- WebPartDisplayModeCollection.cs
- diagnosticsswitches.cs
- CookieParameter.cs
- AuthStoreRoleProvider.cs
- codemethodreferenceexpression.cs
- XmlNodeReader.cs
- SafeNativeMethods.cs
- DateTimeOffsetStorage.cs
- BitmapEffectRenderDataResource.cs
- TypeDescriptionProvider.cs
- ExpressionVisitor.cs
- DataGridViewComboBoxEditingControl.cs
- FragmentQuery.cs
- BindingExpressionBase.cs
- RowBinding.cs
- MergePropertyDescriptor.cs
- EntityDataSourceMemberPath.cs
- DataSourceGroupCollection.cs
- StringUtil.cs
- Timer.cs
- DrawingContextWalker.cs
- ChangePassword.cs
- AssemblyAttributes.cs
- ContentType.cs
- DesignerProperties.cs
- PrintingPermission.cs
- cookieexception.cs
- PrivilegedConfigurationManager.cs
- Invariant.cs
- ZoneIdentityPermission.cs
- KerberosSecurityTokenProvider.cs