File: Rules\DeclarativeConditionsCollection.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
// ---------------------------------------------------------------------------
// Copyright (C) 2005 Microsoft Corporation - All Rights Reserved
// ---------------------------------------------------------------------------
 
using System;
using System.Diagnostics;
using System.CodeDom;
using System.Collections.ObjectModel;
using System.ComponentModel.Design.Serialization;
using System.Collections.Generic;
using System.Workflow.ComponentModel;
using System.Globalization;
using System.IO;
using System.Workflow.ComponentModel.Serialization;
 
namespace System.Workflow.Activities.Rules
{
    #region RuleConditionCollection Class
    [Serializable]
    public sealed class RuleConditionCollection : KeyedCollection<string, RuleCondition>, IWorkflowChangeDiff
    {
        private bool _runtimeInitialized;
        [NonSerialized]
        private object _runtimeInitializationLock = new object();
 
        public RuleConditionCollection()
        {
        }
 
        protected override string GetKeyForItem(RuleCondition item)
        {
            return item.Name;
        }
 
        /// <summary>
        /// Mark the DeclarativeConditionDefinitionCollection as Runtime Initialized to prevent direct runtime updates.
        /// </summary>
        internal void OnRuntimeInitialized()
        {
            lock (_runtimeInitializationLock)
            {
                if (_runtimeInitialized)
                    return;
 
                foreach (RuleCondition condition in this)
                {
                    condition.OnRuntimeInitialized();
                }
                _runtimeInitialized = true;
            }
        }
 
        protected override void InsertItem(int index, RuleCondition item)
        {
            if (this._runtimeInitialized)
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            if (item.Name != null && item.Name.Length >= 0 && this.Contains(item.Name))
            {
                string message = string.Format(CultureInfo.CurrentCulture, Messages.ConditionExists, item.Name);
                throw new ArgumentException(message);
            }
 
            base.InsertItem(index, item);
        }
 
        protected override void RemoveItem(int index)
        {
            if (this._runtimeInitialized)
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            base.RemoveItem(index);
        }
 
        protected override void SetItem(int index, RuleCondition item)
        {
            if (this._runtimeInitialized)
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            base.SetItem(index, item);
        }
 
        internal bool RuntimeMode
        {
            set { this._runtimeInitialized = value; }
            get { return this._runtimeInitialized; }
        }
 
        new public void Add(RuleCondition item)
        {
            if (this._runtimeInitialized)
                throw new InvalidOperationException(SR.GetString(SR.Error_CanNotChangeAtRuntime));
 
            if (null == item)
            {
                throw new ArgumentNullException("item");
            }
 
            if (null == item.Name)
            {
                string message = string.Format(CultureInfo.CurrentCulture, Messages.InvalidConditionName, "item.Name");
                throw new ArgumentException(message);
            }
 
            base.Add(item);
        }
 
        public IList<WorkflowChangeAction> Diff(object originalDefinition, object changedDefinition)
        {
            List<WorkflowChangeAction> listChanges = new List<WorkflowChangeAction>();
 
            RuleConditionCollection originalConditions = (RuleConditionCollection)originalDefinition;
            RuleConditionCollection changedConditions = (RuleConditionCollection)changedDefinition;
 
            if (null != changedConditions)
            {
                foreach (RuleCondition cCondition in changedConditions)
                {
                    if (null != originalConditions)
                    {
                        if (originalConditions.Contains(cCondition.Name))
                        {
                            RuleCondition oCondition = originalConditions[cCondition.Name];
                            if (!oCondition.Equals(cCondition))
                            {
                                listChanges.Add(new UpdatedConditionAction(oCondition, cCondition));
                            }
                        }
                        else
                        {
                            listChanges.Add(new AddedConditionAction(cCondition));
                        }
                    }
                    else
                    {
                        listChanges.Add(new AddedConditionAction(cCondition));
                    }
                }
            }
 
            if (null != originalConditions)
            {
                foreach (RuleCondition oCondition in originalConditions)
                {
                    if (null != changedConditions)
                    {
                        if (!changedConditions.Contains(oCondition.Name))
                        {
                            listChanges.Add(new RemovedConditionAction(oCondition));
                        }
                    }
                    else
                    {
                        listChanges.Add(new RemovedConditionAction(oCondition));
                    }
                }
            }
            return listChanges;
        }
    }
    #endregion
}