Repository: bval Updated Branches: refs/heads/bv2 b10dc6833 -> 51b9ab27b
pass email validation TCK tests by factoring out AbstractPatternValidator to validate @Email's additional regexp constraint Project: http://git-wip-us.apache.org/repos/asf/bval/repo Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/617fb7c7 Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/617fb7c7 Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/617fb7c7 Branch: refs/heads/bv2 Commit: 617fb7c7535781522b92268166a195653f75502f Parents: b10dc68 Author: Matt Benson <[email protected]> Authored: Fri Mar 9 14:06:15 2018 -0600 Committer: Matt Benson <[email protected]> Committed: Fri Mar 9 14:06:15 2018 -0600 ---------------------------------------------------------------------- .../constraints/AbstractPatternValidator.java | 72 ++++++++++++++++++++ .../apache/bval/constraints/EmailValidator.java | 25 +++++-- .../bval/constraints/PatternValidator.java | 38 ++++------- 3 files changed, 106 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bval/blob/617fb7c7/bval-jsr/src/main/java/org/apache/bval/constraints/AbstractPatternValidator.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/AbstractPatternValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/AbstractPatternValidator.java new file mode 100644 index 0000000..888eb51 --- /dev/null +++ b/bval-jsr/src/main/java/org/apache/bval/constraints/AbstractPatternValidator.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.bval.constraints; + +import java.lang.annotation.Annotation; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import javax.validation.constraints.Pattern.Flag; + +import org.apache.bval.util.Validate; + +public abstract class AbstractPatternValidator<A extends Annotation, T extends CharSequence> + implements ConstraintValidator<A, T> { + + public interface PatternDescriptor { + String regexp(); + + Flag[] flags(); + } + + private final Function<A, PatternDescriptor> toDescriptor; + + protected Pattern pattern; + + protected AbstractPatternValidator(Function<A, PatternDescriptor> toDescriptor) { + super(); + this.toDescriptor = Validate.notNull(toDescriptor); + } + + @Override + public void initialize(A constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + + final PatternDescriptor pd = toDescriptor.apply(constraintAnnotation); + + final Flag flags[] = pd.flags(); + int intFlag = 0; + for (Flag flag : flags) { + intFlag = intFlag | flag.getValue(); + } + try { + pattern = Pattern.compile(pd.regexp(), intFlag); + } catch (PatternSyntaxException e) { + throw new IllegalArgumentException("Invalid regular expression.", e); + } + } + + @Override + public boolean isValid(T value, ConstraintValidatorContext context) { + return value == null || pattern.matcher(value).matches(); + } +} http://git-wip-us.apache.org/repos/asf/bval/blob/617fb7c7/bval-jsr/src/main/java/org/apache/bval/constraints/EmailValidator.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/EmailValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/EmailValidator.java index b20806b..dca7753 100644 --- a/bval-jsr/src/main/java/org/apache/bval/constraints/EmailValidator.java +++ b/bval-jsr/src/main/java/org/apache/bval/constraints/EmailValidator.java @@ -18,18 +18,33 @@ */ package org.apache.bval.constraints; -import org.apache.bval.routines.EMailValidationUtils; - -import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; +import javax.validation.constraints.Pattern.Flag; + +import org.apache.bval.routines.EMailValidationUtils; /** * Description: <br/> */ -public class EmailValidator implements ConstraintValidator<javax.validation.constraints.Email, CharSequence> { +public class EmailValidator extends AbstractPatternValidator<javax.validation.constraints.Email, CharSequence> { + + public EmailValidator() { + super(email -> new PatternDescriptor() { + + @Override + public String regexp() { + return email.regexp(); + } + + @Override + public Flag[] flags() { + return email.flags(); + } + }); + } @Override public boolean isValid(CharSequence value, ConstraintValidatorContext context) { - return EMailValidationUtils.isValid(value); + return EMailValidationUtils.isValid(value) && super.isValid(value, context); } } http://git-wip-us.apache.org/repos/asf/bval/blob/617fb7c7/bval-jsr/src/main/java/org/apache/bval/constraints/PatternValidator.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/PatternValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/PatternValidator.java index 8a53062..3d0fdd4 100644 --- a/bval-jsr/src/main/java/org/apache/bval/constraints/PatternValidator.java +++ b/bval-jsr/src/main/java/org/apache/bval/constraints/PatternValidator.java @@ -18,35 +18,25 @@ */ package org.apache.bval.constraints; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; import javax.validation.constraints.Pattern; -import java.util.regex.PatternSyntaxException; +import javax.validation.constraints.Pattern.Flag; /** - * validator using a regular expression, - * based on the jsr Pattern constraint annotation. + * validator using a regular expression, based on the jsr Pattern constraint annotation. */ -public class PatternValidator implements ConstraintValidator<Pattern, CharSequence> { - protected java.util.regex.Pattern pattern; +public class PatternValidator extends AbstractPatternValidator<Pattern, CharSequence> { + public PatternValidator() { + super(p -> new PatternDescriptor() { - @Override - public void initialize(Pattern annotation) { - final Pattern.Flag flags[] = annotation.flags(); - int intFlag = 0; - for (Pattern.Flag flag : flags) { - intFlag = intFlag | flag.getValue(); - } + @Override + public String regexp() { + return p.regexp(); + } - try { - pattern = java.util.regex.Pattern.compile(annotation.regexp(), intFlag); - } catch (PatternSyntaxException e) { - throw new IllegalArgumentException("Invalid regular expression.", e); - } - } - - @Override - public boolean isValid(CharSequence value, ConstraintValidatorContext context) { - return value == null || pattern.matcher(value).matches(); + @Override + public Flag[] flags() { + return p.flags(); + } + }); } }
