From bc3e560ad33966c4abe25925ea1f6d03a234623c Mon Sep 17 00:00:00 2001 From: bbaia Date: Wed, 22 Sep 2010 09:26:05 +0000 Subject: [PATCH] Add 'when' condition to the Reference Validator (SPRNET-1370) --- .../Config/ValidationNamespaceParser.cs | 5 ++ .../Config/spring-validation-1.3.xsd | 5 ++ .../Validation/ValidatorReference.cs | 57 ++++++++++++++++--- .../Validation/ValidatorReferenceTests.cs | 25 +++++++- 4 files changed, 81 insertions(+), 11 deletions(-) diff --git a/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs b/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs index dc2984dc..bc0ca37b 100644 --- a/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs +++ b/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs @@ -341,6 +341,7 @@ namespace Spring.Validation.Config string typeName = "Spring.Validation.ValidatorReference, Spring.Core"; string name = GetAttributeValue(element, ValidatorDefinitionConstants.ReferenceNameAttribute); string context = GetAttributeValue(element, ValidatorDefinitionConstants.ReferenceContextAttribute); + string when = GetAttributeValue(element, ValidatorDefinitionConstants.WhenAttribute); MutablePropertyValues properties = new MutablePropertyValues(); properties.Add("Name", name); @@ -348,6 +349,10 @@ namespace Spring.Validation.Config { properties.Add("Context", context); } + if (StringUtils.HasText(when)) + { + properties.Add("When", when); + } IConfigurableObjectDefinition reference = parserContext.ReaderContext.ObjectDefinitionFactory.CreateObjectDefinition(typeName, null, parserContext.ReaderContext.Reader.Domain); diff --git a/src/Spring/Spring.Core/Validation/Config/spring-validation-1.3.xsd b/src/Spring/Spring.Core/Validation/Config/spring-validation-1.3.xsd index e646969b..82dec005 100644 --- a/src/Spring/Spring.Core/Validation/Config/spring-validation-1.3.xsd +++ b/src/Spring/Spring.Core/Validation/Config/spring-validation-1.3.xsd @@ -107,6 +107,11 @@ + + + + + diff --git a/src/Spring/Spring.Core/Validation/ValidatorReference.cs b/src/Spring/Spring.Core/Validation/ValidatorReference.cs index b32d6f80..2924066e 100644 --- a/src/Spring/Spring.Core/Validation/ValidatorReference.cs +++ b/src/Spring/Spring.Core/Validation/ValidatorReference.cs @@ -22,6 +22,7 @@ using System.Collections; using Spring.Expressions; using Spring.Objects.Factory; +using System; namespace Spring.Validation { @@ -47,6 +48,7 @@ namespace Spring.Validation private string name; private IExpression context; + private IExpression when; private IValidator validator; #endregion @@ -54,11 +56,32 @@ namespace Spring.Validation #region Constructors /// - /// Initializes a new instance of the class. + /// Creates a new instance of the class. /// public ValidatorReference() {} + /// + /// Creates a new instance of the class. + /// + /// + /// The expression that determines if this validator should be evaluated. + /// + public ValidatorReference(string when) + : this((when != null ? Expression.Parse(when) : null)) + {} + + /// + /// Creates a new instance of the class. + /// + /// + /// The expression that determines if this validator should be evaluated. + /// + public ValidatorReference(IExpression when) + { + this.when = when; + } + #endregion #region Properties @@ -83,6 +106,16 @@ namespace Spring.Validation set { context = value; } } + /// + /// Gets or sets the expression that determines if this validator should be evaluated. + /// + /// The expression that determines if this validator should be evaluated. + public IExpression When + { + get { return when; } + set { when = value; } + } + #endregion /// @@ -105,17 +138,23 @@ namespace Spring.Validation /// True if validation was successful, False otherwise. public bool Validate(object validationContext, IDictionary contextParams, IValidationErrors errors) { - if (Context != null) + bool valid = true; + + if (When == null || + Convert.ToBoolean(When.GetValue(validationContext, contextParams))) { - validationContext = Context.GetValue(validationContext, contextParams); + if (Context != null) + { + validationContext = Context.GetValue(validationContext, contextParams); + } + if (validator == null) + { + validator = (IValidator)objectFactory.GetObject(Name); + } + valid = validator.Validate(validationContext, contextParams, errors); } - if (validator == null) - { - validator = (IValidator) objectFactory.GetObject(Name); - } - - return validator.Validate(validationContext, contextParams, errors); + return valid; } /// diff --git a/test/Spring/Spring.Core.Tests/Validation/ValidatorReferenceTests.cs b/test/Spring/Spring.Core.Tests/Validation/ValidatorReferenceTests.cs index 8e29f440..dc1c8b97 100644 --- a/test/Spring/Spring.Core.Tests/Validation/ValidatorReferenceTests.cs +++ b/test/Spring/Spring.Core.Tests/Validation/ValidatorReferenceTests.cs @@ -40,7 +40,7 @@ namespace Spring.Validation StaticListableObjectFactory factory = new StaticListableObjectFactory(); factory.AddObject("validator", new TrueValidator()); - ValidatorReference v = new ValidatorReference(); + ValidatorReference v = new ValidatorReference("true"); v.ObjectFactory = factory; v.Name = "validator"; @@ -65,6 +65,21 @@ namespace Spring.Validation Assert.IsFalse(v.Validate(null, errors)); } + [Test] + public void FalseValidatorReferenceNotEvaluatedBecauseWhenExpressionReturnsFalse() + { + StaticListableObjectFactory factory = new StaticListableObjectFactory(); + factory.AddObject("validator", new FalseValidator()); + + ValidatorReference v = new ValidatorReference("false"); + v.ObjectFactory = factory; + v.Name = "validator"; + + IValidationErrors errors = new ValidationErrors(); + Assert.IsTrue(v.Validate(null, null, errors)); + Assert.IsTrue(v.Validate(null, errors)); + } + [Test] public void ContextNarrowing() { @@ -93,7 +108,13 @@ namespace Spring.Validation Assert.IsTrue(v2.Validate(context, null, errors)); Assert.IsTrue(v2.Validate(context, errors)); - } + ValidatorReference v3 = new ValidatorReference("false"); + v3.ObjectFactory = factory; + v3.Name = "cv2"; + v3.Context = Expression.Parse("DOB"); + + Assert.IsTrue(v3.Validate(null, errors)); + } } } \ No newline at end of file