diff --git a/src/Spring/Spring.Core/Validation/ValidatorGroup.cs b/src/Spring/Spring.Core/Validation/ValidatorGroup.cs
index 8d845e3f..fb763af9 100644
--- a/src/Spring/Spring.Core/Validation/ValidatorGroup.cs
+++ b/src/Spring/Spring.Core/Validation/ValidatorGroup.cs
@@ -44,7 +44,7 @@ namespace Spring.Validation
#region Fields
private IList validators = new ArrayList();
-
+ private bool shortcircuitEvaluate = false;
#endregion
#region Constructors
@@ -83,6 +83,19 @@ namespace Spring.Validation
set { validators = value; }
}
+ ///
+ /// When set true, shortcircuits evaluation.
+ ///
+ ///
+ /// The validators within the group will only be validated
+ /// in order until the first validator fails.
+ ///
+ public bool ShortcircuitEvaluate
+ {
+ get { return shortcircuitEvaluate; }
+ set { shortcircuitEvaluate = value; }
+ }
+
#endregion
///
@@ -101,6 +114,10 @@ namespace Spring.Validation
foreach (IValidator validator in validators)
{
valid = validator.Validate(validationContext, contextParams, errors) && valid;
+ if (shortcircuitEvaluate && !valid)
+ {
+ break;
+ }
}
ProcessActions(valid, validationContext, contextParams, errors);
}
diff --git a/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs b/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs
index f1be5848..d29a68e4 100644
--- a/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs
+++ b/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs
@@ -56,6 +56,25 @@ namespace Spring.Validation
Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
}
+ [Test]
+ public void WhenAllValidatorsReturnFalseFast()
+ {
+ ValidatorGroup vg = new ValidatorGroup();
+ vg.ShortcircuitEvaluate = true;
+ vg.Validators.Add(new FalseValidator());
+ vg.Validators.Add(new FalseValidator());
+ vg.Validators.Add(new FalseValidator());
+
+ IValidationErrors errors = new ValidationErrors();
+ errors.AddError("existingErrors", new ErrorMessage("error", null));
+
+ bool valid = vg.Validate(new object(), errors);
+
+ Assert.IsFalse(valid, "Validation should fail when all inner validators return false.");
+ Assert.AreEqual(1, errors.GetErrors("errors").Count);
+ Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
+ }
+
[Test]
public void WhenAllValidatorsReturnTrue()
{