implement BV 2.0 against existing BVal unit tests

Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/3f287a7a
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/3f287a7a
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/3f287a7a

Branch: refs/heads/bv2
Commit: 3f287a7aff06ac0eaa10711d55afa5d79b8d9dbd
Parents: cd050cf
Author: Matt Benson <[email protected]>
Authored: Wed Nov 15 14:47:45 2017 -0600
Committer: Matt Benson <[email protected]>
Committed: Wed Feb 21 14:23:23 2018 -0600

----------------------------------------------------------------------
 bundle/pom.xml                                  |   2 +-
 bval-core/pom.xml                               |   2 +-
 .../bval/routines/EMailValidationUtils.java     |   7 +-
 .../java/org/apache/bval/util/BValVersion.java  |  12 +-
 .../java/org/apache/bval/util/Exceptions.java   | 125 ++++
 .../main/java/org/apache/bval/util/Lazy.java    |  62 ++
 .../main/java/org/apache/bval/util/LazyInt.java |  49 ++
 .../java/org/apache/bval/util/ObjectUtils.java  |  20 +-
 .../org/apache/bval/util/ObjectWrapper.java     |  50 ++
 .../java/org/apache/bval/util/StringUtils.java  |  67 +-
 .../java/org/apache/bval/util/Validate.java     |  29 +-
 .../apache/bval/util/reflection/Reflection.java | 173 ++++-
 .../apache/bval/util/reflection/TypeUtils.java  |  65 +-
 bval-extras/pom.xml                             |   4 +-
 .../constraints/checkdigit/ABANumber.java       |   4 +-
 .../extras/constraints/checkdigit/CUSIP.java    |   4 +-
 .../extras/constraints/checkdigit/EAN13.java    |   4 +-
 .../extras/constraints/checkdigit/IBAN.java     |   4 +-
 .../constraints/checkdigit/IBANValidator.java   |   8 +-
 .../extras/constraints/checkdigit/ISBN10.java   |   4 +-
 .../extras/constraints/checkdigit/Luhn.java     |   4 +-
 .../checkdigit/ModulusValidator.java            |   4 +-
 .../extras/constraints/checkdigit/Sedol.java    |   4 +-
 .../extras/constraints/checkdigit/Verhoeff.java |   4 +-
 .../checkdigit/VerhoeffValidator.java           |   4 +-
 .../constraints/creditcard/AmericanExpress.java |   4 +-
 .../extras/constraints/creditcard/Diners.java   |   4 +-
 .../extras/constraints/creditcard/Discover.java |   4 +-
 .../constraints/creditcard/Mastercard.java      |   4 +-
 .../constraints/file/DirectoryValidator.java    |   2 +-
 .../constraints/file/SymlinkValidator.java      |   2 +-
 .../extras/constraints/net/DomainValidator.java |  33 +-
 .../constraints/net/InetAddressValidator.java   |   4 +-
 .../checkdigit/ABANumberValidatorTest.java      |   2 +-
 .../checkdigit/AbstractCheckDigitTest.java      |   4 +-
 .../checkdigit/CUSIPValidatorTest.java          |   2 +-
 .../checkdigit/EAN13CheckDigitTest.java         |   2 +-
 .../checkdigit/IBANCheckDigitTest.java          |   2 +-
 .../checkdigit/ISBN10CheckDigitTest.java        |   2 +-
 .../checkdigit/LuhnCheckDigitTest.java          |   2 +-
 .../checkdigit/SedolCheckDigitTest.java         |   2 +-
 .../checkdigit/VerhoeffCheckDigitTest.java      |   2 +-
 .../net/InetAddressValidatorTest.java           |   2 +-
 bval-json/pom.xml                               |   2 +-
 bval-jsr/pom.xml                                |  19 +-
 .../java/org/apache/bval/cdi/AnyLiteral.java    |   3 +-
 .../org/apache/bval/cdi/BValAnnotatedType.java  |  33 +-
 .../java/org/apache/bval/cdi/BValExtension.java |  18 +-
 .../org/apache/bval/cdi/BValInterceptor.java    |  28 +-
 .../apache/bval/cdi/BValInterceptorBean.java    |   6 +-
 .../org/apache/bval/cdi/DefaultLiteral.java     |   3 +-
 .../apache/bval/cdi/EmptyAnnotationLiteral.java |  24 +-
 .../java/org/apache/bval/cdi/ValidatorBean.java |   6 +-
 .../apache/bval/cdi/ValidatorFactoryBean.java   |   6 +-
 .../bval/constraints/AssertFalseValidator.java  |   6 +-
 .../bval/constraints/AssertTrueValidator.java   |   6 +-
 .../DecimalMaxValidatorForNumber.java           |  12 +-
 .../DecimalMaxValidatorForString.java           |   2 +-
 .../DecimalMinValidatorForNumber.java           |  12 +-
 .../DecimalMinValidatorForString.java           |   2 +-
 .../java/org/apache/bval/constraints/Email.java |  15 +-
 .../apache/bval/constraints/EmailValidator.java |   7 +-
 .../constraints/FutureOrPresentValidator.java   | 138 ++++
 .../bval/constraints/FutureValidator.java       | 138 ++++
 .../bval/constraints/MaxValidatorForNumber.java |   4 +-
 .../bval/constraints/MaxValidatorForString.java |   2 +-
 .../bval/constraints/MinValidatorForNumber.java |   4 +-
 .../bval/constraints/MinValidatorForString.java |   2 +-
 .../bval/constraints/NotBlankValidator.java     |  34 +
 .../org/apache/bval/constraints/NotEmpty.java   |  28 +-
 .../bval/constraints/NotEmptyValidator.java     |  19 +-
 .../NotEmptyValidatorForCharSequence.java       |  34 +
 .../NotEmptyValidatorForCollection.java         |   7 +-
 .../constraints/NotEmptyValidatorForMap.java    |   6 +-
 .../constraints/NotEmptyValidatorForString.java |  37 -
 .../bval/constraints/NotNullValidator.java      |   4 -
 .../apache/bval/constraints/NullValidator.java  |   5 -
 .../bval/constraints/NumberSignValidator.java   |  68 ++
 .../constraints/PastOrPresentValidator.java     | 138 ++++
 .../apache/bval/constraints/PastValidator.java  | 138 ++++
 .../bval/constraints/PatternValidator.java      |   4 +-
 .../apache/bval/constraints/TimeValidator.java  |  44 ++
 .../apache/bval/context/ValidationContext.java  | 125 ++++
 .../main/java/org/apache/bval/el/ELFacade.java  |  16 +-
 .../bval/jsr/AbstractConstraintDescriptor.java  |  32 +
 .../bval/jsr/AnnotationConstraintBuilder.java   |  38 +-
 .../apache/bval/jsr/AnnotationProcessor.java    |  24 +-
 .../apache/bval/jsr/ApacheFactoryContext.java   |  83 +-
 .../bval/jsr/ApacheValidatorConfiguration.java  |   7 +-
 .../apache/bval/jsr/ApacheValidatorFactory.java | 171 +++--
 .../bval/jsr/BootstrapConfigurationImpl.java    |  29 +-
 .../bval/jsr/CascadingPropertyValidator.java    |  96 ++-
 .../org/apache/bval/jsr/ConfigurationImpl.java  | 128 ++--
 .../jsr/ConstraintAnnotationAttributes.java     |  46 +-
 .../org/apache/bval/jsr/ConstraintCached.java   | 143 +++-
 .../org/apache/bval/jsr/ConstraintDefaults.java | 103 +--
 .../bval/jsr/ConstraintDescriptorImpl.java      |  13 +
 .../apache/bval/jsr/ConstraintValidation.java   |  33 +-
 .../jsr/ConstraintValidatorContextImpl.java     |  20 +-
 .../bval/jsr/ConstraintValidatorIdentity.java   |   9 +-
 .../bval/jsr/ConstraintViolationImpl.java       |  94 +--
 .../jsr/DefaultConstraintValidatorFactory.java  |  12 +-
 .../bval/jsr/DefaultMessageInterpolator.java    |  35 +-
 .../jsr/DefaultValidationProviderResolver.java  |  50 +-
 .../org/apache/bval/jsr/GraphBeanIdentity.java  |  28 +-
 .../java/org/apache/bval/jsr/GraphContext.java  |  95 +++
 .../jsr/NodeBuilderCustomizableContextImpl.java |  89 +++
 .../apache/bval/jsr/NodeContextBuilderImpl.java |  88 +++
 .../bval/jsr/ParameterDescriptorImpl.java       |   7 +
 .../apache/bval/jsr/PropertyDescriptorImpl.java |   9 +
 .../bval/jsr/ReturnValueDescriptorImpl.java     |   8 +
 .../java/org/apache/bval/jsr/ValidatorImpl.java | 141 ++++
 .../org/apache/bval/jsr/descriptor/BeanD.java   | 128 ++++
 .../jsr/descriptor/CascadableContainerD.java    |  88 +++
 .../apache/bval/jsr/descriptor/ComposedD.java   | 123 +++
 .../ComputeConstraintValidatorClass.java        | 183 +++++
 .../apache/bval/jsr/descriptor/ConstraintD.java | 276 +++++++
 .../bval/jsr/descriptor/ConstructorD.java       |  41 +
 .../jsr/descriptor/ContainerElementTypeD.java   | 119 +++
 .../bval/jsr/descriptor/CrossParameterD.java    |  18 +
 .../bval/jsr/descriptor/DescriptorManager.java  |  74 ++
 .../apache/bval/jsr/descriptor/ElementD.java    | 122 +++
 .../apache/bval/jsr/descriptor/ExecutableD.java |  84 +++
 .../org/apache/bval/jsr/descriptor/Finder.java  | 103 +++
 .../bval/jsr/descriptor/GroupConversion.java    |  85 +++
 .../bval/jsr/descriptor/MetadataReader.java     | 291 +++++++
 .../org/apache/bval/jsr/descriptor/MethodD.java |  49 ++
 .../apache/bval/jsr/descriptor/ParameterD.java  |  62 ++
 .../apache/bval/jsr/descriptor/PropertyD.java   | 106 +++
 .../bval/jsr/descriptor/ReturnValueD.java       |  36 +
 .../java/org/apache/bval/jsr/groups/Group.java  |  13 +-
 .../groups/GroupConversionDescriptorImpl.java   |   3 +-
 .../java/org/apache/bval/jsr/groups/Groups.java |  67 +-
 .../apache/bval/jsr/groups/GroupsComputer.java  | 111 ++-
 .../jsr/job/ConstraintValidatorContextImpl.java | 195 +++++
 .../org/apache/bval/jsr/job/ValidateBean.java   |  60 ++
 .../apache/bval/jsr/job/ValidateParameters.java | 188 +++++
 .../apache/bval/jsr/job/ValidateProperty.java   | 522 +++++++++++++
 .../bval/jsr/job/ValidateReturnValue.java       | 126 ++++
 .../org/apache/bval/jsr/job/ValidationJob.java  | 380 ++++++++++
 .../bval/jsr/job/ValidationJobFactory.java      | 112 +++
 .../bval/jsr/metadata/AnnotationBehavior.java   |  35 +
 .../AnnotationBehaviorMergeStrategy.java        |  54 ++
 ...otationDeclaredValidatorMappingProvider.java |  42 ++
 .../ClassLoadingValidatorMappingProvider.java   |  48 ++
 .../bval/jsr/metadata/CompositeBuilder.java     | 227 ++++++
 .../CompositeValidatorMappingProvider.java      |  42 ++
 .../bval/jsr/metadata/ContainerElementKey.java  | 175 +++++
 .../apache/bval/jsr/metadata/DualBuilder.java   | 243 ++++++
 .../metadata/DualValidationMappingProvider.java |  50 ++
 .../apache/bval/jsr/metadata/EmptyBuilder.java  | 183 +++++
 .../jsr/metadata/HasAnnotationBehavior.java     |  24 +
 .../bval/jsr/metadata/HierarchyBuilder.java     | 235 ++++++
 .../bval/jsr/metadata/MetadataBuilder.java      |  98 +++
 .../bval/jsr/metadata/MetadataBuilders.java     |  41 +
 .../org/apache/bval/jsr/metadata/Metas.java     | 324 ++++++++
 .../bval/jsr/metadata/ReflectionBuilder.java    | 272 +++++++
 .../org/apache/bval/jsr/metadata/Signature.java |  75 ++
 .../bval/jsr/metadata/ValidatorMapping.java     | 121 +++
 .../jsr/metadata/ValidatorMappingProvider.java  |  51 ++
 .../apache/bval/jsr/metadata/XmlBuilder.java    | 694 +++++++++++++++++
 .../metadata/XmlValidationMappingProvider.java  |  64 ++
 .../parameter/DefaultParameterNameProvider.java |  25 +-
 .../resolver/CachingTraversableResolver.java    |  26 +-
 .../bval/jsr/util/AnnotationsManager.java       | 359 +++++++++
 .../org/apache/bval/jsr/util/ClassHelper.java   |  10 +-
 ...ementNodeBuilderCustomizableContextImpl.java |  77 ++
 ...nerElementNodeBuilderDefinedContextImpl.java |  65 ++
 .../ContainerElementNodeContextBuilderImpl.java |  85 +++
 .../main/java/org/apache/bval/jsr/util/IOs.java |  11 +-
 .../java/org/apache/bval/jsr/util/LRUCache.java |  41 +
 .../LeafNodeBuilderCustomizableContextImpl.java |  23 +-
 .../java/org/apache/bval/jsr/util/Methods.java  |  45 ++
 .../NodeBuilderCustomizableContextImpl.java     |  55 +-
 .../jsr/util/NodeBuilderDefinedContextImpl.java |  32 +-
 .../bval/jsr/util/NodeContextBuilderImpl.java   |  52 +-
 .../java/org/apache/bval/jsr/util/NodeImpl.java | 118 +--
 .../java/org/apache/bval/jsr/util/PathImpl.java |  91 +--
 .../apache/bval/jsr/util/PathNavigation.java    | 102 ++-
 .../java/org/apache/bval/jsr/util/Proxies.java  |   2 +-
 .../apache/bval/jsr/util/ToUnmodifiable.java    |  34 +
 .../bval/jsr/valueextraction/FxExtractor.java   |  96 +++
 .../IterableElementExtractor.java               |  30 +
 .../valueextraction/ListElementExtractor.java   |  34 +
 .../bval/jsr/valueextraction/MapExtractor.java  |  42 ++
 .../jsr/valueextraction/OptionalExtractor.java  |  65 ++
 .../jsr/valueextraction/ValueExtractors.java    | 181 +++++
 .../apache/bval/jsr/xml/AnnotationProxy.java    |  59 +-
 .../bval/jsr/xml/AnnotationProxyBuilder.java    | 104 ++-
 .../org/apache/bval/jsr/xml/SchemaManager.java  | 286 +++++++
 .../bval/jsr/xml/ValidationMappingParser.java   | 749 ++-----------------
 .../apache/bval/jsr/xml/ValidationParser.java   | 330 ++++----
 .../java/org/apache/bval/jsr/xml/XmlUtils.java  |  67 ++
 .../bval/jsr/DefaultConstraints.properties      |  81 +-
 .../DefaultExtractors.properties                |  25 +
 bval-jsr/src/main/xjb/binding-customization.xjb |   4 +-
 .../main/xsd/validation-configuration-2.0.xsd   |  75 ++
 .../src/main/xsd/validation-mapping-2.0.xsd     | 297 ++++++++
 .../org/apache/bval/jsr/BeanDescriptorTest.java |   3 +
 .../bval/jsr/CustomValidatorFactoryTest.java    |   6 +
 .../java/org/apache/bval/jsr/Jsr303Test.java    |  24 +-
 .../org/apache/bval/jsr/ValidationTest.java     |   2 +
 .../org/apache/bval/jsr/example/Engine.java     |   8 +-
 .../jsr/extensions/MethodValidatorImplTest.java |   4 +-
 .../jsr/groups/GroupSequenceIsolationTest.java  |  10 +-
 .../bval/jsr/groups/GroupsComputerTest.java     |  88 +--
 .../test/java/org/apache/bval/jsr/xml/Demo.java |  40 +
 .../bval/jsr/xml/ValidationParserTest.java      |  18 +-
 .../src/test/resources/sample-validation11.xml  |  30 +
 .../src/test/resources/sample-validation2.xml   |  30 +
 bval-tck11/pom.xml                              |   8 +-
 bval-xstream/pom.xml                            |   2 +-
 pom.xml                                         |  39 +-
 213 files changed, 12302 insertions(+), 2281 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bundle/pom.xml
----------------------------------------------------------------------
diff --git a/bundle/pom.xml b/bundle/pom.xml
index 80cd95d..2f57116 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.bval</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>1.1.3-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <!-- use fully qualified naming for OSGi bundles -->

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/pom.xml
----------------------------------------------------------------------
diff --git a/bval-core/pom.xml b/bval-core/pom.xml
index 48026d4..b7a7f8b 100644
--- a/bval-core/pom.xml
+++ b/bval-core/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.bval</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>1.1.3-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>bval-core</artifactId>

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/routines/EMailValidationUtils.java
----------------------------------------------------------------------
diff --git 
a/bval-core/src/main/java/org/apache/bval/routines/EMailValidationUtils.java 
b/bval-core/src/main/java/org/apache/bval/routines/EMailValidationUtils.java
index 1158c7f..0835bae 100644
--- a/bval-core/src/main/java/org/apache/bval/routines/EMailValidationUtils.java
+++ b/bval-core/src/main/java/org/apache/bval/routines/EMailValidationUtils.java
@@ -29,12 +29,11 @@ public class EMailValidationUtils {
     private static String ATOM = 
"[^\\x00-\\x1F\\(\\)\\<\\>\\@\\,\\;\\:\\\\\\\"\\.\\[\\]\\s]";
     private static String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)*";
     private static String IP_DOMAIN = 
"\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";
-    public static final java.util.regex.Pattern DEFAULT_EMAIL_PATTERN;
+    public static final Pattern DEFAULT_EMAIL_PATTERN;
 
     static {
-        DEFAULT_EMAIL_PATTERN =
-            java.util.regex.Pattern.compile("^" + ATOM + "+(\\." + ATOM + 
"+)*@" + DOMAIN + "|" + IP_DOMAIN + ")$",
-                java.util.regex.Pattern.CASE_INSENSITIVE);
+        DEFAULT_EMAIL_PATTERN = Pattern.compile("^" + ATOM + "+(\\." + ATOM + 
"+)*@" + DOMAIN + "|" + IP_DOMAIN + ")$",
+            Pattern.CASE_INSENSITIVE);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/BValVersion.java 
b/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
index b0c451f..13d1fa3 100644
--- a/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
+++ b/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
@@ -54,21 +54,17 @@ public class BValVersion {
 
     static {
         Properties revisionProps = new Properties();
-        try {
-            InputStream in = 
BValVersion.class.getResourceAsStream("/META-INF/org.apache.bval.revision.properties");
+        try (InputStream in = 
BValVersion.class.getResourceAsStream("/META-INF/org.apache.bval.revision.properties"))
 {
             if (in != null) {
-                try {
-                    revisionProps.load(in);
-                } finally {
-                    in.close();
-                }
+                revisionProps.load(in);
             }
         } catch (IOException ioe) {
         }
 
         String vers = revisionProps.getProperty("project.version");
-        if (vers == null || "".equals(vers.trim()))
+        if (vers == null || "".equals(vers.trim())) {
             vers = "0.0.0";
+        }
         VERSION_NUMBER = vers;
 
         StringTokenizer tok = new StringTokenizer(VERSION_NUMBER, ".-");

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/Exceptions.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/Exceptions.java 
b/bval-core/src/main/java/org/apache/bval/util/Exceptions.java
new file mode 100644
index 0000000..9487cde
--- /dev/null
+++ b/bval-core/src/main/java/org/apache/bval/util/Exceptions.java
@@ -0,0 +1,125 @@
+/*
+ *  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.util;
+
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+/**
+ * Utility class for the creation and throwing of Exceptions.
+ */
+public class Exceptions {
+
+    public static <E extends Exception> E create(Function<? super String, ? 
extends E> fn, String format,
+        Object... args) {
+        return create(fn, () -> String.format(format, args));
+    }
+
+    public static <E extends Exception, C extends Throwable> E create(
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String 
format, Object... args) {
+        return create(fn, cause, () -> String.format(format, args));
+    }
+
+    public static <E extends Exception> E create(Function<? super String, ? 
extends E> fn, Supplier<String> message) {
+        return elideStackTrace(fn.apply(message.get()));
+    }
+
+    public static <E extends Exception, C extends Throwable> E create(
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, 
Supplier<String> message) {
+        return elideStackTrace(fn.apply(message.get(), cause));
+    }
+
+    public static <E extends Exception, R> R raise(Function<? super String, ? 
extends E> fn, String format,
+        Object... args) throws E {
+        throw create(fn, format, args);
+    }
+
+    public static <E extends Exception> void raiseIf(boolean condition, 
Function<? super String, ? extends E> fn,
+        String format, Object... args) throws E {
+        if (condition) {
+            raise(fn, format, args);
+        }
+    }
+
+    public static <E extends Exception> void raiseUnless(boolean condition, 
Function<? super String, ? extends E> fn,
+        String format, Object... args) throws E {
+        raiseIf(!condition, fn, format, args);
+    }
+
+    public static <E extends Exception, R> R raise(Function<? super String, ? 
extends E> fn, Supplier<String> message)
+        throws E {
+        throw create(fn, message);
+    }
+
+    public static <E extends Exception> void raiseIf(boolean condition, 
Function<? super String, ? extends E> fn,
+        Supplier<String> message) throws E {
+        if (condition) {
+            raise(fn, message);
+        }
+    }
+
+    public static <E extends Exception> void raiseUnless(boolean condition, 
Function<? super String, ? extends E> fn,
+        Supplier<String> message) throws E {
+        raiseIf(!condition, fn, message);
+    }
+
+    public static <E extends Exception, C extends Throwable, R> R raise(
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String 
format, Object... args) throws E {
+        throw create(fn, cause, format, args);
+    }
+
+    public static <E extends Exception, C extends Throwable> void 
raiseIf(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String 
format, Object... args) throws E {
+        if (condition) {
+            raise(fn, cause, format, args);
+        }
+    }
+
+    public static <E extends Exception, C extends Throwable> void 
raiseUnless(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String 
format, Object... args) throws E {
+        raiseIf(!condition, fn, cause, format, args);
+    }
+
+    public static <E extends Exception, C extends Throwable, R> R raise(
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, 
Supplier<String> message) throws E {
+        throw create(fn, cause, message);
+    }
+
+    public static <E extends Exception, C extends Throwable> void 
raiseIf(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, 
Supplier<String> message) throws E {
+        if (condition) {
+            raise(fn, cause, message);
+        }
+    }
+
+    public static <E extends Exception, C extends Throwable> void 
raiseUnless(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, 
Supplier<String> message) throws E {
+        raiseIf(!condition, fn, cause, message);
+    }
+
+    private static <T extends Throwable> T elideStackTrace(T t) {
+        final StackTraceElement[] stackTrace = 
t.fillInStackTrace().getStackTrace();
+        t.setStackTrace(Stream.of(stackTrace).filter(e -> 
!Exceptions.class.getName().equals(e.getClassName()))
+            .toArray(StackTraceElement[]::new));
+        return t;
+    }
+
+    private Exceptions() {
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/Lazy.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/Lazy.java 
b/bval-core/src/main/java/org/apache/bval/util/Lazy.java
new file mode 100644
index 0000000..4796de3
--- /dev/null
+++ b/bval-core/src/main/java/org/apache/bval/util/Lazy.java
@@ -0,0 +1,62 @@
+/*
+ *  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.util;
+
+import java.util.Optional;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+/**
+ * @since 2.0
+ *
+ * @param <T>
+ */
+public class Lazy<T> implements Supplier<T> {
+    private T value;
+    private volatile Supplier<T> init;
+
+    public Lazy(Supplier<T> init) {
+        reset(init);
+    }
+
+    public Lazy<T> reset(Supplier<T> init) {
+        this.init = Validate.notNull(init);
+        return this;
+    }
+
+    @Override
+    public T get() {
+        if (init != null) {
+            synchronized (this) {
+                if (init != null) {
+                    value = init.get();
+                    init = null;
+                }
+            }
+        }
+        return value;
+    }
+
+    public Optional<T> optional() {
+        return Optional.ofNullable(value);
+    }
+
+    public <U> Consumer<U> consumer(BiConsumer<? super T, ? super U> delegate) 
{
+        return u -> delegate.accept(get(), u);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/LazyInt.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/LazyInt.java 
b/bval-core/src/main/java/org/apache/bval/util/LazyInt.java
new file mode 100644
index 0000000..44e09dd
--- /dev/null
+++ b/bval-core/src/main/java/org/apache/bval/util/LazyInt.java
@@ -0,0 +1,49 @@
+/*
+ *  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.util;
+
+import java.util.OptionalInt;
+import java.util.function.IntSupplier;
+
+/**
+ * @since 2.0
+ */
+public class LazyInt implements IntSupplier {
+    private int value;
+    private IntSupplier init;
+
+    public LazyInt(IntSupplier init) {
+        this.init = Validate.notNull(init);
+    }
+
+    @Override
+    public int getAsInt() {
+        if (init != null) {
+            synchronized (this) {
+                if (init != null) {
+                    value = init.getAsInt();
+                    init = null;
+                }
+            }
+        }
+        return value;
+    }
+
+    public synchronized OptionalInt optional() {
+        return init == null ? OptionalInt.of(value) : OptionalInt.empty();
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java 
b/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
index 0464eeb..b7f2fac 100644
--- a/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
+++ b/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
@@ -18,6 +18,8 @@ package org.apache.bval.util;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
 
 public final class ObjectUtils {
     public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
@@ -44,7 +46,7 @@ public final class ObjectUtils {
      * @return {@code object} if it is not {@code null}, defaultValue otherwise
      */
     public static <T> T defaultIfNull(final T object, final T defaultValue) {
-        return object != null ? object : defaultValue;
+        return object == null ? defaultValue : object;
     }
 
     public static <T> boolean isNotEmpty(final T[] array) {
@@ -68,29 +70,19 @@ public final class ObjectUtils {
         if (array == null) {
             return false;
         }
-        for (Object o : array) {
-            if (o.equals(objectToFind)) {
-                return true;
-            }
-        }
-        return false;
+        return Stream.of(array).anyMatch(Predicate.isEqual(objectToFind));
     }
 
     public static <T> T[] arrayAdd(T[] array, T objectToAdd) {
-        Class<?> type;
-        if (array != null) {
-            type = array.getClass().getComponentType();
-        } else if (objectToAdd != null) {
-            type = objectToAdd.getClass();
-        } else {
+        if (array == null && objectToAdd == null) {
             throw new IllegalArgumentException("Arguments cannot both be 
null");
         }
         final int arrayLength = Array.getLength(array);
+        @SuppressWarnings("unchecked")
         T[] newArray = (T[]) 
Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
         System.arraycopy(array, 0, newArray, 0, arrayLength);
         newArray[newArray.length - 1] = objectToAdd;
 
         return newArray;
-
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/ObjectWrapper.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/ObjectWrapper.java 
b/bval-core/src/main/java/org/apache/bval/util/ObjectWrapper.java
new file mode 100644
index 0000000..8483745
--- /dev/null
+++ b/bval-core/src/main/java/org/apache/bval/util/ObjectWrapper.java
@@ -0,0 +1,50 @@
+/*
+ * 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.util;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+public class ObjectWrapper<T> implements Consumer<T>, Supplier<T> {
+    private T value;
+
+    public ObjectWrapper() {
+        this(null);
+    }
+
+    public ObjectWrapper(T value) {
+        super();
+        this.value = value;
+    }
+
+    @Override
+    public void accept(T value) {
+        this.value = value;
+    }
+
+    @Override
+    public T get() {
+        return value;
+    }
+
+    public Optional<T> optional() {
+        return Optional.ofNullable(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/StringUtils.java 
b/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
index f7add27..6b9c25d 100644
--- a/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
+++ b/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
@@ -17,8 +17,6 @@
 package org.apache.bval.util;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 
 public final class StringUtils {
@@ -93,49 +91,24 @@ public final class StringUtils {
         return true;
     }
 
-    public static String join(Collection<?> values, String joinToken) {
-        if (values == null) {
-            return null;
-        }
-        if (values.size() == 0) {
-            return "";
-        }
-        if (values.size() == 1) {
-            return values.iterator().next().toString();
-        }
-        if (joinToken == null) {
-            joinToken = "null"; // backward compat with commons-lang 
StringUtils...
-        }
-
-        StringBuilder sb = new StringBuilder(values.size() * (16 + 
joinToken.length()));
-        Iterator<?> it = values.iterator();
-        sb.append(it.next());
-        while (it.hasNext()) {
-            sb.append(joinToken).append(it.next());
-        }
-        return sb.toString();
-    }
-
-    public static String joinArray(Object[] values, String joinToken) {
-        if (values == null) {
-            return null;
-        }
-        if (values.length == 0) {
-            return "";
-        }
-        if (values.length == 1) {
-            return values[0].toString();
-        }
-        if (joinToken == null) {
-            joinToken = "null"; // backward compat with commons-lang 
StringUtils...
-        }
-
-        StringBuilder sb = new StringBuilder(values.length * (16 + 
joinToken.length()));
-        sb.append(values[0]);
-        for (int i = 1; i < values.length; i++) {
-            sb.append(joinToken).append(values[i]);
-        }
-        return sb.toString();
+    /**
+     * Taken from commons-lang3.
+     * <p>Checks if a CharSequence is not empty (""), not null and not 
whitespace only.</p>
+     *
+     * <pre>
+     * StringUtils.isNotBlank(null)      = false
+     * StringUtils.isNotBlank("")        = false
+     * StringUtils.isNotBlank(" ")       = false
+     * StringUtils.isNotBlank("bob")     = true
+     * StringUtils.isNotBlank("  bob  ") = true
+     * </pre>
+     *
+     * @param cs  the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence is
+     *  not empty and not null and not whitespace
+     */
+    public static boolean isNotBlank(final CharSequence cs) {
+        return !isBlank(cs);
     }
 
     /**
@@ -149,12 +122,12 @@ public final class StringUtils {
      * <p>Splits the provided text into an array, separator is whitespace.
      */
     public static String[] split(String str, Character token) {
-        if (str == null || str.length() == 0) {
+        if (str == null || str.isEmpty()) {
             return ObjectUtils.EMPTY_STRING_ARRAY;
         }
 
         // split on token
-        List<String> ret = new ArrayList<String>();
+        List<String> ret = new ArrayList<>();
         StringBuilder sb = new StringBuilder(str.length());
         for (int pos = 0; pos < str.length(); pos++) {
             char c = str.charAt(pos);

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/Validate.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/Validate.java 
b/bval-core/src/main/java/org/apache/bval/util/Validate.java
index f0e0611..042dc1b 100644
--- a/bval-core/src/main/java/org/apache/bval/util/Validate.java
+++ b/bval-core/src/main/java/org/apache/bval/util/Validate.java
@@ -16,9 +16,10 @@
  */
 package org.apache.bval.util;
 
+import java.util.function.Function;
+
 /**
- * Some used Validate from commons.
- *
+ * Some used validations from commons.
  */
 public final class Validate {
     private Validate() {
@@ -29,16 +30,30 @@ public final class Validate {
     }
 
     public static <T> T notNull(final T object, final String message, final 
Object... values) {
-        if (object == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
+        return notNull(object, NullPointerException::new, message, values);
+    }
+
+    public static <E extends Exception, T> T notNull(final T object, 
Function<? super String, ? extends E> fn,
+        final String message, final Object... values) throws E {
+        Exceptions.raiseIf(object == null, fn, message, values);
         return object;
     }
 
     public static void isTrue(final boolean expression, final String message, 
final Object... values) {
-        if (expression == false) {
-            throw new IllegalArgumentException(String.format(message, values));
+        Exceptions.raiseUnless(expression, IllegalArgumentException::new, 
message, values);
+    }
+
+    public static <T> T[] noNullElements(final T[] array, final String 
message, final Object... values) {
+        Validate.notNull(array);
+
+        for (int i = 0; i < array.length; i++) {
+            Exceptions.raiseIf(array[i] == null, 
IllegalArgumentException::new, message,
+                ObjectUtils.arrayAdd(values, Integer.valueOf(i)));
         }
+        return array;
     }
 
+    public static void validState(final boolean expression, final String 
message, final Object... values) {
+        Exceptions.raiseUnless(expression, IllegalStateException::new, 
message, values);
+    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
----------------------------------------------------------------------
diff --git 
a/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java 
b/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
index 674cf94..221a277 100644
--- a/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
+++ b/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
@@ -24,8 +24,16 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
 
 import org.apache.commons.weaver.privilizer.Privilizing;
 
@@ -33,36 +41,44 @@ import org.apache.commons.weaver.privilizer.Privilizing;
  * Security-agnostic "blueprint" class for reflection-related operations. 
Intended for use by Apache BVal code.
  */
 public class Reflection {
+    /**
+     * Inclusivity literals for {@link #hierarchy(Class, Interfaces)}.
+     * Taken from commons-lang3.
+     */
+    public enum Interfaces {
+        INCLUDE, EXCLUDE
+    }
+
     private static final Object[][] NATIVE_CODES = new Object[][]{
-            {byte.class, "byte", "B"},
-            {char.class, "char", "C"},
-            {double.class, "double", "D"},
-            {float.class, "float", "F"},
-            {int.class, "int", "I"},
-            {long.class, "long", "J"},
-            {short.class, "short", "S"},
-            {boolean.class, "boolean", "Z"},
-            {void.class, "void", "V"}
+            { byte.class, "byte", "B" },
+            { char.class, "char", "C" },
+            { double.class, "double", "D" },
+            { float.class, "float", "F" },
+            { int.class, "int", "I" },
+            { long.class, "long", "J" },
+            { short.class, "short", "S" },
+            { boolean.class, "boolean", "Z" },
+            { void.class, "void", "V" }
     };
 
     /**
      * Maps primitive {@code Class}es to their corresponding wrapper {@code 
Class}.
      */
-    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_MAP = new 
HashMap<Class<?>, Class<?>>();
+    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_MAP;
     static {
-        PRIMITIVE_WRAPPER_MAP.put(Boolean.TYPE, Boolean.class);
-        PRIMITIVE_WRAPPER_MAP.put(Byte.TYPE, Byte.class);
-        PRIMITIVE_WRAPPER_MAP.put(Character.TYPE, Character.class);
-        PRIMITIVE_WRAPPER_MAP.put(Short.TYPE, Short.class);
-        PRIMITIVE_WRAPPER_MAP.put(Integer.TYPE, Integer.class);
-        PRIMITIVE_WRAPPER_MAP.put(Long.TYPE, Long.class);
-        PRIMITIVE_WRAPPER_MAP.put(Double.TYPE, Double.class);
-        PRIMITIVE_WRAPPER_MAP.put(Float.TYPE, Float.class);
-        PRIMITIVE_WRAPPER_MAP.put(Void.TYPE, Void.TYPE);
+        final Map<Class<?>, Class<?>> m = new HashMap<>();
+        m.put(Boolean.TYPE, Boolean.class);
+        m.put(Byte.TYPE, Byte.class);
+        m.put(Character.TYPE, Character.class);
+        m.put(Short.TYPE, Short.class);
+        m.put(Integer.TYPE, Integer.class);
+        m.put(Long.TYPE, Long.class);
+        m.put(Double.TYPE, Double.class);
+        m.put(Float.TYPE, Float.class);
+        m.put(Void.TYPE, Void.TYPE);
+        PRIMITIVE_WRAPPER_MAP = Collections.unmodifiableMap(m);
     }
 
-
-
     /**
      * <p>Converts the specified primitive Class object to its corresponding
      * wrapper Class object.</p>
@@ -129,8 +145,7 @@ public class Reflection {
         return cl == null ? clazz.getClassLoader() : cl;
     }
 
-    public static Class<?> toClass(String className) throws 
ClassNotFoundException
-    {
+    public static Class<?> toClass(String className) throws 
ClassNotFoundException {
         ClassLoader cl = getClassLoader(Reflection.class);
         return toClass(className, cl);
     }
@@ -142,7 +157,7 @@ public class Reflection {
      *
      * @throws RuntimeException on load error
      */
-    public static Class toClass(String className, ClassLoader loader) throws 
ClassNotFoundException {
+    public static Class<?> toClass(String className, ClassLoader loader) 
throws ClassNotFoundException {
         return toClass(className, false, loader);
     }
 
@@ -153,7 +168,7 @@ public class Reflection {
      *
      * @throws RuntimeException on load error
      */
-    public static Class toClass(String className, boolean resolve, ClassLoader 
loader) throws ClassNotFoundException {
+    public static Class<?> toClass(String className, boolean resolve, 
ClassLoader loader) throws ClassNotFoundException {
         if (className == null) {
             throw new NullPointerException("className == null");
         }
@@ -171,7 +186,7 @@ public class Reflection {
             for (int i = 0; !primitive && (i < NATIVE_CODES.length); i++) {
                 if (NATIVE_CODES[i][1].equals(className)) {
                     if (dims == 0) {
-                        return (Class) NATIVE_CODES[i][0];
+                        return (Class<?>) NATIVE_CODES[i][0];
                     }
                     className = (String) NATIVE_CODES[i][2];
                     primitive = true;
@@ -296,6 +311,22 @@ public class Reflection {
     }
 
     /**
+     * Perform a search against the class hierarchy.
+     * @param clazz
+     * @param search
+     * @return T or {@code null}
+     */
+    public static <T> T find(final Class<?> clazz, Function<Class<?>, T> 
search) {
+        for (Class<?> t : hierarchy(clazz, Interfaces.INCLUDE)) {
+            final T value = search.apply(t);
+            if (value != null) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Construct a new instance of {@code cls} using its default constructor.
      * @param cls
      * @return T
@@ -333,4 +364,94 @@ public class Reflection {
         return true;
     }
 
+    /**
+     * Get an {@link Iterable} that can iterate over a class hierarchy in 
ascending (subclass to superclass) order.
+     * Taken from commons-lang3.
+     *
+     * @param type the type to get the class hierarchy from
+     * @param interfacesBehavior switch indicating whether to include or 
exclude interfaces
+     * @return Iterable an Iterable over the class hierarchy of the given class
+     */
+    public static Iterable<Class<?>> hierarchy(final Class<?> type, final 
Interfaces interfacesBehavior) {
+        if (type == null) {
+            return Collections.emptySet();
+        }
+        final Iterable<Class<?>> classes = new Iterable<Class<?>>() {
+
+            @Override
+            public Iterator<Class<?>> iterator() {
+                return new Iterator<Class<?>>() {
+                    Optional<Class<?>> next;
+                    {
+                        next = Optional.of(type);
+                    }
+
+                    @Override
+                    public boolean hasNext() {
+                        return next.isPresent();
+                    }
+
+                    @Override
+                    public Class<?> next() {
+                        final Class<?> result = 
next.orElseThrow(NoSuchElementException::new);
+                        next = Optional.ofNullable(result.getSuperclass());
+                        return result;
+                    }
+
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+        if (interfacesBehavior != Interfaces.INCLUDE) {
+            return classes;
+        }
+        return new Iterable<Class<?>>() {
+
+            @Override
+            public Iterator<Class<?>> iterator() {
+                final Set<Class<?>> seenInterfaces = new HashSet<Class<?>>();
+                final Iterator<Class<?>> wrapped = classes.iterator();
+    
+                return new Iterator<Class<?>>() {
+                    Iterator<Class<?>> interfaces = 
Collections.emptyIterator();
+
+                    @Override
+                    public boolean hasNext() {
+                        return interfaces.hasNext() || wrapped.hasNext();
+                    }
+
+                    @Override
+                    public Class<?> next() {
+                        if (interfaces.hasNext()) {
+                            final Class<?> nextInterface = interfaces.next();
+                            seenInterfaces.add(nextInterface);
+                            return nextInterface;
+                        }
+                        final Class<?> nextSuperclass = wrapped.next();
+                        final Set<Class<?>> currentInterfaces = new 
LinkedHashSet<>();
+                        walkInterfaces(currentInterfaces, nextSuperclass);
+                        interfaces = currentInterfaces.iterator();
+                        return nextSuperclass;
+                    }
+
+                    private void walkInterfaces(final Set<Class<?>> addTo, 
final Class<?> c) {
+                        for (final Class<?> iface : c.getInterfaces()) {
+                            if (!seenInterfaces.contains(iface)) {
+                                addTo.add(iface);
+                            }
+                            walkInterfaces(addTo, iface);
+                        }
+                    }
+
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java
----------------------------------------------------------------------
diff --git 
a/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java 
b/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java
index 4734906..b8b044d 100644
--- a/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java
+++ b/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java
@@ -28,8 +28,11 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Stream;
 
+import org.apache.bval.util.ObjectUtils;
 import org.apache.bval.util.Validate;
 
 /**
@@ -148,13 +151,7 @@ public class TypeUtils {
          */
         @Override
         public int hashCode() {
-            int result = 71 << 4;
-            result |= raw.hashCode();
-            result <<= 4;
-            result |= useOwner == null ? 0 : useOwner.hashCode();
-            result <<= 8;
-            result |= Arrays.hashCode(typeArguments);
-            return result;
+            return Objects.hash(raw, useOwner, typeArguments);
         }
     }
 
@@ -162,7 +159,8 @@ public class TypeUtils {
      * WildcardType implementation class.
      */
     private static final class WildcardTypeImpl implements WildcardType {
-        private static final Type[] EMPTY_BOUNDS = new Type[0];
+        private static final Type[] EMPTY_UPPER_BOUNDS = { Object.class };
+        private static final Type[] EMPTY_LOWER_BOUNDS = new Type[0];
 
         private final Type[] upperBounds;
         private final Type[] lowerBounds;
@@ -173,8 +171,8 @@ public class TypeUtils {
          * @param lowerBounds of this type
          */
         private WildcardTypeImpl(final Type[] upperBounds, final Type[] 
lowerBounds) {
-            this.upperBounds = upperBounds != null ? upperBounds : 
EMPTY_BOUNDS;
-            this.lowerBounds = lowerBounds != null ? lowerBounds : 
EMPTY_BOUNDS;
+            this.upperBounds = ObjectUtils.isEmpty(upperBounds) ? 
EMPTY_UPPER_BOUNDS : upperBounds;
+            this.lowerBounds = lowerBounds == null ? EMPTY_LOWER_BOUNDS : 
lowerBounds;
         }
 
         /**
@@ -214,11 +212,7 @@ public class TypeUtils {
          */
         @Override
         public int hashCode() {
-            int result = 73 << 8;
-            result |= Arrays.hashCode(upperBounds);
-            result <<= 8;
-            result |= Arrays.hashCode(lowerBounds);
-            return result;
+            return Objects.hash(upperBounds, lowerBounds);
         }
     }
 
@@ -320,19 +314,13 @@ public class TypeUtils {
         if (type instanceof TypeVariable<?>) {
             // if any of the bounds are assignable to the class, then the
             // type is assignable to the class.
-            for (final Type bound : ((TypeVariable<?>) type).getBounds()) {
-                if (isAssignable(bound, toClass)) {
-                    return true;
-                }
-            }
-
-            return false;
+            return Stream.of(((TypeVariable<?>) 
type).getBounds()).anyMatch(bound -> isAssignable(bound, toClass));
         }
 
         // the only classes to which a generic array type can be assigned
         // are class Object and array classes
         if (type instanceof GenericArrayType) {
-            return toClass.equals(Object.class)
+            return Object.class.equals(toClass)
                     || toClass.isArray()
                     && isAssignable(((GenericArrayType) 
type).getGenericComponentType(), toClass
                             .getComponentType());
@@ -554,25 +542,15 @@ public class TypeUtils {
 
         if (type instanceof WildcardType) {
             // so long as one of the upper bounds is assignable, it's good
-            for (final Type bound : getImplicitUpperBounds((WildcardType) 
type)) {
-                if (isAssignable(bound, toGenericArrayType)) {
-                    return true;
-                }
-            }
-
-            return false;
+            return Stream.of(getImplicitUpperBounds((WildcardType) type))
+                .anyMatch(bound -> isAssignable(bound, toGenericArrayType));
         }
 
         if (type instanceof TypeVariable<?>) {
             // probably should remove the following logic and just return 
false.
             // type variables cannot specify arrays as bounds.
-            for (final Type bound : getImplicitBounds((TypeVariable<?>) type)) 
{
-                if (isAssignable(bound, toGenericArrayType)) {
-                    return true;
-                }
-            }
-
-            return false;
+            return Stream.of(getImplicitBounds((TypeVariable<?>) type))
+                .anyMatch(bound -> isAssignable(bound, toGenericArrayType));
         }
 
         if (type instanceof ParameterizedType) {
@@ -871,8 +849,7 @@ public class TypeUtils {
                     getRawType(parameterizedOwnerType), subtypeVarAssigns);
         } else {
             // no owner, prep the type variable assignments map
-            typeVarAssigns = subtypeVarAssigns == null ? new 
HashMap<TypeVariable<?>, Type>()
-                    : new HashMap<TypeVariable<?>, Type>(subtypeVarAssigns);
+            typeVarAssigns = subtypeVarAssigns == null ? new HashMap<>() : new 
HashMap<>(subtypeVarAssigns);
         }
 
         // get the subject parameterized type's arguments
@@ -917,7 +894,7 @@ public class TypeUtils {
             if (toClass.isPrimitive()) {
                 // dealing with widening here. No type arguments to be
                 // harvested with these two types.
-                return new HashMap<TypeVariable<?>, Type>();
+                return new HashMap<>();
             }
 
             // work with wrapper the wrapper class instead of the primitive
@@ -925,8 +902,8 @@ public class TypeUtils {
         }
 
         // create a copy of the incoming map, or an empty one if it's null
-        final HashMap<TypeVariable<?>, Type> typeVarAssigns = 
subtypeVarAssigns == null ? new HashMap<TypeVariable<?>, Type>()
-                : new HashMap<TypeVariable<?>, Type>(subtypeVarAssigns);
+        final Map<TypeVariable<?>, Type> typeVarAssigns =
+            subtypeVarAssigns == null ? new HashMap<>() : new 
HashMap<>(subtypeVarAssigns);
 
         // has target class been reached?
         if (toClass.equals(cls)) {
@@ -1030,7 +1007,7 @@ public class TypeUtils {
             return bounds;
         }
 
-        final Set<Type> types = new HashSet<Type>(bounds.length);
+        final Set<Type> types = new HashSet<>(bounds.length);
 
         for (final Type type1 : bounds) {
             boolean subtypeFound = false;
@@ -1243,7 +1220,7 @@ public class TypeUtils {
                 if (p.getOwnerType() == null) {
                     parameterizedTypeArguments = typeArguments;
                 } else {
-                    parameterizedTypeArguments = new HashMap<TypeVariable<?>, 
Type>(typeArguments);
+                    parameterizedTypeArguments = new HashMap<>(typeArguments);
                     
parameterizedTypeArguments.putAll(TypeUtils.getTypeArguments(p));
                 }
                 final Type[] args = p.getActualTypeArguments();

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/pom.xml
----------------------------------------------------------------------
diff --git a/bval-extras/pom.xml b/bval-extras/pom.xml
index 7a3edff..3dc7982 100644
--- a/bval-extras/pom.xml
+++ b/bval-extras/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.bval</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>1.1.3-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>bval-extras</artifactId>
@@ -69,7 +69,7 @@
             <dependencies>
                 <dependency>
                     <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-validation_1.1_spec</artifactId>
+                    <artifactId>geronimo-validation_2.0_spec</artifactId>
                     <scope>provided</scope>
                 </dependency>
             </dependencies>

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ABANumber.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ABANumber.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ABANumber.java
index 921ffbc..821b6aa 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ABANumber.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ABANumber.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = ABANumberValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface ABANumber {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/CUSIP.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/CUSIP.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/CUSIP.java
index 85e84fd..139ab50 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/CUSIP.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/CUSIP.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = CUSIPValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface CUSIP {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/EAN13.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/EAN13.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/EAN13.java
index 4f835f6..667c786 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/EAN13.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/EAN13.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = EAN13Validator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface EAN13 {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBAN.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBAN.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBAN.java
index f0685c0..c48173f 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBAN.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBAN.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = IBANValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface IBAN {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBANValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBANValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBANValidator.java
index 38eace6..1f392c7 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBANValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/IBANValidator.java
@@ -26,7 +26,7 @@ import static java.lang.Character.getNumericValue;
 /**
  * <b>IBAN</b> (International Bank Account Number) Check Digit 
calculation/validation.
  * <p>
- * This rountine is based on the ISO 7064 Mod 97,10 check digit caluclation 
routine.
+ * This routine is based on the ISO 7064 Mod 97,10 check digit caluclation 
routine.
  * <p>
  * The two check digit characters in a IBAN number are the third and fourth 
characters
  * in the code. For <i>check digit</i> calculation/validation the first four 
characters are moved
@@ -40,7 +40,7 @@ import static java.lang.Character.getNumericValue;
  *  <a 
href="http://en.wikipedia.org/wiki/International_Bank_Account_Number";>Wikipedia 
-
  *  IBAN number</a>.
  */
-public final class IBANValidator implements ConstraintValidator<IBAN, String> {
+public final class IBANValidator implements ConstraintValidator<IBAN, 
CharSequence> {
 
     private static final long MAX = 999999999;
 
@@ -50,12 +50,12 @@ public final class IBANValidator implements 
ConstraintValidator<IBAN, String> {
      * {@inheritDoc}
      */
     @Override
-    public boolean isValid(String code, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence code, ConstraintValidatorContext 
context) {
         if (code.length() < 5) {
             return false;
         }
 
-        String reformattedCode = code.substring(4) + code.substring(0, 4);
+        String reformattedCode = code.subSequence(4, code.length()).toString() 
+ code.subSequence(0, 4).toString();
         long total = 0;
         for (int i = 0; i < reformattedCode.length(); i++) {
             int charValue = getNumericValue(reformattedCode.charAt(i));

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ISBN10.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ISBN10.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ISBN10.java
index a3a1bc3..9ce9b19 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ISBN10.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ISBN10.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = ISBN10Validator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface ISBN10 {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Luhn.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Luhn.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Luhn.java
index 3bc186e..4e7ede5 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Luhn.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Luhn.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = LuhnValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Luhn {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ModulusValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ModulusValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ModulusValidator.java
index f25bea4..57d463d 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ModulusValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/ModulusValidator.java
@@ -38,7 +38,7 @@ import static java.lang.Character.isDigit;
  *
  * @param <A>
  */
-abstract class ModulusValidator<A extends Annotation> implements 
ConstraintValidator<A, String> {
+abstract class ModulusValidator<A extends Annotation> implements 
ConstraintValidator<A, CharSequence> {
 
     private final int modulus;
 
@@ -58,7 +58,7 @@ abstract class ModulusValidator<A extends Annotation> 
implements ConstraintValid
      * {@inheritDoc}
      */
     @Override
-    public boolean isValid(String code, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence code, ConstraintValidatorContext 
context) {
         if (code.length() == 0) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Sedol.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Sedol.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Sedol.java
index e69947c..67a2c01 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Sedol.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Sedol.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = SedolValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Sedol {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Verhoeff.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Verhoeff.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Verhoeff.java
index e051a39..d3afc67 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Verhoeff.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/Verhoeff.java
@@ -25,7 +25,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -40,7 +42,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  */
 @Documented
 @Constraint(validatedBy = VerhoeffValidator.class)
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Verhoeff {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/VerhoeffValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/VerhoeffValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/VerhoeffValidator.java
index 5a7d76b..b6c6249 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/VerhoeffValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/checkdigit/VerhoeffValidator.java
@@ -33,7 +33,7 @@ import static java.lang.Character.getNumericValue;
  * See <a href="http://en.wikipedia.org/wiki/Verhoeff_algorithm";>Wikipedia
  *  - Verhoeff algorithm</a> for more details.
  */
-public final class VerhoeffValidator implements ConstraintValidator<Verhoeff, 
String> {
+public final class VerhoeffValidator implements ConstraintValidator<Verhoeff, 
CharSequence> {
 
     //@formatter:off
     /** D - multiplication table */
@@ -65,7 +65,7 @@ public final class VerhoeffValidator implements 
ConstraintValidator<Verhoeff, St
      * {@inheritDoc}
      */
     @Override
-    public boolean isValid(String code, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence code, ConstraintValidatorContext 
context) {
         if (code.length() == 0) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/AmericanExpress.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/AmericanExpress.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/AmericanExpress.java
index 3d08d19..051d210 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/AmericanExpress.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/AmericanExpress.java
@@ -28,7 +28,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -45,7 +47,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 @Luhn
 @Pattern(regexp = "^(3[47]\\d{13})$")
 @Constraint(validatedBy = {})
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface AmericanExpress {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Diners.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Diners.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Diners.java
index de6fd35..efb0772 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Diners.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Diners.java
@@ -28,7 +28,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -45,7 +47,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 @Luhn
 @Pattern(regexp = "^(30[0-5]\\d{11}|3095\\d{10}|36\\d{12}|3[8-9]\\d{12})$")
 @Constraint(validatedBy = {})
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Diners {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Discover.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Discover.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Discover.java
index c445837..4e5ddd5 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Discover.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Discover.java
@@ -28,7 +28,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -45,7 +47,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 @Luhn
 @Pattern(regexp = "^((6011\\d{12})|(64[4-9]\\d{13})|(65\\d{14}))$")
 @Constraint(validatedBy = {})
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Discover {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Mastercard.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Mastercard.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Mastercard.java
index f30482e..1a9b6a5 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Mastercard.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/creditcard/Mastercard.java
@@ -28,7 +28,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
@@ -45,7 +47,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 @Luhn
 @Pattern(regexp = "^(5[1-5]\\d{14})$")
 @Constraint(validatedBy = {})
-@Target({ FIELD, ANNOTATION_TYPE, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface Mastercard {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/DirectoryValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/DirectoryValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/DirectoryValidator.java
index a95ebde..6bca3b7 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/DirectoryValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/DirectoryValidator.java
@@ -32,7 +32,7 @@ public class DirectoryValidator implements 
ConstraintValidator<Directory, File>
      */
     @Override
     public boolean isValid(File value, ConstraintValidatorContext context) {
-        return value.exists() && value.isDirectory();
+        return value.isDirectory();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/SymlinkValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/SymlinkValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/SymlinkValidator.java
index 6ed85fd..ef85896 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/SymlinkValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/file/SymlinkValidator.java
@@ -49,7 +49,7 @@ public class SymlinkValidator implements 
ConstraintValidator<Symlink, File> {
         }
 
         try {
-            File fileInCanonicalDir = null;
+            File fileInCanonicalDir;
             if (value.getParent() == null) {
                 fileInCanonicalDir = value;
             } else {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/DomainValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/DomainValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/DomainValidator.java
index b989531..c7668d5 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/DomainValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/DomainValidator.java
@@ -20,11 +20,12 @@ package org.apache.bval.extras.constraints.net;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
-import java.util.List;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static java.util.Arrays.asList;
+import java.util.Arrays;
+import java.util.HashSet;
 
 /**
  * <p><b>Domain name</b> validation routines.</p>
@@ -63,7 +64,7 @@ import static java.util.Arrays.asList;
  * {@link java.net.InetAddress} for that functionality.)
  * </p>
  */
-public class DomainValidator implements ConstraintValidator<Domain, String> {
+public class DomainValidator implements ConstraintValidator<Domain, 
CharSequence> {
 
     private boolean allowLocal;
 
@@ -77,15 +78,13 @@ public class DomainValidator implements 
ConstraintValidator<Domain, String> {
      * {@inheritDoc}
      */
     @Override
-    public boolean isValid(String domain, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence domain, ConstraintValidatorContext 
context) {
         Matcher matcher = DOMAIN_NAME_REGEX.matcher(domain);
         if (matcher.matches()) {
             domain = matcher.group(1);
-            return isValidTld(domain);
-        } else if (allowLocal && DOMAIN_LABEL.matcher(domain).matches()) {
-            return true;
+            return isValidTld(domain.toString());
         }
-        return false;
+        return allowLocal && DOMAIN_LABEL.matcher(domain).matches();
     }
 
     /**
@@ -154,7 +153,7 @@ public class DomainValidator implements 
ConstraintValidator<Domain, String> {
     }
 
     private static String chompLeadingDot(String str) {
-        if (str.startsWith(".")) {
+        if (str.charAt(0) == '.') {
             return str.substring(1);
         }
         return str;
@@ -165,11 +164,11 @@ public class DomainValidator implements 
ConstraintValidator<Domain, String> {
     // ----- Authoritative and comprehensive list at:
     // ----- http://data.iana.org/TLD/tlds-alpha-by-domain.txt
 
-    private static final List<String> INFRASTRUCTURE_TLDS = asList("arpa", // 
internet infrastructure
+    private static final Set<String> INFRASTRUCTURE_TLDS = new 
HashSet<>(Arrays.asList("arpa", // internet infrastructure
         "root" // diagnostic marker for non-truncated root zone
-    );
+    ));
 
-    private static final List<String> GENERIC_TLDS = asList("aero", // air 
transport industry
+    private static final Set<String> GENERIC_TLDS = new 
HashSet<>(Arrays.asList("aero", // air transport industry
         "asia", // Pan-Asia/Asia Pacific
         "biz", // businesses
         "cat", // Catalan linguistic/cultural community
@@ -189,9 +188,9 @@ public class DomainValidator implements 
ConstraintValidator<Domain, String> {
         "edu", // accredited postsecondary US education entities
         "mil", // United States Military
         "int" // organizations established by international treaty
-    );
+    ));
 
-    private static final List<String> COUNTRY_CODE_TLDS = asList("ac", // 
Ascension Island
+    private static final Set<String> COUNTRY_CODE_TLDS = new 
HashSet<>(Arrays.asList("ac", // Ascension Island
         "ad", // Andorra
         "ae", // United Arab Emirates
         "af", // Afghanistan
@@ -440,11 +439,11 @@ public class DomainValidator implements 
ConstraintValidator<Domain, String> {
         "za", // South Africa
         "zm", // Zambia
         "zw" // Zimbabwe
-    );
+    ));
 
-    private static final List<String> LOCAL_TLDS = asList("localhost", // 
RFC2606 defined
+    private static final Set<String> LOCAL_TLDS = new 
HashSet<>(Arrays.asList("localhost", // RFC2606 defined
         "localdomain" // Also widely used as localhost.localdomain
-    );
+    ));
 
     /**
      * {@inheritDoc}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/InetAddressValidator.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/InetAddressValidator.java
 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/InetAddressValidator.java
index 461562c..d482e01 100644
--- 
a/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/InetAddressValidator.java
+++ 
b/bval-extras/src/main/java/org/apache/bval/extras/constraints/net/InetAddressValidator.java
@@ -27,7 +27,7 @@ import java.util.regex.Pattern;
  *
  * <p>This class provides methods to validate a candidate IP address.
  */
-public class InetAddressValidator implements ConstraintValidator<InetAddress, 
String> {
+public class InetAddressValidator implements ConstraintValidator<InetAddress, 
CharSequence> {
 
     private static final Pattern IPV4_PATTERN =
         Pattern.compile("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
@@ -37,7 +37,7 @@ public class InetAddressValidator implements 
ConstraintValidator<InetAddress, St
      * {@inheritDoc}
      */
     @Override
-    public boolean isValid(String value, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence value, ConstraintValidatorContext 
context) {
         if (!IPV4_PATTERN.matcher(value).matches()) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/ABANumberValidatorTest.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/ABANumberValidatorTest.java
 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/ABANumberValidatorTest.java
index d186dcb..8cd2399 100644
--- 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/ABANumberValidatorTest.java
+++ 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/ABANumberValidatorTest.java
@@ -25,7 +25,7 @@ import java.lang.annotation.Annotation;
 public class ABANumberValidatorTest extends AbstractCheckDigitTest {
 
     @Override
-    protected ConstraintValidator<? extends Annotation, String> 
getConstraint() {
+    protected ConstraintValidator<? extends Annotation, ? super String> 
getConstraint() {
         return new ABANumberValidator();
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/AbstractCheckDigitTest.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/AbstractCheckDigitTest.java
 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/AbstractCheckDigitTest.java
index c25278f..190bd5b 100644
--- 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/AbstractCheckDigitTest.java
+++ 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/AbstractCheckDigitTest.java
@@ -37,7 +37,7 @@ public abstract class AbstractCheckDigitTest {
     private int checkDigitLth;
 
     /** Check digit routine being tested */
-    private ConstraintValidator<? extends Annotation, String> routine;
+    private ConstraintValidator<? extends Annotation, ? super String> routine;
 
     /** Array of valid code values */
     private String[] valid;
@@ -55,7 +55,7 @@ public abstract class AbstractCheckDigitTest {
         return 1;
     }
 
-    protected abstract ConstraintValidator<? extends Annotation, String> 
getConstraint();
+    protected abstract ConstraintValidator<? extends Annotation, ? super 
String> getConstraint();
 
     protected abstract String[] getValid();
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/CUSIPValidatorTest.java
----------------------------------------------------------------------
diff --git 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/CUSIPValidatorTest.java
 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/CUSIPValidatorTest.java
index 5bc57c3..fe13c4b 100644
--- 
a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/CUSIPValidatorTest.java
+++ 
b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/CUSIPValidatorTest.java
@@ -25,7 +25,7 @@ import java.lang.annotation.Annotation;
 public class CUSIPValidatorTest extends AbstractCheckDigitTest {
 
     @Override
-    protected ConstraintValidator<? extends Annotation, String> 
getConstraint() {
+    protected ConstraintValidator<? extends Annotation, ? super String> 
getConstraint() {
         return new CUSIPValidator();
     }
 

Reply via email to