255 lines
7.5 KiB
C#
255 lines
7.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Csla.Validation
|
|
{
|
|
/// <summary>
|
|
/// A collection of currently broken rules.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This collection is readonly and can be safely made available
|
|
/// to code outside the business object such as the UI. This allows
|
|
/// external code, such as a UI, to display the list of broken rules
|
|
/// to the user.
|
|
/// </remarks>
|
|
[Serializable()]
|
|
public class BrokenRulesCollection : Core.ReadOnlyBindingList<BrokenRule>
|
|
{
|
|
|
|
private int _errorCount;
|
|
private int _warningCount;
|
|
private int _infoCount;
|
|
|
|
/// <summary>
|
|
/// Gets the number of broken rules in
|
|
/// the collection that have a severity
|
|
/// of Error.
|
|
/// </summary>
|
|
/// <value>An integer value.</value>
|
|
public int ErrorCount
|
|
{
|
|
get { return _errorCount; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the number of broken rules in
|
|
/// the collection that have a severity
|
|
/// of Warning.
|
|
/// </summary>
|
|
/// <value>An integer value.</value>
|
|
public int WarningCount
|
|
{
|
|
get { return _warningCount; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the number of broken rules in
|
|
/// the collection that have a severity
|
|
/// of Information.
|
|
/// </summary>
|
|
/// <value>An integer value.</value>
|
|
public int InformationCount
|
|
{
|
|
get { return _infoCount; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the first <see cref="BrokenRule" /> object
|
|
/// corresponding to the specified property.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Code in a business object or UI can also use this value to retrieve
|
|
/// the first broken rule in <see cref="BrokenRulesCollection" /> that corresponds
|
|
/// to a specfic property on the object.
|
|
/// </remarks>
|
|
/// <param name="property">The name of the property affected by the rule.</param>
|
|
/// <returns>
|
|
/// The first BrokenRule object corresponding to the specified property, or null if
|
|
/// there are no rules defined for the property.
|
|
/// </returns>
|
|
public BrokenRule GetFirstBrokenRule(string property)
|
|
{
|
|
return GetFirstMessage(property, RuleSeverity.Error);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the first <see cref="BrokenRule" /> object
|
|
/// corresponding to the specified property.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Code in a business object or UI can also use this value to retrieve
|
|
/// the first broken rule in <see cref="BrokenRulesCollection" /> that corresponds
|
|
/// to a specfic property.
|
|
/// </remarks>
|
|
/// <param name="property">The name of the property affected by the rule.</param>
|
|
/// <returns>
|
|
/// The first BrokenRule object corresponding to the specified property, or Nothing
|
|
/// (null in C#) if there are no rules defined for the property.
|
|
/// </returns>
|
|
public BrokenRule GetFirstMessage(string property)
|
|
{
|
|
foreach (BrokenRule item in this)
|
|
if (item.Property == property)
|
|
return item;
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the first <see cref="BrokenRule"/> object
|
|
/// corresponding to the specified property
|
|
/// and severity.
|
|
/// </summary>
|
|
/// <param name="property">The name of the property affected by the rule.</param>
|
|
/// <param name="severity">The severity of broken rule to return.</param>
|
|
/// <returns>
|
|
/// The first BrokenRule object corresponding to the specified property, or Nothing
|
|
/// (null in C#) if there are no rules defined for the property.
|
|
/// </returns>
|
|
public BrokenRule GetFirstMessage(string property, RuleSeverity severity)
|
|
{
|
|
foreach (BrokenRule item in this)
|
|
if (item.Property == property && item.Severity == severity)
|
|
return item;
|
|
return null;
|
|
}
|
|
|
|
internal BrokenRulesCollection()
|
|
{
|
|
// limit creation to this assembly
|
|
}
|
|
|
|
internal void Add(IRuleMethod rule)
|
|
{
|
|
Remove(rule);
|
|
IsReadOnly = false;
|
|
BrokenRule item = new BrokenRule(rule);
|
|
IncrementCount(item);
|
|
Add(item);
|
|
IsReadOnly = true;
|
|
}
|
|
|
|
internal void Remove(IRuleMethod rule)
|
|
{
|
|
// we loop through using a numeric counter because
|
|
// removing items within a foreach isn't reliable
|
|
IsReadOnly = false;
|
|
for (int index = 0; index < Count; index++)
|
|
if (this[index].RuleName == rule.RuleName)
|
|
{
|
|
DecrementCount(this[index]);
|
|
RemoveAt(index);
|
|
break;
|
|
}
|
|
IsReadOnly = true;
|
|
}
|
|
|
|
private void IncrementCount(BrokenRule item)
|
|
{
|
|
switch (item.Severity)
|
|
{
|
|
case RuleSeverity.Error:
|
|
_errorCount += 1;
|
|
break;
|
|
case RuleSeverity.Warning:
|
|
_warningCount += 1;
|
|
break;
|
|
case RuleSeverity.Information:
|
|
_infoCount += 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void DecrementCount(BrokenRule item)
|
|
{
|
|
switch (item.Severity)
|
|
{
|
|
case RuleSeverity.Error:
|
|
_errorCount -= 1;
|
|
break;
|
|
case RuleSeverity.Warning:
|
|
_warningCount -= 1;
|
|
break;
|
|
case RuleSeverity.Information:
|
|
_infoCount -= 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the text of all broken rule descriptions, each
|
|
/// separated by a <see cref="Environment.NewLine" />.
|
|
/// </summary>
|
|
/// <returns>The text of all broken rule descriptions.</returns>
|
|
public override string ToString()
|
|
{
|
|
System.Text.StringBuilder result = new System.Text.StringBuilder();
|
|
bool first = true;
|
|
foreach (BrokenRule item in this)
|
|
{
|
|
if (first)
|
|
first = false;
|
|
else
|
|
result.Append(Environment.NewLine);
|
|
result.Append(item.Description);
|
|
}
|
|
return result.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the text of all broken rule descriptions, each
|
|
/// separated by a <see cref="Environment.NewLine" />.
|
|
/// </summary>
|
|
/// <param name="severity">The severity of rules to
|
|
/// include in the result.</param>
|
|
/// <returns>The text of all broken rule descriptions
|
|
/// matching the specified severtiy.</returns>
|
|
public string ToString(RuleSeverity severity)
|
|
{
|
|
System.Text.StringBuilder result = new System.Text.StringBuilder();
|
|
bool first = true;
|
|
foreach (BrokenRule item in this)
|
|
{
|
|
if (item.Severity == severity)
|
|
{
|
|
if (first)
|
|
first = false;
|
|
else
|
|
result.Append(Environment.NewLine);
|
|
result.Append(item.Description);
|
|
}
|
|
}
|
|
return result.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a string array containing all broken
|
|
/// rule descriptions.
|
|
/// </summary>
|
|
/// <returns>The text of all broken rule descriptions
|
|
/// matching the specified severtiy.</returns>
|
|
public string[] ToArray()
|
|
{
|
|
List<string> result = new List<string>();
|
|
foreach (BrokenRule item in this)
|
|
result.Add(item.Description);
|
|
return result.ToArray();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a string array containing all broken
|
|
/// rule descriptions.
|
|
/// </summary>
|
|
/// <param name="severity">The severity of rules
|
|
/// to include in the result.</param>
|
|
/// <returns>The text of all broken rule descriptions
|
|
/// matching the specified severtiy.</returns>
|
|
public string[] ToArray(RuleSeverity severity)
|
|
{
|
|
List<string> result = new List<string>();
|
|
foreach (BrokenRule item in this)
|
|
if (item.Severity == severity)
|
|
result.Add(item.Description);
|
|
return result.ToArray();
|
|
}
|
|
}
|
|
} |