diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidator.java index 7e93e0857..5e00c055e 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidator.java @@ -68,8 +68,6 @@ package com.opensymphony.xwork2.validator.validators; * * * - * - * * @author Jason Carreira * @version $Date$ $Id$ */ diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidator.java index 36f99b3fb..41b448195 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidator.java @@ -15,7 +15,6 @@ */ package com.opensymphony.xwork2.validator.validators; - /** * * Field Validator that checks if the long specified is within a certain range. @@ -24,69 +23,90 @@ package com.opensymphony.xwork2.validator.validators; * * * + * + * The min / max value can be specified as an expression, but then you must also enable parsing it by specifying parse param + * as in the example below. + * WARNING! Do not use ${min} and ${max} as an expression as this will turn into infinitive loop! + * * * * *
  * 
- *              <validators>
- *           <!-- Plain Validator Syntax -->
- *           <validator type="long">
- *               <param name="fieldName">age</param>
- *               <param name="min">20</param>
- *               <param name="max">50</param>
- *               <message>Age needs to be between ${min} and ${max}</message>
- *           </validator>
- *           
- *           <!-- Field Validator Syntax -->
- *           <field name="age">
- *               <field-validator type="long">
- *                   <param name="min">20</param>
- *                   <param name="max">50</param>
- *                   <message>Age needs to be between ${min} and ${max}</message>
- *               </field-validator>
- *           </field>
- *      </validators>
+ *	<validators>
+ *      <!-- Plain Validator Syntax -->
+ *      <validator type="long">
+ *          <param name="fieldName">age</param>
+ *          <param name="min">20</param>
+ *          <param name="max">50</param>
+ *          <message>Age needs to be between ${min} and ${max}</message>
+ *      </validator>
+ *
+ *      <!-- Field Validator Syntax -->
+ *      <field name="age">
+ *          <field-validator type="long">
+ *              <param name="min">20</param>
+ *              <param name="max">50</param>
+ *              <message>Age needs to be between ${min} and ${max}</message>
+ *          </field-validator>
+ *      </field>
+ *
+ *      <!-- Field Validator Syntax with expression -->
+ *      <field name="age">
+ *          <field-validator type="long">
+ *              <param name="parse">true</param>
+ *              <param name="${minValue}">20</param> <!-- will be evaluated as: Long getMinValue() -->
+ *              <param name="${maxValue}">50</param> <!-- will be evaluated as: Long getMaxValue() -->
+ *              <message>Age needs to be between ${min} and ${max}</message>
+ *          </field-validator>
+ *      </field>
+ * </validators>
  * 
  * 
- * - * - * + * * @version $Date$ */ -public class LongRangeFieldValidator extends AbstractRangeValidator { +public class LongRangeFieldValidator extends AbstractRangeValidator { - Long max = null; - Long min = null; + String max = null; + String min = null; - - public void setMax(Long max) { + public void setMax(String max) { this.max = max; } - public Long getMax() { - return max; + public String getMax() { + return safeConditionalParse(max); } @Override - public Comparable getMaxComparatorValue() { - return max; + public Long getMaxComparatorValue() { + return parseLong(getMax()); } - public void setMin(Long min) { + public void setMin(String min) { this.min = min; } - public Long getMin() { - return min; + public String getMin() { + return safeConditionalParse(min); } @Override - public Comparable getMinComparatorValue() { - return min; + public Long getMinComparatorValue() { + return parseLong(getMin()); } + + private Long parseLong(String value) { + if (value != null) { + return Long.parseLong(value); + } else { + return null; + } + } + } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java new file mode 100644 index 000000000..b5fe2094e --- /dev/null +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java @@ -0,0 +1,74 @@ +package com.opensymphony.xwork2.validator.validators; + +import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; +import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.ValidatorContext; + +public class LongRangeFieldValidatorTest extends XWorkTestCase { + + public void testPassValidation() throws Exception { + // given + ValidationAction action = prepareAction(100); + ValidatorContext context = new GenericValidatorContext(action); + LongRangeFieldValidator validator = prepareValidator(action, context); + + // when + validator.validate(action); + + // then + assertTrue(context.getFieldErrors().size() == 0); + } + + public void testMinValidation() throws Exception { + // given + ValidationAction action = prepareAction(98); + ValidatorContext context = new GenericValidatorContext(action); + LongRangeFieldValidator validator = prepareValidator(action, context); + + // when + validator.validate(action); + + // then + assertTrue(context.getFieldErrors().size() == 1); + assertEquals("Max is 101, min is 99 but value is 98", context.getFieldErrors().get("longRange").get(0)); + } + + public void testMaxValidation() throws Exception { + // given + ValidationAction action = prepareAction(102); + ValidatorContext context = new GenericValidatorContext(action); + LongRangeFieldValidator validator = prepareValidator(action, context); + + // when + validator.validate(action); + + // then + assertTrue(context.getFieldErrors().size() == 1); + assertEquals("Max is 101, min is 99 but value is 102", context.getFieldErrors().get("longRange").get(0)); + } + + private ValidationAction prepareAction(long longRange) { + ValidationAction action = new ValidationAction(); + action.setLongMaxValue(101L); + action.setLongMinValue(99L); + action.setLongRange(longRange); + return action; + } + + private LongRangeFieldValidator prepareValidator(ValidationAction action, ValidatorContext context) { + LongRangeFieldValidator validator = new LongRangeFieldValidator(); + validator.setMax("${longMaxValue}"); + validator.setMin("${longMinValue}"); + ValueStack valueStack = container.getInstance(ValueStackFactory.class).createValueStack(); + valueStack.push(action); + validator.setValueStack(valueStack); + validator.setValidatorContext(context); + validator.setFieldName("longRange"); + validator.setParse(true); + validator.setDefaultMessage("Max is ${longMaxValue}, min is ${longMinValue} but value is ${longRange}"); + return validator; + } + +} diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java index 1999f166e..a8512f9ec 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java @@ -10,6 +10,10 @@ public class ValidationAction { private Short shortMinValue; private Short shortMaxValue; + private Long longRange; + private Long longMinValue; + private Long longMaxValue; + public Integer getIntRange() { return intRange; } @@ -57,4 +61,29 @@ public class ValidationAction { public void setShortMaxValue(Short shortMaxValue) { this.shortMaxValue = shortMaxValue; } + + public Long getLongRange() { + return longRange; + } + + public void setLongRange(Long longRange) { + this.longRange = longRange; + } + + public Long getLongMinValue() { + return longMinValue; + } + + public void setLongMinValue(Long longMinValue) { + this.longMinValue = longMinValue; + } + + public Long getLongMaxValue() { + return longMaxValue; + } + + public void setLongMaxValue(Long longMaxValue) { + this.longMaxValue = longMaxValue; + } + }