164 lines
5.5 KiB
C#
164 lines
5.5 KiB
C#
|
// ---------------------------------------------------------------------------
|
||
|
// 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
|
||
|
}
|
||
|
|