SPRNET-1122

-change behavior of RegularExpressionValidator.Validate(...) method to depend almost entirely on the regex match in re: its boolean return
This commit is contained in:
sbohlen
2010-08-02 19:30:38 +00:00
parent a516731cb7
commit dfd305a58d
2 changed files with 158 additions and 139 deletions

View File

@@ -1,139 +1,149 @@
#region License #region License
/* /*
* Copyright <20> 2002-2005 the original author or authors. * Copyright <20> 2002-2005 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#endregion #endregion
#region Imports #region Imports
using System; using System;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Spring.Expressions; using Spring.Expressions;
using Spring.Util; using Spring.Util;
#endregion #endregion
namespace Spring.Validation namespace Spring.Validation
{ {
/// <summary> /// <summary>
/// Validates that object matches specified regular expression. /// Validates that object matches specified regular expression.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <p> /// <p>
/// The test expression must evaluate to a <see cref="System.String"/>; /// The test expression must evaluate to a <see cref="System.String"/>;
/// otherwise, an exception is thrown. /// otherwise, an exception is thrown.
/// </p> /// </p>
/// </remarks> /// </remarks>
/// <author>Aleksandar Seovic</author> /// <author>Aleksandar Seovic</author>
public class RegularExpressionValidator : BaseSimpleValidator public class RegularExpressionValidator : BaseSimpleValidator
{ {
#region Fields #region Fields
private string expression = string.Empty; private string expression = string.Empty;
private RegexOptions options; private RegexOptions options;
#endregion #endregion
#region Constructors #region Constructors
/// <summary> /// <summary>
/// Creates a new instance of the <see cref="RegularExpressionValidator"/> class. /// Creates a new instance of the <see cref="RegularExpressionValidator"/> class.
/// </summary> /// </summary>
public RegularExpressionValidator() public RegularExpressionValidator()
{ {
} }
/// <summary> /// <summary>
/// Creates a new instance of the <see cref="RegularExpressionValidator"/> class. /// Creates a new instance of the <see cref="RegularExpressionValidator"/> class.
/// </summary> /// </summary>
/// <param name="test">The expression to validate.</param> /// <param name="test">The expression to validate.</param>
/// <param name="when">The expression that determines if this validator should be evaluated.</param> /// <param name="when">The expression that determines if this validator should be evaluated.</param>
/// <param name="expression">The regular expression to match against.</param> /// <param name="expression">The regular expression to match against.</param>
public RegularExpressionValidator(string test, string when, string expression) : base(test, when) public RegularExpressionValidator(string test, string when, string expression)
{ : base(test, when)
AssertUtils.ArgumentHasText(test, "test"); {
this.expression = expression; AssertUtils.ArgumentHasText(test, "test");
} this.expression = expression;
}
/// <summary>
/// Creates a new instance of the <see cref="RegularExpressionValidator"/> class. /// <summary>
/// </summary> /// Creates a new instance of the <see cref="RegularExpressionValidator"/> class.
/// <param name="test">The expression to validate.</param> /// </summary>
/// <param name="when">The expression that determines if this validator should be evaluated.</param> /// <param name="test">The expression to validate.</param>
/// <param name="expression">The regular expression to match against.</param> /// <param name="when">The expression that determines if this validator should be evaluated.</param>
public RegularExpressionValidator(IExpression test, IExpression when, string expression) : base(test, when) /// <param name="expression">The regular expression to match against.</param>
{ public RegularExpressionValidator(IExpression test, IExpression when, string expression)
AssertUtils.ArgumentNotNull(test, "test"); : base(test, when)
this.expression = expression; {
} AssertUtils.ArgumentNotNull(test, "test");
this.expression = expression;
#endregion }
#region Properties #endregion
/// <summary> #region Properties
/// The regular expression <b>text</b> to match against.
/// </summary> /// <summary>
/// <value>The regular expression <b>text</b>.</value> /// The regular expression <b>text</b> to match against.
public string Expression /// </summary>
{ /// <value>The regular expression <b>text</b>.</value>
get { return expression; } public string Expression
set { expression = value; } {
} get { return expression; }
set { expression = value; }
/// <summary> }
/// The <see cref="RegexOptions"/> for the regular expression evaluation.
/// </summary> /// <summary>
/// <value>The regular expression evaluation options.</value> /// The <see cref="RegexOptions"/> for the regular expression evaluation.
/// <seealso cref="RegexOptions"/> /// </summary>
public RegexOptions Options /// <value>The regular expression evaluation options.</value>
{ /// <seealso cref="RegexOptions"/>
get { return options; } public RegexOptions Options
set { options = value; } {
} get { return options; }
set { options = value; }
#endregion }
/// <summary> #endregion
/// Validates an object.
/// </summary> /// <summary>
/// <param name="objectToValidate">Object to validate.</param> /// Validates an object.
/// <returns> /// </summary>
/// <see lang="true"/> if the supplied <paramref name="objectToValidate"/> /// <param name="objectToValidate">Object to validate.</param>
/// object is valid. /// <returns>
/// </returns> /// <see lang="true"/> if the supplied <paramref name="objectToValidate"/>
/// <exception cref="System.ArgumentException"> /// object is valid.
/// If the supplied <paramref name="objectToValidate"/> is not a /// </returns>
/// <see cref="System.String"/> /// <exception cref="System.ArgumentException">
/// </exception> /// If the supplied <paramref name="objectToValidate"/> is not a
protected override bool Validate(object objectToValidate) /// <see cref="System.String"/>
{ /// </exception>
string text = objectToValidate as string; protected override bool Validate(object objectToValidate)
if (text == null) {
{ string text = objectToValidate as string;
throw new ArgumentException("Test for RegularExpressionValidator must evaluate to a string.");
} if (text == null)
if (!StringUtils.HasLength(text)) {
{ throw new ArgumentException("Test for RegularExpressionValidator must evaluate to a string.");
return true; }
}
Match match = Regex.Match(text, this.Expression, this.Options); if (!StringUtils.HasLength(text))
return match.Success && match.Index == 0 && match.Length == text.Length; {
} return true;
} }
if (!StringUtils.HasLength(text.Trim()) && !StringUtils.HasLength(expression))
{
return false;
}
Match match = Regex.Match(text, this.Expression, this.Options);
return match.Success;
}
}
} }

View File

@@ -79,7 +79,7 @@ namespace Spring.Validation.Validators
[Test] [Test]
public void CaseSensitiveStringMatching() public void CaseSensitiveStringMatching()
{ {
RegularExpressionValidator validator = new RegularExpressionValidator("ToString()", "true", @"[A-Z][a-z]*"); RegularExpressionValidator validator = new RegularExpressionValidator("ToString()", "true", @"^[A-Z]([a-z]{1})");
Assert.IsTrue(validator.Validate("Aleksandar", new ValidationErrors())); Assert.IsTrue(validator.Validate("Aleksandar", new ValidationErrors()));
Assert.IsFalse(validator.Validate("ALEKSANDAR", new ValidationErrors())); Assert.IsFalse(validator.Validate("ALEKSANDAR", new ValidationErrors()));
Assert.IsFalse(validator.Validate("aleksandar", new ValidationErrors())); Assert.IsFalse(validator.Validate("aleksandar", new ValidationErrors()));
@@ -118,5 +118,14 @@ namespace Spring.Validation.Validators
Assert.IsTrue(valid, "Validation should succeed when regex validator is not evaluated."); Assert.IsTrue(valid, "Validation should succeed when regex validator is not evaluated.");
} }
[Test]
public void Test()
{
RegularExpressionValidator validator = new RegularExpressionValidator();
validator.Expression = "^[A-Za-z]";
Assert.True(validator.Validate("hello", new ValidationErrors()));
}
} }
} }