WW-4578 Converts required string validator to support collections
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/df5583f1 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/df5583f1 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/df5583f1 Branch: refs/heads/master Commit: df5583f11789fe2f5084d7fec780f99fa8d22b23 Parents: 01a56ca Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Tue Apr 11 08:46:24 2017 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Tue Apr 11 08:46:24 2017 +0200 ---------------------------------------------------------------------- .../validators/FieldValidatorSupport.java | 6 +-- .../validators/RequiredStringValidator.java | 42 +++++++++++++---- .../validators/RequiredStringValidatorTest.java | 48 ++++++++++++++++++++ .../validator/validators/ValidationAction.java | 20 ++++++++ 4 files changed, 105 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/df5583f1/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java index ec75e13..07938c9 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java @@ -25,9 +25,9 @@ import com.opensymphony.xwork2.validator.FieldValidator; */ public abstract class FieldValidatorSupport extends ValidatorSupport implements FieldValidator { - private String fieldName; - private String type; - private Object currentValue; + protected String fieldName; + protected String type; + protected Object currentValue; public void setFieldName(String fieldName) { this.fieldName = fieldName; http://git-wip-us.apache.org/repos/asf/struts/blob/df5583f1/core/src/main/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidator.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidator.java index af2d807..433fd60 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidator.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidator.java @@ -17,6 +17,7 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.validator.ValidationException; +import java.util.Collection; /** * <!-- START SNIPPET: javadoc --> @@ -85,21 +86,46 @@ public class RequiredStringValidator extends FieldValidatorSupport { } public void validate(Object object) throws ValidationException { - String fieldName = getFieldName(); - Object value = this.getFieldValue(fieldName, object); + Object fieldValue = this.getFieldValue(getFieldName(), object); - if (!(value instanceof String)) { - addFieldError(fieldName, object); + if (fieldValue == null) { + addFieldError(getFieldName(), object); + return; + } + + if (fieldValue.getClass().isArray()) { + Object[] values = (Object[]) fieldValue; + for (Object value : values) { + validateValue(object, value); + } + } else if (Collection.class.isAssignableFrom(fieldValue.getClass())) { + Collection values = (Collection) fieldValue; + for (Object value : values) { + validateValue(object, value); + } } else { - String s = (String) value; + validateValue(object, fieldValue); + } + } + + protected void validateValue(Object object, Object fieldValue) { + if (fieldValue == null) { + addFieldError(getFieldName(), object); + return; + } + + if (fieldValue instanceof String) { + String stingValue = (String) fieldValue; if (trim) { - s = s.trim(); + stingValue = stingValue.trim(); } - if (s.length() == 0) { - addFieldError(fieldName, object); + if (stingValue.length() == 0) { + addFieldError(getFieldName(), object); } + } else { + addFieldError(getFieldName(), object); } } http://git-wip-us.apache.org/repos/asf/struts/blob/df5583f1/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java index 8d4d919..9781bc1 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java @@ -8,6 +8,8 @@ import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; +import java.util.Arrays; + public class RequiredStringValidatorTest extends XWorkTestCase { private TextProviderFactory tpf; @@ -38,6 +40,52 @@ public class RequiredStringValidatorTest extends XWorkTestCase { assertTrue(context.getFieldErrors().size() == 0); } + public void testRequiredArrayOfStringsPass() throws Exception { + // given + ValueStack valueStack = ActionContext.getContext().getValueStack(); + + ValidationAction action = new ValidationAction(); + action.setStrings(new String[]{"", "12334", null}); + valueStack.push(action); + + ValidatorContext context = new DummyValidatorContext(action, tpf); + RequiredStringValidator validator = new RequiredStringValidator(); + validator.setValidatorContext(context); + validator.setFieldName("strings"); + validator.setValueStack(valueStack); + + // when + validator.validate(action); + + // then + assertTrue(context.hasFieldErrors()); + assertEquals(1, context.getFieldErrors().size()); + assertEquals(2, context.getFieldErrors().get("strings").size()); + } + + public void testRequiredCollectionOfStringsPass() throws Exception { + // given + ValueStack valueStack = ActionContext.getContext().getValueStack(); + + ValidationAction action = new ValidationAction(); + action.setStringCollection(Arrays.asList("", "123456", null)); + valueStack.push(action); + + ValidatorContext context = new DummyValidatorContext(action, tpf); + RequiredStringValidator validator = new RequiredStringValidator(); + validator.setValidatorContext(context); + validator.setFieldName("stringCollection"); + validator.setValueStack(valueStack); + + // when + validator.validate(action); + + // then + assertTrue(context.hasFieldErrors()); + assertEquals(1, context.getFieldErrors().size()); + assertEquals(2, context.getFieldErrors().get("stringCollection").size()); + } + public void testRequiredStringFails() throws Exception { // given ValueStack valueStack = ActionContext.getContext().getValueStack(); http://git-wip-us.apache.org/repos/asf/struts/blob/df5583f1/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java index a97cea6..ac7f56c 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java @@ -1,5 +1,6 @@ package com.opensymphony.xwork2.validator.validators; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -22,8 +23,11 @@ public class ValidationAction { private Date dateRange; private Date dateMinValue; private Date dateMaxValue; + private String dateFormat; private String stringValue; + private String[] strings; + private Collection<String> stringCollection; public Integer getIntRange() { return intRange; @@ -152,4 +156,20 @@ public class ValidationAction { public void setShorts(List<Short> shorts) { this.shorts = shorts; } + + public String[] getStrings() { + return strings; + } + + public void setStrings(String[] strings) { + this.strings = strings; + } + + public Collection<String> getStringCollection() { + return stringCollection; + } + + public void setStringCollection(Collection<String> stringCollection) { + this.stringCollection = stringCollection; + } }