File: Tracking\TrackPoint.cs
Project: ndp\cdf\src\WF\RunTime\System.Workflow.Runtime.csproj (System.Workflow.Runtime)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.IO;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Globalization;
 
//using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using Hosting = System.Workflow.Runtime.Hosting;
 
namespace System.Workflow.Runtime.Tracking
{
 
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public sealed class ActivityTrackPoint
    {
        #region Private Data Members
 
        private ActivityTrackingLocationCollection _match = new ActivityTrackingLocationCollection();
        private ActivityTrackingLocationCollection _exclude = new ActivityTrackingLocationCollection();
        private TrackingAnnotationCollection _annotations = new TrackingAnnotationCollection();
        private ExtractCollection _extracts = new ExtractCollection();
 
        #endregion
 
        #region Public Properties
 
        public ActivityTrackingLocationCollection MatchingLocations
        {
            get { return _match; }
        }
 
        public ActivityTrackingLocationCollection ExcludedLocations
        {
            get { return _exclude; }
        }
 
        public TrackingAnnotationCollection Annotations
        {
            get { return _annotations; }
        }
 
        public ExtractCollection Extracts
        {
            get { return _extracts; }
        }
 
        #endregion
 
        #region Internal Matching Methods
 
        internal bool IsMatch(Activity activity, out List<ActivityExecutionStatus> status, out bool hasCondition)
        {
            hasCondition = false;
            //
            // Check if we have any conditions on this track point.
            // If we do signal that we need to recheck this item for each activity event (can't cache)
            foreach (ActivityTrackingLocation location in _exclude)
            {
                if ((null != location.Conditions) && (location.Conditions.Count > 0))
                {
                    hasCondition = true;
                    break;
                }
            }
            foreach (ActivityTrackingLocation location in _match)
            {
                if ((null != location.Conditions) && (location.Conditions.Count > 0))
                {
                    hasCondition = true;
                    break;
                }
            }
            status = new List<ActivityExecutionStatus>(9);
            //
            // Do matches first
            foreach (ActivityTrackingLocation location in _match)
            {
                if (location.Match(activity, true))
                {
                    //
                    // Insert all status values for this location
                    foreach (ActivityExecutionStatus s in location.ExecutionStatusEvents)
                    {
                        if (!status.Contains(s))
                            status.Add(s);
                    }
                }
            }
            //
            // If no includes matched 
            // this trackpoint isn't relevant to this activity
            if (0 == status.Count)
                return false;
            //
            // Check the excludes but only if there aren't any conditions
            if (!hasCondition)
            {
                foreach (ActivityTrackingLocation location in _exclude)
                {
                    if (location.Match(activity, true))
                    {
                        //
                        // Remove all status values for this location
                        foreach (ActivityExecutionStatus s in location.ExecutionStatusEvents)
                            status.Remove(s);
                    }
                }
            }
 
            return (status.Count > 0);
        }
 
        internal bool IsMatch(Activity activity, ActivityExecutionStatus status)
        {
            //
            // Do matches first
            bool included = false;
            foreach (ActivityTrackingLocation location in _match)
            {
                if (location.Match(activity, false))
                {
                    if (location.ExecutionStatusEvents.Contains(status))
                    {
                        included = true;
                        break;
                    }
                }
            }
            //
            // If no includes matched this trackpoint 
            // doesn't match this activity
            if (!included)
                return false;
            //
            // Check the excludes
            foreach (ActivityTrackingLocation location in _exclude)
            {
                //
                // If any exclude matches this trackpoint
                // doesn't match this activity
                if (location.Match(activity, false))
                {
                    if (location.ExecutionStatusEvents.Contains(status))
                        return false;
                }
            }
 
            return included;
        }
 
        internal void Track(Activity activity, IServiceProvider provider, IList<TrackingDataItem> items)
        {
            foreach (TrackingExtract e in _extracts)
                e.GetData(activity, provider, items);
        }
 
        #endregion
 
    }
 
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public sealed class UserTrackPoint
    {
        #region Private Data Members
 
        private UserTrackingLocationCollection _match = new UserTrackingLocationCollection();
        private UserTrackingLocationCollection _exclude = new UserTrackingLocationCollection();
        private TrackingAnnotationCollection _annotations = new TrackingAnnotationCollection();
        private ExtractCollection _extracts = new ExtractCollection();
 
        #endregion
 
        #region Public Properties
 
        public UserTrackingLocationCollection MatchingLocations
        {
            get { return _match; }
        }
 
        public UserTrackingLocationCollection ExcludedLocations
        {
            get { return _exclude; }
        }
 
        public TrackingAnnotationCollection Annotations
        {
            get { return _annotations; }
        }
 
        public ExtractCollection Extracts
        {
            get { return _extracts; }
        }
 
        #endregion
 
        #region Internal Matching Methods
 
        internal bool IsMatch(Activity activity)
        {
            //
            // Check include, excludes checked at event time
            foreach (UserTrackingLocation location in _match)
                if (location.Match(activity))
                    return true;
 
            return false;
        }
 
        internal bool IsMatch(Activity activity, string keyName, object argument)
        {
            //
            // We need to check runtime values here
            //
            // Check the excludes - if any exclude matches based on activity, key and arg type we're not a match
            foreach (UserTrackingLocation location in _exclude)
                if (location.Match(activity, keyName, argument))
                    return false;
            //
            // No excludes match, check includes
            foreach (UserTrackingLocation location in _match)
                if (location.Match(activity, keyName, argument))
                    return true;
 
            return false;
        }
 
        internal void Track(Activity activity, object arg, IServiceProvider provider, IList<TrackingDataItem> items)
        {
            foreach (TrackingExtract e in _extracts)
                e.GetData(activity, provider, items);
        }
 
        #endregion
    }
 
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public sealed class WorkflowTrackPoint
    {
        #region Private Data Members
 
        private WorkflowTrackingLocation _location = new WorkflowTrackingLocation();
        private TrackingAnnotationCollection _annotations = new TrackingAnnotationCollection();
 
        #endregion
 
        #region Public Properties
 
        public WorkflowTrackingLocation MatchingLocation
        {
            get { return _location; }
            set { _location = value; }
        }
 
        public TrackingAnnotationCollection Annotations
        {
            get { return _annotations; }
        }
 
        #endregion
 
        #region Internal Matching Methods
 
        internal bool IsMatch(TrackingWorkflowEvent status)
        {
            return _location.Match(status);
        }
 
        #endregion
    }
}