492 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using Csla.Properties;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace Csla.Validation
 | |
| {
 | |
|   /// <summary>
 | |
|   /// Implements common business rules.
 | |
|   /// </summary>
 | |
|   public static class CommonRules
 | |
|   {
 | |
| 
 | |
|     #region StringRequired
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring a string value contains one or more
 | |
|     /// characters.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object containing the data to validate</param>
 | |
|     /// <param name="e">Arguments parameter specifying the name of the string
 | |
|     /// property to validate</param>
 | |
|     /// <returns><see langword="false" /> if the rule is broken</returns>
 | |
|     /// <remarks>
 | |
|     /// This implementation uses late binding, and will only work
 | |
|     /// against string property values.
 | |
|     /// </remarks>
 | |
|     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
 | |
|     public static bool StringRequired(object target, RuleArgs e)
 | |
|     {
 | |
|       string value = (string)Utilities.CallByName(
 | |
|         target, e.PropertyName, CallType.Get);
 | |
|       if (string.IsNullOrEmpty(value))
 | |
|       {
 | |
|         e.Description = string.Format(Resources.StringRequiredRule, e.PropertyName);
 | |
|         return false;
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region StringMaxLength
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring a string value doesn't exceed
 | |
|     /// a specified length.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object containing the data to validate</param>
 | |
|     /// <param name="e">Arguments parameter specifying the name of the string
 | |
|     /// property to validate</param>
 | |
|     /// <returns><see langword="false" /> if the rule is broken</returns>
 | |
|     /// <remarks>
 | |
|     /// This implementation uses late binding, and will only work
 | |
|     /// against string property values.
 | |
|     /// </remarks>
 | |
|     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
 | |
|     public static bool StringMaxLength(
 | |
|       object target, RuleArgs e)
 | |
|     {
 | |
|       int max = ((MaxLengthRuleArgs)e).MaxLength;
 | |
|       string value = (string)Utilities.CallByName(
 | |
|         target, e.PropertyName, CallType.Get);
 | |
|       if (!String.IsNullOrEmpty(value) && (value.Length > max))
 | |
|       {
 | |
|         e.Description = String.Format(
 | |
|           Resources.StringMaxLengthRule,
 | |
|           e.PropertyName, max.ToString());
 | |
|         return false;
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="StringMaxLength" /> rule method.
 | |
|     /// </summary>
 | |
|     public class MaxLengthRuleArgs : RuleArgs
 | |
|     {
 | |
|       private int _maxLength;
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Get the max length for the string.
 | |
|       /// </summary>
 | |
|       public int MaxLength
 | |
|       {
 | |
|         get { return _maxLength; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Create a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property to validate.</param>
 | |
|       /// <param name="maxLength">Max length of characters allowed.</param>
 | |
|       public MaxLengthRuleArgs(
 | |
|         string propertyName, int maxLength)
 | |
|         : base(propertyName)
 | |
|       {
 | |
|         _maxLength = maxLength;
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Return a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?maxLength=" + _maxLength.ToString();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region IntegerMaxValue
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring an integer value doesn't exceed
 | |
|     /// a specified value.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object containing the data to validate.</param>
 | |
|     /// <param name="e">Arguments parameter specifying the name of the
 | |
|     /// property to validate.</param>
 | |
|     /// <returns><see langword="false"/> if the rule is broken.</returns>
 | |
|     public static bool IntegerMaxValue(object target, RuleArgs e)
 | |
|     {
 | |
|       int max = ((IntegerMaxValueRuleArgs)e).MaxValue;
 | |
|       int value = (int)Utilities.CallByName(target, e.PropertyName, CallType.Get);
 | |
|       if (value > max)
 | |
|       {
 | |
|         e.Description = String.Format(Resources.MaxValueRule,
 | |
|           e.PropertyName, max.ToString());
 | |
|         return false;
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="IntegerMaxValue" /> rule method.
 | |
|     /// </summary>
 | |
|     public class IntegerMaxValueRuleArgs : RuleArgs
 | |
|     {
 | |
|       private int _maxValue;
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Get the max value for the property.
 | |
|       /// </summary>
 | |
|       public int MaxValue
 | |
|       {
 | |
|         get { return _maxValue; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Create a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property.</param>
 | |
|       /// <param name="maxValue">Maximum allowed value for the property.</param>
 | |
|       public IntegerMaxValueRuleArgs(string propertyName, int maxValue)
 | |
|         : base(propertyName)
 | |
|       {
 | |
|         _maxValue = maxValue;
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Return a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?maxValue=" + _maxValue.ToString();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region IntegerMinValue
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring an integer value doesn't go below
 | |
|     /// a specified value.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object containing the data to validate.</param>
 | |
|     /// <param name="e">Arguments parameter specifying the name of the
 | |
|     /// property to validate.</param>
 | |
|     /// <returns><see langword="false"/> if the rule is broken.</returns>
 | |
|     public static bool IntegerMinValue(object target, RuleArgs e)
 | |
|     {
 | |
|       int min = ((IntegerMinValueRuleArgs)e).MinValue;
 | |
|       int value = (int)Utilities.CallByName(target, e.PropertyName, CallType.Get);
 | |
|       if (value < min)
 | |
|       {
 | |
|         e.Description = String.Format(Resources.MinValueRule,
 | |
|           e.PropertyName, min.ToString());
 | |
|         return false;
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="IntegerMinValue" /> rule method.
 | |
|     /// </summary>
 | |
|     public class IntegerMinValueRuleArgs : RuleArgs
 | |
|     {
 | |
|       private int _minValue;
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Get the min value for the property.
 | |
|       /// </summary>
 | |
|       public int MinValue
 | |
|       {
 | |
|         get { return _minValue; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Create a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property.</param>
 | |
|       /// <param name="minValue">Minimum allowed value for the property.</param>
 | |
|       public IntegerMinValueRuleArgs(string propertyName, int minValue)
 | |
|         : base(propertyName)
 | |
|       {
 | |
|         _minValue = minValue;
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Return a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?minValue=" + _minValue.ToString();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region MaxValue
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring that a numeric value
 | |
|     /// doesn't exceed a specified maximum.
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T">Type of the property to validate.</typeparam>
 | |
|     /// <param name="target">Object containing value to validate.</param>
 | |
|     /// <param name="e">Arguments variable specifying the
 | |
|     /// name of the property to validate, along with the max
 | |
|     /// allowed value.</param>
 | |
|     public static bool MaxValue<T>(object target, RuleArgs e) where T : IComparable
 | |
|     {
 | |
|       PropertyInfo pi = target.GetType().GetProperty(e.PropertyName);
 | |
|       T value = (T)pi.GetValue(target, null);
 | |
|       T max = ((MaxValueRuleArgs<T>)e).MaxValue;
 | |
| 
 | |
|       int result = value.CompareTo(max);
 | |
|       if (result >= 1)
 | |
|       {
 | |
|         e.Description = string.Format(Resources.MaxValueRule,
 | |
|           e.PropertyName, max.ToString());
 | |
|         return false;
 | |
|       }
 | |
|       else
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="MaxValue" /> rule method.
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T">Type of the property to validate.</typeparam>
 | |
|     public class MaxValueRuleArgs<T> : RuleArgs
 | |
|     {
 | |
|       T _maxValue = default(T);
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Get the max value for the property.
 | |
|       /// </summary>
 | |
|       public T MaxValue
 | |
|       {
 | |
|         get { return _maxValue; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Create a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property.</param>
 | |
|       /// <param name="maxValue">Maximum allowed value for the property.</param>
 | |
|       public MaxValueRuleArgs(string propertyName, T maxValue)
 | |
|         : base(propertyName)
 | |
|       {
 | |
|         _maxValue = maxValue;
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Returns a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?maxValue=" + _maxValue.ToString();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region MinValue
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule ensuring that a numeric value
 | |
|     /// doesn't exceed a specified minimum.
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T">Type of the property to validate.</typeparam>
 | |
|     /// <param name="target">Object containing value to validate.</param>
 | |
|     /// <param name="e">Arguments variable specifying the
 | |
|     /// name of the property to validate, along with the min
 | |
|     /// allowed value.</param>
 | |
|     public static bool MinValue<T>(object target, RuleArgs e) where T : IComparable
 | |
|     {
 | |
|       PropertyInfo pi = target.GetType().GetProperty(e.PropertyName);
 | |
|       T value = (T)pi.GetValue(target, null);
 | |
|       T min = ((MinValueRuleArgs<T>)e).MinValue;
 | |
| 
 | |
|       int result = value.CompareTo(min);
 | |
|       if (result <= -1)
 | |
|       {
 | |
|         e.Description = string.Format(Resources.MinValueRule,
 | |
|           e.PropertyName, min.ToString());
 | |
|         return false;
 | |
|       }
 | |
|       else
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="MinValue" /> rule method.
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T">Type of the property to validate.</typeparam>
 | |
|     public class MinValueRuleArgs<T> : RuleArgs
 | |
|     {
 | |
|       T _minValue = default(T);
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Get the min value for the property.
 | |
|       /// </summary>
 | |
|       public T MinValue
 | |
|       {
 | |
|         get { return _minValue; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Create a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property.</param>
 | |
|       /// <param name="minValue">Minimum allowed value for the property.</param>
 | |
|       public MinValueRuleArgs(string propertyName, T minValue)
 | |
|         : base(propertyName)
 | |
|       {
 | |
|         _minValue = minValue;
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Returns a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?minValue=" + _minValue.ToString();
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region RegEx
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Rule that checks to make sure a value
 | |
|     /// matches a given regex pattern.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object containing the data to validate</param>
 | |
|     /// <param name="e">RegExRuleArgs parameter specifying the name of the 
 | |
|     /// property to validate and the regex pattern.</param>
 | |
|     /// <returns>False if the rule is broken</returns>
 | |
|     /// <remarks>
 | |
|     /// This implementation uses late binding.
 | |
|     /// </remarks>
 | |
|     public static bool RegExMatch(object target, RuleArgs e)
 | |
|     {
 | |
|       Regex rx = ((RegExRuleArgs)e).RegEx;
 | |
|       if (!rx.IsMatch(Utilities.CallByName(target, e.PropertyName, CallType.Get).ToString()))
 | |
|       {
 | |
|         e.Description = String.Format(Resources.RegExMatchRule, e.PropertyName);
 | |
|         return false;
 | |
|       }
 | |
|       else
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// List of built-in regex patterns.
 | |
|     /// </summary>
 | |
|     public enum RegExPatterns
 | |
|     {
 | |
|       /// <summary>
 | |
|       /// US Social Security number pattern.
 | |
|       /// </summary>
 | |
|       SSN,
 | |
|       /// <summary>
 | |
|       /// Email address pattern.
 | |
|       /// </summary>
 | |
|       Email
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Custom <see cref="RuleArgs" /> object required by the
 | |
|     /// <see cref="RegExMatch" /> rule method.
 | |
|     /// </summary>
 | |
|     public class RegExRuleArgs : RuleArgs
 | |
|     {
 | |
|       Regex _regEx;
 | |
| 
 | |
|       /// <summary>
 | |
|       /// The <see cref="RegEx"/> object used to validate
 | |
|       /// the property.
 | |
|       /// </summary>
 | |
|       public Regex RegEx
 | |
|       {
 | |
|         get { return _regEx; }
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Creates a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property to validate.</param>
 | |
|       /// <param name="pattern">Built-in regex pattern to use.</param>
 | |
|       public RegExRuleArgs(string propertyName, RegExPatterns pattern)
 | |
|         :
 | |
|         base(propertyName)
 | |
|       {
 | |
|         _regEx = new Regex(GetPattern(pattern));
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Creates a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property to validate.</param>
 | |
|       /// <param name="pattern">Custom regex pattern to use.</param>
 | |
|       public RegExRuleArgs(string propertyName, string pattern)
 | |
|         :
 | |
|         base(propertyName)
 | |
|       {
 | |
|         _regEx = new Regex(pattern);
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Creates a new object.
 | |
|       /// </summary>
 | |
|       /// <param name="propertyName">Name of the property to validate.</param>
 | |
|       /// <param name="regEx"><see cref="RegEx"/> object to use.</param>
 | |
|       public RegExRuleArgs(string propertyName, System.Text.RegularExpressions.Regex regEx)
 | |
|         :
 | |
|         base(propertyName)
 | |
|       {
 | |
|         _regEx = regEx;
 | |
|       }
 | |
| 
 | |
|       /// <summary>f
 | |
|       /// Returns a string representation of the object.
 | |
|       /// </summary>
 | |
|       public override string ToString()
 | |
|       {
 | |
|         return base.ToString() + "?regex=" + _regEx.ToString();
 | |
|       }
 | |
| 
 | |
|       /// <summary>
 | |
|       /// Returns the specified built-in regex pattern.
 | |
|       /// </summary>
 | |
|       /// <param name="pattern">Pattern to return.</param>
 | |
|       public static string GetPattern(RegExPatterns pattern)
 | |
|       {
 | |
|         switch (pattern)
 | |
|         {
 | |
|           case RegExPatterns.SSN:
 | |
|             return @"^\d{3}-\d{2}-\d{4}$";
 | |
|           case RegExPatterns.Email:
 | |
|             return @"^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$";
 | |
|           default:
 | |
|             return string.Empty;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|   }
 | |
| }
 |