Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Filters / TransactionFilter.cs / 1305376 / TransactionFilter.cs
// ****************************************************************************
// Copyright (C) 2000-2001 Microsoft Corporation. All rights reserved.
//
// CONTENTS
// Scope like TransactionModel Interceptor/Filter Executor
//
// DESCRIPTION
//
// ***************************************************************************
namespace System.Workflow.ComponentModel
{
using System;
using System.Collections;
using System.Diagnostics;
using System.ComponentModel;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Reflection;
// TransactedFilter
//
// This interceptor executor deals with the transaction aspects (as
// defined by the current scope activity) of an activity.
//
// The activity must be attributed with SupportsTransactionAttribute.
// The activity executor need not worry about any of the scope like
// transaction behavior management.
internal sealed class TransactedContextFilter : ActivityExecutionFilter, IActivityEventListener, IActivityEventListener
{
#region ActivityExecutor Members
public override ActivityExecutionStatus Execute(Activity activity, ActivityExecutionContext executionContext)
{
if (executionContext == null)
throw new ArgumentNullException("executionContext");
if (activity == null)
throw new ArgumentNullException("activity");
if (!activity.SupportsTransaction)
throw new ArgumentException("activity");
// subscribe to the main activity
activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
activity.HoldLockOnStatusChange(this);
return TransactedContextFilter.ExecuteActivity(activity, executionContext, false);
}
#endregion
#region IActivityEventListener Members
void IActivityEventListener.OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
{
ActivityExecutionContext context = sender as ActivityExecutionContext;
if (context == null)
throw new ArgumentException("sender");
if (context.Activity.HasPrimaryClosed && context.Activity.LockCountOnStatusChange == 1)
{
// get exception
Exception exception = (Exception)context.Activity.GetValue(ActivityExecutionContext.CurrentExceptionProperty);
if (exception != null)
{
WorkflowTransactionOptions transactionOptions = TransactedContextFilter.GetTransactionOptions(context.Activity);
if (transactionOptions != null)
{
// request revert to checkpoint state
context.RequestRevertToCheckpointState(this.OnRevertInstanceState, new StateRevertedEventArgs(exception), false, null);
}
else
{
// release locks
context.ReleaseLocks(false);
context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
context.Activity.ReleaseLockOnStatusChange(this);
}
}
else
{
try
{
// 1st param is for transactional, means if the release lock on status change will try to persist the workflow instace
// if that fails, then locks will be reacquired, otherwise they will be released.
context.ReleaseLocks(true);
context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
context.Activity.ReleaseLockOnStatusChange(this);
context.DisposeCheckpointState();
}
catch
{
// re-subscribe
context.Activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
throw;
}
}
}
}
#endregion
#region OnRevertInstanceData Member
private void OnRevertInstanceState(object sender, EventArgs e)
{
if (sender == null)
throw new ArgumentNullException("sender");
if (e == null)
throw new ArgumentNullException("e");
ActivityExecutionContext context = sender as ActivityExecutionContext;
StateRevertedEventArgs args = e as StateRevertedEventArgs;
// stash exception
context.Activity.SetValueCommon(ActivityExecutionContext.CurrentExceptionProperty, args.Exception, ActivityExecutionContext.CurrentExceptionProperty.DefaultMetadata, false);
// cancel the activity
context.ReleaseLocks(false);
context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
context.Activity.ReleaseLockOnStatusChange(this);
}
#endregion
#region IActivityEventListener Members
void IActivityEventListener.OnEvent(object sender, EventArgs e)
{
ActivityExecutionContext context = (ActivityExecutionContext)sender;
// only if activity is still executing, then run it
if (context.Activity.ExecutionStatus == ActivityExecutionStatus.Executing)
{
ActivityExecutionStatus newStatus = TransactedContextFilter.ExecuteActivity(context.Activity, context, true);
if (newStatus == ActivityExecutionStatus.Closed)
context.CloseActivity();
}
}
#endregion
#region Helper Methods
private static ActivityExecutionStatus ExecuteActivity(Activity activity, ActivityExecutionContext context, bool locksAcquired)
{
// acquire needed synchronization
TransactedContextFilter executor = (TransactedContextFilter)ActivityExecutors.GetActivityExecutorFromType(typeof(TransactedContextFilter));
if (!locksAcquired && !context.AcquireLocks(executor))
return activity.ExecutionStatus;
// checkpoint for instance state
//
WorkflowTransactionOptions transaction = TransactedContextFilter.GetTransactionOptions(activity);
if (transaction != null)
context.CheckpointInstanceState();
// delegate to the next executor for the activity
return executor.NextActivityExecutorInChain(activity).Execute(activity, context);
}
internal static WorkflowTransactionOptions GetTransactionOptions(Activity activity)
{
return activity.GetValue(activity is TransactionScopeActivity ? TransactionScopeActivity.TransactionOptionsProperty : CompensatableTransactionScopeActivity.TransactionOptionsProperty) as WorkflowTransactionOptions;
}
#endregion
}
#region StateRevertedEventArgs Class
[Serializable]
internal class StateRevertedEventArgs : EventArgs
{
public Exception Exception;
public StateRevertedEventArgs(Exception exception)
{
this.Exception = exception;
}
}
#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
- DataPagerFieldCommandEventArgs.cs
- ReachIDocumentPaginatorSerializer.cs
- ImmutableObjectAttribute.cs
- KeyedCollection.cs
- ValidatorCollection.cs
- ColorInterpolationModeValidation.cs
- ConnectionStringSettingsCollection.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- DoubleLink.cs
- InputLanguageSource.cs
- OleDbCommandBuilder.cs
- ExtensionsSection.cs
- HtmlElement.cs
- NullReferenceException.cs
- KnownAssemblyEntry.cs
- Transform3DGroup.cs
- SafeCryptoHandles.cs
- NavigationPropertyEmitter.cs
- InvokeMethod.cs
- WebServiceClientProxyGenerator.cs
- MsiStyleLogWriter.cs
- future.cs
- NameValuePermission.cs
- DefaultDialogButtons.cs
- ExpressionBuilder.cs
- OleDbRowUpdatingEvent.cs
- MimePart.cs
- X509CertificateCollection.cs
- Dictionary.cs
- BuildProvider.cs
- XPathAncestorQuery.cs
- MouseButton.cs
- XmlAttributeOverrides.cs
- LassoSelectionBehavior.cs
- ValidatingCollection.cs
- InsufficientExecutionStackException.cs
- XmlHelper.cs
- BitVector32.cs
- WSSecurityOneDotZeroSendSecurityHeader.cs
- Unit.cs
- _DigestClient.cs
- DateTime.cs
- DataPagerFieldItem.cs
- InkPresenterAutomationPeer.cs
- ProcessHostFactoryHelper.cs
- WindowVisualStateTracker.cs
- CmsInterop.cs
- GAC.cs
- DrawingGroup.cs
- SqlResolver.cs
- GroupItemAutomationPeer.cs
- ClientBuildManager.cs
- TextFormatterHost.cs
- XmlNotation.cs
- AmbientProperties.cs
- CacheDependency.cs
- Property.cs
- SystemInfo.cs
- SecUtil.cs
- EmptyQuery.cs
- DBCSCodePageEncoding.cs
- CustomAttributeSerializer.cs
- InternalBufferOverflowException.cs
- ReliableMessagingHelpers.cs
- SinglePageViewer.cs
- DataGridViewTextBoxColumn.cs
- PartManifestEntry.cs
- RadioButtonBaseAdapter.cs
- XmlSchemaFacet.cs
- SecurityUniqueId.cs
- RelationHandler.cs
- ManagedFilter.cs
- StringCollection.cs
- RecognizerStateChangedEventArgs.cs
- XamlWriter.cs
- StructuralType.cs
- Hyperlink.cs
- XmlQueryTypeFactory.cs
- DecoderNLS.cs
- AffineTransform3D.cs
- ToolboxItem.cs
- BindStream.cs
- ScriptResourceAttribute.cs
- DataAccessor.cs
- WriteTimeStream.cs
- ItemsPanelTemplate.cs
- XhtmlBasicValidatorAdapter.cs
- CollectionEditVerbManager.cs
- WebControl.cs
- ArgumentElement.cs
- CustomErrorsSection.cs
- Vector3DAnimationUsingKeyFrames.cs
- xml.cs
- FileSystemWatcher.cs
- CachedRequestParams.cs
- XmlSchemaInferenceException.cs
- SizeConverter.cs
- Splitter.cs
- DataGridViewCellCollection.cs
- DomainUpDown.cs