diff options
author | Jim Hahn <jrh3@att.com> | 2021-01-06 11:15:45 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2021-01-06 13:04:34 -0500 |
commit | 8208cc4b1d8855eee3fe59c7a832abccb2a67ed7 (patch) | |
tree | 13676da07d974013935ed2980f7b08a7917bf0c3 /common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java | |
parent | f9add40e0d87baff4ed56529bc61c31a577dc93d (diff) |
Support annotations on parameterized types
It appears that java.validation allows validation annotations to be used
on the type parameters of Collection and Map classes. Updated the
validation code to support that. Once policy-models has been updated to
use this approach, the original @Items and @Entries annotations will be
deprecated.
Issue-ID: POLICY-2648
Change-Id: Ic953be485ebafc9869f72407518f6549585353c9
Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java')
-rw-r--r-- | common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java b/common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java index 249185c7..58f3e833 100644 --- a/common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java +++ b/common-parameters/src/main/java/org/onap/policy/common/parameters/FieldValidator.java @@ -21,10 +21,14 @@ package org.onap.policy.common.parameters; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedParameterizedType; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Collection; +import java.util.Map; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -76,6 +80,8 @@ public class FieldValidator extends ValueValidator { } validator.addValidators(this); + addListValidator(validator); + addMapValidator(validator); if (checkers.isEmpty()) { // has no annotations - nothing to check @@ -105,6 +111,65 @@ public class FieldValidator extends ValueValidator { } /** + * Adds validators for the individual items within a collection, if the field is a + * collection. + * + * @param validator provider of validation methods + */ + private void addListValidator(BeanValidator validator) { + if (!Collection.class.isAssignableFrom(field.getType())) { + return; + } + + AnnotatedType tannot = field.getAnnotatedType(); + if (!(tannot instanceof AnnotatedParameterizedType)) { + return; + } + + AnnotatedType[] targs = ((AnnotatedParameterizedType) tannot).getAnnotatedActualTypeArguments(); + if (targs.length != 1) { + return; + } + + Item2Validator itemValidator = new Item2Validator(validator, targs[0]); + if (itemValidator.isEmpty()) { + return; + } + + checkers.add((result, fieldName, value) -> validator.verCollection(result, fieldName, itemValidator, value)); + } + + /** + * Adds validators for the individual entries within a map, if the field is a map. + * + * @param validator provider of validation methods + */ + private void addMapValidator(BeanValidator validator) { + if (!Map.class.isAssignableFrom(field.getType())) { + return; + } + + AnnotatedType tannot = field.getAnnotatedType(); + if (!(tannot instanceof AnnotatedParameterizedType)) { + return; + } + + AnnotatedType[] targs = ((AnnotatedParameterizedType) tannot).getAnnotatedActualTypeArguments(); + if (targs.length != 2) { + return; + } + + Item2Validator keyValidator = new Item2Validator(validator, targs[0]); + Item2Validator valueValidator = new Item2Validator(validator, targs[1]); + if (keyValidator.isEmpty() && valueValidator.isEmpty()) { + return; + } + + checkers.add((result, fieldName, value) -> validator.verMap(result, fieldName, keyValidator, valueValidator, + value)); + } + + /** * Performs validation of a single field. * * @param result validation results are added here |