using System;
namespace Csla.Validation
{
///
/// Tracks all information for a rule.
///
internal class RuleMethod : IRuleMethod, IComparable, IComparable
{
private RuleHandler _handler;
private string _ruleName = String.Empty;
private RuleArgs _args;
private int _priority;
///
/// Returns the name of the method implementing the rule
/// and the property, field or column name to which the
/// rule applies.
///
public override string ToString()
{
return _ruleName;
}
///
/// Gets the priority of the rule method.
///
/// The priority value
///
/// Priorities are processed in descending
/// order, so priority 0 is processed
/// before priority 1, etc.
///
public int Priority
{
get { return _priority; }
}
///
/// Gets the name of the rule.
///
///
/// The rule's name must be unique and is used
/// to identify a broken rule in the BrokenRules
/// collection.
///
public string RuleName
{
get { return _ruleName; }
}
///
/// Returns the name of the field, property or column
/// to which the rule applies.
///
public RuleArgs RuleArgs
{
get { return _args; }
}
///
/// Creates and initializes the rule.
///
/// The address of the method implementing the rule.
/// A RuleArgs object.
public RuleMethod(RuleHandler handler, RuleArgs args)
{
_handler = handler;
_args = args;
_ruleName = string.Format(@"rule://{0}/{1}", _handler.Method.Name, _args.ToString());
}
///
/// Creates and initializes the rule.
///
/// The address of the method implementing the rule.
/// A RuleArgs object.
///
/// Priority for processing the rule (smaller numbers have higher priority, default=0).
///
public RuleMethod(RuleHandler handler, RuleArgs args, int priority)
: this(handler, args)
{
_priority = priority;
}
///
/// Invokes the rule to validate the data.
///
///
/// if the data is valid,
/// if the data is invalid.
///
public bool Invoke(object target)
{
return _handler.Invoke(target, _args);
}
#region IComparable
int IComparable.CompareTo(object obj)
{
return Priority.CompareTo(((IRuleMethod)obj).Priority);
}
int IComparable.CompareTo(IRuleMethod other)
{
return Priority.CompareTo(other.Priority);
}
#endregion
}
///
/// Tracks all information for a rule.
///
/// Type of the target object.
/// Type of the arguments parameter.
internal class RuleMethod
: IRuleMethod, IComparable, IComparable
where R : RuleArgs
{
private RuleHandler _handler;
private string _ruleName = string.Empty;
private R _args;
private int _priority;
///
/// Returns the name of the method implementing the rule
/// and the property, field or column name to which the
/// rule applies.
///
public override string ToString()
{
return _ruleName;
}
///
/// Gets the priority of the rule method.
///
/// The priority value
///
/// Priorities are processed in descending
/// order, so priority 0 is processed
/// before priority 1, etc.
///
public int Priority
{
get { return _priority; }
}
///
/// Gets the name of the rule.
///
///
/// The rule's name must be unique and is used
/// to identify a broken rule in the BrokenRules
/// collection.
///
public string RuleName
{
get {return _ruleName;}
}
///
/// Returns the name of the field, property or column
/// to which the rule applies.
///
RuleArgs IRuleMethod.RuleArgs
{
get {return this.RuleArgs;}
}
///
/// Returns the name of the field, property or column
/// to which the rule applies.
///
public R RuleArgs
{
get { return _args; }
}
///
/// Creates and initializes the rule.
///
/// The address of the method implementing the rule.
/// A RuleArgs object.
public RuleMethod(RuleHandler handler, R args)
{
_handler = handler;
_args = args;
_ruleName = string.Format(@"rule://{0}/{1}", _handler.Method.Name, _args.ToString());
}
///
/// Creates and initializes the rule.
///
/// The address of the method implementing the rule.
/// A RuleArgs object.
///
/// Priority for processing the rule (smaller numbers have higher priority, default=0).
///
public RuleMethod(RuleHandler handler, R args, int priority)
: this(handler, args)
{
_priority = priority;
}
///
/// Invokes the rule to validate the data.
///
/// True if the data is valid, False if the data is invalid.
bool IRuleMethod.Invoke(object target)
{
return this.Invoke((T)target);
}
///
/// Invokes the rule to validate the data.
///
///
/// if the data is valid,
/// if the data is invalid.
///
public bool Invoke(T target)
{
return _handler.Invoke(target, _args);
}
#region IComparable
int IComparable.CompareTo(object obj)
{
return Priority.CompareTo(((IRuleMethod)obj).Priority);
}
int IComparable.CompareTo(IRuleMethod other)
{
return Priority.CompareTo(other.Priority);
}
#endregion
}
}