You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2018/02/21 20:25:06 UTC

[10/11] bval git commit: implement BV 2.0 against existing BVal unit tests

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

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/IBANCheckDigitTest.java
----------------------------------------------------------------------
diff --git a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/IBANCheckDigitTest.java b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/IBANCheckDigitTest.java
index c0ea8e6..04cfd73 100644
--- a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/IBANCheckDigitTest.java
+++ b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/IBANCheckDigitTest.java
@@ -35,7 +35,7 @@ public class IBANCheckDigitTest extends AbstractCheckDigitTest {
     }
 
     @Override
-    protected ConstraintValidator<? extends Annotation, String> getConstraint() {
+    protected ConstraintValidator<? extends Annotation, ? super String> getConstraint() {
         return new IBANValidator();
     }
 

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

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/LuhnCheckDigitTest.java
----------------------------------------------------------------------
diff --git a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/LuhnCheckDigitTest.java b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/LuhnCheckDigitTest.java
index 06263e7..2b09d50 100644
--- a/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/LuhnCheckDigitTest.java
+++ b/bval-extras/src/test/java/org/apache/bval/extras/constraints/checkdigit/LuhnCheckDigitTest.java
@@ -37,7 +37,7 @@ public class LuhnCheckDigitTest extends AbstractCheckDigitTest {
     private static final String VALID_DINERS     = "30569309025904";
 
     @Override
-    protected ConstraintValidator<? extends Annotation, String> getConstraint() {
+    protected ConstraintValidator<? extends Annotation, ? super String> getConstraint() {
         return new LuhnValidator();
     }
 

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

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

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-extras/src/test/java/org/apache/bval/extras/constraints/net/InetAddressValidatorTest.java
----------------------------------------------------------------------
diff --git a/bval-extras/src/test/java/org/apache/bval/extras/constraints/net/InetAddressValidatorTest.java b/bval-extras/src/test/java/org/apache/bval/extras/constraints/net/InetAddressValidatorTest.java
index 9eba6ec..a79430d 100644
--- a/bval-extras/src/test/java/org/apache/bval/extras/constraints/net/InetAddressValidatorTest.java
+++ b/bval-extras/src/test/java/org/apache/bval/extras/constraints/net/InetAddressValidatorTest.java
@@ -27,7 +27,7 @@ import static org.junit.Assert.assertTrue;
 /**
  * Test cases for InetAddressValidator.
  *
- * @version $Revision$
+ * @version $Revision: 1766546 $
  */
 public class InetAddressValidatorTest {
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-json/pom.xml
----------------------------------------------------------------------
diff --git a/bval-json/pom.xml b/bval-json/pom.xml
index a489071..59dcb17 100644
--- a/bval-json/pom.xml
+++ b/bval-json/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-json</artifactId>

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/pom.xml
----------------------------------------------------------------------
diff --git a/bval-jsr/pom.xml b/bval-jsr/pom.xml
index e716645..561d2d4 100644
--- a/bval-jsr/pom.xml
+++ b/bval-jsr/pom.xml
@@ -24,7 +24,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-jsr</artifactId>
@@ -38,7 +38,7 @@
     </properties>
     <profiles>
         <!--
-            default profile using geronimo-validation_1.0_spec.jar active when
+            default profile using geronimo-validation_2.0_spec.jar active when
             property "ri" is not present.
         -->
         <profile>
@@ -51,7 +51,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>
@@ -215,6 +215,10 @@
             <version>1.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+	        <groupId>com.oracle</groupId>
+	        <artifactId>javafx</artifactId>
+        </dependency>
 
         <!-- Testing dependencies -->
         <dependency>
@@ -244,10 +248,10 @@
         </resources>
 
         <plugins>
-            <plugin> <!-- http://jira.codehaus.org/browse/MJAXB-37 -->
+            <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>jaxb2-maven-plugin</artifactId>
-                <version>1.4</version>
+                <version>2.3.1</version>
                 <executions>
                     <execution>
                         <goals>
@@ -258,8 +262,11 @@
                 <configuration>
                     <packageName>org.apache.bval.jsr.xml</packageName>
                     <extension>true</extension>
-                    <schemaFiles>validation-configuration-1.1.xsd,validation-mapping-1.1.xsd</schemaFiles>
                     <enableIntrospection>true</enableIntrospection>
+                    <sources>
+	                    <source>${project.basedir}/src/main/xsd/validation-configuration-2.0.xsd</source>
+	                    <source>${project.basedir}/src/main/xsd/validation-mapping-2.0.xsd</source>
+                    </sources>
                 </configuration>
             </plugin>
 

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/AnyLiteral.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/AnyLiteral.java b/bval-jsr/src/main/java/org/apache/bval/cdi/AnyLiteral.java
index 2b62c1e..1e14f1e 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/AnyLiteral.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/AnyLiteral.java
@@ -19,7 +19,6 @@
 package org.apache.bval.cdi;
 
 import javax.enterprise.inject.Any;
-import javax.enterprise.util.AnnotationLiteral;
 
 public class AnyLiteral extends EmptyAnnotationLiteral<Any> implements Any {
     private static final long serialVersionUID = 1L;
@@ -31,7 +30,7 @@ public class AnyLiteral extends EmptyAnnotationLiteral<Any> implements Any {
 
     @Override
     public String toString() {
-        return "@javax.enterprise.inject.Any()";
+        return String.format("@%s()", Any.class.getName());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
index a143a5b..2b08fe6 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
@@ -18,17 +18,16 @@
  */
 package org.apache.bval.cdi;
 
-import javax.enterprise.inject.spi.AnnotatedConstructor;
-import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedType;
-import javax.enterprise.util.AnnotationLiteral;
-
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.enterprise.inject.spi.AnnotatedConstructor;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
+
 public class BValAnnotatedType<A> implements AnnotatedType<A> {
     private final AnnotatedType<A> delegate;
     private final Set<Annotation> annotations;
@@ -36,8 +35,7 @@ public class BValAnnotatedType<A> implements AnnotatedType<A> {
     public BValAnnotatedType(final AnnotatedType<A> annotatedType) {
         delegate = annotatedType;
 
-        annotations = new HashSet<Annotation>(annotatedType.getAnnotations().size());
-        annotations.addAll(annotatedType.getAnnotations());
+        annotations = new HashSet<>(annotatedType.getAnnotations());
         annotations.add(BValBindingLiteral.INSTANCE);
     }
 
@@ -73,14 +71,8 @@ public class BValAnnotatedType<A> implements AnnotatedType<A> {
 
     @Override
     public <T extends Annotation> T getAnnotation(final Class<T> annotationType) {
-        for (final Annotation ann : annotations) {
-            if (ann.annotationType().equals(annotationType)) {
-                @SuppressWarnings("unchecked")
-                final T result = (T) ann;
-                return result;
-            }
-        }
-        return null;
+        return annotations.stream().filter(ann -> ann.annotationType().equals(annotationType)).map(annotationType::cast)
+            .findFirst().orElse(null);
     }
 
     @Override
@@ -90,12 +82,7 @@ public class BValAnnotatedType<A> implements AnnotatedType<A> {
 
     @Override
     public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
-        for (final Annotation ann : annotations) {
-            if (ann.annotationType().equals(annotationType)) {
-                return true;
-            }
-        }
-        return false;
+        return annotations.stream().anyMatch(ann -> ann.annotationType().equals(annotationType));
     }
 
     public static class BValBindingLiteral extends EmptyAnnotationLiteral<BValBinding> implements BValBinding {
@@ -105,7 +92,7 @@ public class BValAnnotatedType<A> implements AnnotatedType<A> {
 
         @Override
         public String toString() {
-            return "@org.apache.bval.cdi.BValBinding()";
+            return String.format("@%s()", BValBinding.class.getName());
         }
 
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
index f84074e..e10a9ba 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
@@ -59,13 +59,7 @@ import org.apache.bval.util.Validate;
 public class BValExtension implements Extension {
     private static final Logger LOGGER = Logger.getLogger(BValExtension.class.getName());
 
-    private static final AnnotatedTypeFilter DEFAULT_ANNOTATED_TYPE_FILTER = new AnnotatedTypeFilter() {
-
-        @Override
-        public boolean accept(AnnotatedType<?> annotatedType) {
-            return !annotatedType.getJavaClass().getName().startsWith("org.apache.bval.");
-        }
-    };
+    private static final AnnotatedTypeFilter DEFAULT_ANNOTATED_TYPE_FILTER = annotatedType -> !annotatedType.getJavaClass().getName().startsWith("org.apache.bval.");
 
     private static AnnotatedTypeFilter annotatedTypeFilter = DEFAULT_ANNOTATED_TYPE_FILTER;
 
@@ -183,8 +177,7 @@ public class BValExtension implements Extension {
                                 && !classConstraints.getConstrainedMethods(MethodType.NON_GETTER).isEmpty()
                             || validGetterMethods
                                 && !classConstraints.getConstrainedMethods(MethodType.GETTER).isEmpty())) {
-                        final BValAnnotatedType<A> bValAnnotatedType = new BValAnnotatedType<A>(annotatedType);
-                        pat.setAnnotatedType(bValAnnotatedType);
+                        pat.setAnnotatedType(new BValAnnotatedType<A>(annotatedType));
                     }
                 } catch (final NoClassDefFoundError ncdfe) {
                     // skip
@@ -199,12 +192,7 @@ public class BValExtension implements Extension {
 
     private static <A> boolean hasValidationAnnotation(
         final Collection<? extends AnnotatedCallable<? super A>> methods) {
-        for (final AnnotatedCallable<? super A> m : methods) {
-            if (m.isAnnotationPresent(ValidateOnExecution.class)) {
-                return true;
-            }
-        }
-        return false;
+        return methods.stream().anyMatch(m -> m.isAnnotationPresent(ValidateOnExecution.class));
     }
 
     public <A> void processBean(final @Observes ProcessBean<A> processBeanEvent) {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptor.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptor.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptor.java
index 3a7f000..7bf7709 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptor.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptor.java
@@ -18,8 +18,7 @@
  */
 package org.apache.bval.cdi;
 
-import org.apache.bval.jsr.util.ClassHelper;
-import org.apache.bval.jsr.util.Proxies;
+import static java.util.Arrays.asList;
 
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
@@ -33,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+
 import javax.annotation.Priority;
 import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedMethod;
@@ -53,18 +53,20 @@ import javax.validation.executable.ValidateOnExecution;
 import javax.validation.metadata.ConstructorDescriptor;
 import javax.validation.metadata.MethodDescriptor;
 
-import static java.util.Arrays.asList;
+import org.apache.bval.jsr.util.ClassHelper;
+import org.apache.bval.jsr.util.Proxies;
 
 /**
  * Interceptor class for the {@link BValBinding} {@link InterceptorBinding}.
  */
+@SuppressWarnings("serial")
 @Interceptor
 @BValBinding
 @Priority(4800)
 // TODO: maybe add it through ASM to be compliant with CDI 1.0 containers using simply this class as a template to
 // generate another one for CDI 1.1 impl
 public class BValInterceptor implements Serializable {
-    private transient volatile Map<Method, Boolean> methodConfiguration = new ConcurrentHashMap<Method, Boolean>();
+    private transient volatile Map<Method, Boolean> methodConfiguration = new ConcurrentHashMap<>();
     private transient volatile Set<ExecutableType> classConfiguration;
     private transient volatile Boolean constructorValidated;
 
@@ -204,7 +206,7 @@ public class BValInterceptor implements Serializable {
                 methodConfig = methodConfiguration.get(method);
                 if (methodConfig == null) {
                     final List<Class<?>> classHierarchy =
-                        ClassHelper.fillFullClassHierarchyAsList(new LinkedList<Class<?>>(), targetClass);
+                        ClassHelper.fillFullClassHierarchyAsList(new LinkedList<>(), targetClass);
                     Collections.reverse(classHierarchy);
 
                     // search on method @ValidateOnExecution
@@ -213,19 +215,19 @@ public class BValInterceptor implements Serializable {
                     for (final Class<?> c : classHierarchy) {
                         final AnnotatedType<?> annotatedType = CDI.current().getBeanManager().createAnnotatedType(c);
                         AnnotatedMethod<?> annotatedMethod = null;
+
                         for (final AnnotatedMethod<?> m : annotatedType.getMethods()) {
-                            if (!m.getJavaMember().getName().equals(method.getName())
-                                || !asList(method.getGenericParameterTypes())
+                            if (m.getJavaMember().getName().equals(method.getName())
+                                && asList(method.getGenericParameterTypes())
                                     .equals(asList(m.getJavaMember().getGenericParameterTypes()))) {
-                                continue;
+                                annotatedMethod = m;
+                                break;
                             }
-                            annotatedMethod = m;
-                            break;
+                        }
+                        if (annotatedMethod == null) {
+                            continue;
                         }
                         try {
-                            if (annotatedMethod == null) {
-                                continue;
-                            }
                             if (validateOnExecutionType == null) {
                                 final ValidateOnExecution vat = annotatedType.getAnnotation(ValidateOnExecution.class);
                                 if (vat != null) {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptorBean.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptorBean.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptorBean.java
index 8a0c95e..e8f7e1d 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptorBean.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValInterceptorBean.java
@@ -43,12 +43,12 @@ public class BValInterceptorBean implements Bean<BValInterceptor>, PassivationCa
     private final InjectionTarget<BValInterceptor> injectionTarget;
 
     public BValInterceptorBean(final BeanManager bm) {
-        final Set<Type> t = new HashSet<Type>();
+        final Set<Type> t = new HashSet<>();
         t.add(BValInterceptor.class);
         t.add(Object.class);
         types = Collections.unmodifiableSet(t);
 
-        final Set<Annotation> q = new HashSet<Annotation>();
+        final Set<Annotation> q = new HashSet<>();
         q.add(DefaultLiteral.INSTANCE);
         q.add(AnyLiteral.INSTANCE);
         qualifiers = Collections.unmodifiableSet(q);
@@ -120,7 +120,7 @@ public class BValInterceptorBean implements Bean<BValInterceptor>, PassivationCa
 
     @Override
     public String getId() {
-        return "BValInterceptor-" + hashCode();
+        return String.format("%s-%d",BValInterceptor.class.getSimpleName(), hashCode());
     }
 
     private static class BValInterceptorInjectionPoint implements InjectionPoint {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/DefaultLiteral.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/DefaultLiteral.java b/bval-jsr/src/main/java/org/apache/bval/cdi/DefaultLiteral.java
index 07b2246..e86db31 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/DefaultLiteral.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/DefaultLiteral.java
@@ -19,7 +19,6 @@
 package org.apache.bval.cdi;
 
 import javax.enterprise.inject.Default;
-import javax.enterprise.util.AnnotationLiteral;
 
 public class DefaultLiteral extends EmptyAnnotationLiteral<Default> implements Default {
     private static final long serialVersionUID = 1L;
@@ -28,6 +27,6 @@ public class DefaultLiteral extends EmptyAnnotationLiteral<Default> implements D
 
     @Override
     public String toString() {
-        return "@javax.enterprise.inject.Default()";
+        return String.format("@%s()", Default.class.getName());
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/EmptyAnnotationLiteral.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/EmptyAnnotationLiteral.java b/bval-jsr/src/main/java/org/apache/bval/cdi/EmptyAnnotationLiteral.java
index 6866551..e9e9f1a 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/EmptyAnnotationLiteral.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/EmptyAnnotationLiteral.java
@@ -29,6 +29,7 @@ import javax.enterprise.util.AnnotationLiteral;
  * Taken from Apache OpenWebBeans.
  * @param <T>
  */
+@SuppressWarnings("serial")
 public abstract class EmptyAnnotationLiteral<T extends Annotation> extends AnnotationLiteral<T> {
     private Class<T> annotationType;
 
@@ -77,11 +78,10 @@ public abstract class EmptyAnnotationLiteral<T extends Annotation> extends Annot
     private Class<T> getAnnotationType(Class<?> definedClazz) {
         Type superClazz = definedClazz.getGenericSuperclass();
 
-        Class<T> clazz = null;
-
-        if (superClazz.equals(Object.class)) {
-            throw new RuntimeException("Super class must be parametrized type!");
-        } else if (superClazz instanceof ParameterizedType) {
+        if (Object.class.equals(superClazz)) {
+            throw new RuntimeException("Super class must be parameterized type!");
+        }
+        if (superClazz instanceof ParameterizedType) {
             ParameterizedType paramType = (ParameterizedType) superClazz;
             Type[] actualArgs = paramType.getActualTypeArguments();
 
@@ -89,17 +89,15 @@ public abstract class EmptyAnnotationLiteral<T extends Annotation> extends Annot
                 //Actual annotation type
                 Type type = actualArgs[0];
 
-                if (type instanceof Class) {
-                    clazz = (Class<T>) type;
+                if (type instanceof Class<?>) {
+                    @SuppressWarnings("unchecked")
+                    Class<T> clazz = (Class<T>) type;
                     return clazz;
-                } else {
-                    throw new RuntimeException("Not class type!");
                 }
-            } else {
-                throw new RuntimeException("More than one parametric type!");
+                throw new RuntimeException("Not class type!");
             }
-        } else {
-            return getAnnotationType((Class<?>) superClazz);
+            throw new RuntimeException("More than one parametric type!");
         }
+        return getAnnotationType((Class<?>) superClazz);
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
index c551d72..cd17fae 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
@@ -44,12 +44,12 @@ public class ValidatorBean implements Bean<Validator>, PassivationCapable {
         this.factory = factory;
         this.instance = validator;
 
-        final Set<Type> t = new HashSet<Type>();
+        final Set<Type> t = new HashSet<>();
         t.add(Validator.class);
         t.add(Object.class);
         types = Collections.unmodifiableSet(t);
 
-        final Set<Annotation> q = new HashSet<Annotation>();
+        final Set<Annotation> q = new HashSet<>();
         q.add(DefaultLiteral.INSTANCE);
         q.add(AnyLiteral.INSTANCE);
         qualifiers = Collections.unmodifiableSet(q);
@@ -119,6 +119,6 @@ public class ValidatorBean implements Bean<Validator>, PassivationCapable {
 
     @Override
     public String getId() {
-        return "BValValidator-" + hashCode();
+        return String.format("BVal%s-%d", Validator.class.getSimpleName(), hashCode());
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
index aeffd81..0a8c2e5 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
@@ -41,12 +41,12 @@ public class ValidatorFactoryBean implements Bean<ValidatorFactory>, Passivation
     public ValidatorFactoryBean(final ValidatorFactory validatorFactory) {
         this.instance = validatorFactory;
 
-        final Set<Type> t = new HashSet<Type>();
+        final Set<Type> t = new HashSet<>();
         t.add(ValidatorFactory.class);
         t.add(Object.class);
         types = Collections.unmodifiableSet(t);
 
-        final Set<Annotation> q = new HashSet<Annotation>();
+        final Set<Annotation> q = new HashSet<>();
         q.add(DefaultLiteral.INSTANCE);
         q.add(AnyLiteral.INSTANCE);
         qualifiers = Collections.unmodifiableSet(q);
@@ -109,6 +109,6 @@ public class ValidatorFactoryBean implements Bean<ValidatorFactory>, Passivation
 
     @Override
     public String getId() {
-        return "BValValidatorFactory-" + hashCode();
+        return String.format("BVal%s-%d", ValidatorFactory.class.getSimpleName(), hashCode());
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertFalseValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertFalseValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/AssertFalseValidator.java
index 9eb4a14..143b76a 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertFalseValidator.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/AssertFalseValidator.java
@@ -28,12 +28,8 @@ import javax.validation.constraints.AssertFalse;
 public class AssertFalseValidator implements ConstraintValidator<AssertFalse, Boolean> {
 
     @Override
-    public void initialize(AssertFalse annotation) {
-    }
-
-    @Override
     public boolean isValid(Boolean value, ConstraintValidatorContext context) {
-        return value == null || Boolean.FALSE.equals(value);
+        return !Boolean.TRUE.equals(value);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertTrueValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertTrueValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/AssertTrueValidator.java
index 47ee7f6..93ae933 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/AssertTrueValidator.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/AssertTrueValidator.java
@@ -28,12 +28,8 @@ import javax.validation.constraints.AssertTrue;
 public class AssertTrueValidator implements ConstraintValidator<AssertTrue, Boolean> {
 
     @Override
-    public void initialize(AssertTrue annotation) {
-    }
-
-    @Override
     public boolean isValid(Boolean value, ConstraintValidatorContext context) {
-        return value == null || Boolean.TRUE.equals(value);
+        return !Boolean.FALSE.equals(value);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForNumber.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForNumber.java b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForNumber.java
index dd0c210..725613c 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForNumber.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForNumber.java
@@ -43,12 +43,14 @@ public class DecimalMaxValidatorForNumber implements ConstraintValidator<Decimal
         if (value == null) {
             return true;
         }
+        BigDecimal bigValue;
         if (value instanceof BigDecimal) {
-            return ((BigDecimal) value).compareTo(maxValue) != 1;
+            bigValue = (BigDecimal) value;
+        } else if (value instanceof BigInteger) {
+            bigValue = new BigDecimal((BigInteger) value);
+        } else {
+            bigValue = new BigDecimal(value.doubleValue());
         }
-        if (value instanceof BigInteger) {
-            return (new BigDecimal((BigInteger) value)).compareTo(maxValue) != 1;
-        }
-        return (new BigDecimal(value.doubleValue()).compareTo(maxValue)) != 1;
+        return bigValue.compareTo(maxValue) < 1;
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForString.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForString.java b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForString.java
index a247297..cb0e232 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForString.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMaxValidatorForString.java
@@ -46,7 +46,7 @@ public class DecimalMaxValidatorForString implements ConstraintValidator<Decimal
             return true;
         }
         try {
-            return new BigDecimal(value).compareTo(maxValue) != 1;
+            return new BigDecimal(value).compareTo(maxValue) < 1;
         } catch (NumberFormatException nfe) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForNumber.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForNumber.java b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForNumber.java
index 74ed17a..17c6c38 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForNumber.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForNumber.java
@@ -43,12 +43,14 @@ public class DecimalMinValidatorForNumber implements ConstraintValidator<Decimal
         if (value == null) {
             return true;
         }
+        BigDecimal bigValue;
         if (value instanceof BigDecimal) {
-            return ((BigDecimal) value).compareTo(minValue) != -1;
+            bigValue = (BigDecimal) value;
+        } else if (value instanceof BigInteger) {
+            bigValue = new BigDecimal((BigInteger) value);
+        } else {
+            bigValue = new BigDecimal(value.doubleValue());
         }
-        if (value instanceof BigInteger) {
-            return (new BigDecimal((BigInteger) value)).compareTo(minValue) != -1;
-        }
-        return (new BigDecimal(value.doubleValue()).compareTo(minValue)) != -1;
+        return bigValue.compareTo(minValue) >= 0;
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForString.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForString.java b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForString.java
index 8110f8e..ef62387 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForString.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/DecimalMinValidatorForString.java
@@ -48,7 +48,7 @@ public class DecimalMinValidatorForString implements ConstraintValidator<Decimal
             return true;
         }
         try {
-            return new BigDecimal(value).compareTo(minValue) != -1;
+            return new BigDecimal(value).compareTo(minValue) >= 0;
         } catch (NumberFormatException nfe) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/Email.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/Email.java b/bval-jsr/src/main/java/org/apache/bval/constraints/Email.java
index 2d66d28..f1f9435 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/Email.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/Email.java
@@ -19,34 +19,41 @@
 package org.apache.bval.constraints;
 
 import javax.validation.Constraint;
+import javax.validation.OverridesAttribute;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
 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.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
  * <p>
  * --
- * TODO - This class is NOT part of the bean_validation spec and might disappear
- * as soon as a final version of the specification contains a similar functionality.
+ * NOTE - This constraint predates the equivalent version from the bean_validation spec.
  * --
  * </p>
  * Description: annotation to validate an email address (by pattern)<br/>
  */
+@Deprecated
 @Documented
-@Constraint(validatedBy = EmailValidator.class)
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, PARAMETER })
+@Constraint(validatedBy = {})
+@javax.validation.constraints.Email
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 public @interface Email {
+    @OverridesAttribute(constraint = javax.validation.constraints.Email.class, name = "groups")
     Class<?>[] groups() default {};
 
+    @OverridesAttribute(constraint = javax.validation.constraints.Email.class, name = "message")
     String message() default "{org.apache.bval.constraints.Email.message}";
 
+    @OverridesAttribute(constraint = javax.validation.constraints.Email.class, name = "payload")
     Class<? extends Payload>[] payload() default {};
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/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 bcdf0fe..b20806b 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
@@ -26,15 +26,10 @@ import javax.validation.ConstraintValidatorContext;
 /**
  * Description: <br/>
  */
-public class EmailValidator implements ConstraintValidator<Email, CharSequence> {
+public class EmailValidator implements ConstraintValidator<javax.validation.constraints.Email, CharSequence> {
 
     @Override
     public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
         return EMailValidationUtils.isValid(value);
     }
-
-    @Override
-    public void initialize(Email parameters) {
-        // do nothing (as long as Email has no properties)
-    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/FutureOrPresentValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/FutureOrPresentValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/FutureOrPresentValidator.java
new file mode 100644
index 0000000..4cc85b1
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/FutureOrPresentValidator.java
@@ -0,0 +1,138 @@
+/*
+ * 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.time.Clock;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.ZonedDateTime;
+import java.time.chrono.ChronoLocalDate;
+import java.time.chrono.ChronoLocalDateTime;
+import java.time.chrono.ChronoZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.function.Function;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.constraints.FutureOrPresent;
+
+/**
+ * Defines built-in {@link ConstraintValidator} implementations for {@link FutureOrPresent}.
+ *
+ * @param <T>
+ *            validated type
+ */
+public abstract class FutureOrPresentValidator<T extends Comparable<T>> extends TimeValidator<FutureOrPresent, T> {
+
+    public static class ForDate extends FutureOrPresentValidator<Date> {
+
+        public ForDate() {
+            super(clock -> Date.from(clock.instant()));
+        }
+    }
+
+    public static class ForCalendar extends FutureOrPresentValidator<Calendar> {
+
+        public ForCalendar() {
+            super(clock -> GregorianCalendar.from(clock.instant().atZone(clock.getZone())));
+        }
+    }
+
+    public static class ForInstant extends FutureOrPresentValidator<Instant> {
+
+        public ForInstant() {
+            super(Instant::now);
+        }
+    }
+
+    public static class ForChronoLocalDate extends FutureOrPresentValidator<ChronoLocalDate> {
+
+        public ForChronoLocalDate() {
+            super(LocalDate::now);
+        }
+    }
+
+    public static class ForChronoLocalDateTime extends FutureOrPresentValidator<ChronoLocalDateTime<?>> {
+
+        public ForChronoLocalDateTime() {
+            super(LocalDateTime::now);
+        }
+    }
+
+    public static class ForLocalTime extends FutureOrPresentValidator<LocalTime> {
+
+        public ForLocalTime() {
+            super(LocalTime::now);
+        }
+    }
+
+    public static class ForOffsetDateTime extends FutureOrPresentValidator<OffsetDateTime> {
+
+        public ForOffsetDateTime() {
+            super(OffsetDateTime::now);
+        }
+    }
+
+    public static class ForOffsetTime extends FutureOrPresentValidator<OffsetTime> {
+
+        public ForOffsetTime() {
+            super(OffsetTime::now);
+        }
+    }
+
+    public static class ForChronoZonedDateTime extends FutureOrPresentValidator<ChronoZonedDateTime<?>> {
+
+        public ForChronoZonedDateTime() {
+            super(ZonedDateTime::now);
+        }
+    }
+
+    public static class ForMonthDay extends FutureOrPresentValidator<MonthDay> {
+
+        public ForMonthDay() {
+            super(MonthDay::now);
+        }
+    }
+
+    public static class ForYear extends FutureOrPresentValidator<Year> {
+
+        public ForYear() {
+            super(Year::now);
+        }
+    }
+
+    public static class ForYearMonth extends FutureOrPresentValidator<YearMonth> {
+
+        public ForYearMonth() {
+            super(YearMonth::now);
+        }
+    }
+
+    protected FutureOrPresentValidator(Function<Clock, T> now) {
+        super(now, n -> n >= 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/FutureValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/FutureValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/FutureValidator.java
new file mode 100644
index 0000000..dd6116b
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/FutureValidator.java
@@ -0,0 +1,138 @@
+/*
+ * 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.time.Clock;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.ZonedDateTime;
+import java.time.chrono.ChronoLocalDate;
+import java.time.chrono.ChronoLocalDateTime;
+import java.time.chrono.ChronoZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.function.Function;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.constraints.Future;
+
+/**
+ * Defines built-in {@link ConstraintValidator} implementations for {@link Future}.
+ *
+ * @param <T>
+ *            validated type
+ */
+public abstract class FutureValidator<T extends Comparable<T>> extends TimeValidator<Future, T> {
+
+    public static class ForDate extends FutureValidator<Date> {
+
+        public ForDate() {
+            super(clock -> Date.from(clock.instant()));
+        }
+    }
+
+    public static class ForCalendar extends FutureValidator<Calendar> {
+
+        public ForCalendar() {
+            super(clock -> GregorianCalendar.from(clock.instant().atZone(clock.getZone())));
+        }
+    }
+
+    public static class ForInstant extends FutureValidator<Instant> {
+
+        public ForInstant() {
+            super(Instant::now);
+        }
+    }
+
+    public static class ForChronoLocalDate extends FutureValidator<ChronoLocalDate> {
+
+        public ForChronoLocalDate() {
+            super(LocalDate::now);
+        }
+    }
+
+    public static class ForChronoLocalDateTime extends FutureValidator<ChronoLocalDateTime<?>> {
+
+        public ForChronoLocalDateTime() {
+            super(LocalDateTime::now);
+        }
+    }
+
+    public static class ForLocalTime extends FutureValidator<LocalTime> {
+
+        public ForLocalTime() {
+            super(LocalTime::now);
+        }
+    }
+
+    public static class ForOffsetDateTime extends FutureValidator<OffsetDateTime> {
+
+        public ForOffsetDateTime() {
+            super(OffsetDateTime::now);
+        }
+    }
+
+    public static class ForOffsetTime extends FutureValidator<OffsetTime> {
+
+        public ForOffsetTime() {
+            super(OffsetTime::now);
+        }
+    }
+
+    public static class ForChronoZonedDateTime extends FutureValidator<ChronoZonedDateTime<?>> {
+
+        public ForChronoZonedDateTime() {
+            super(ZonedDateTime::now);
+        }
+    }
+
+    public static class ForMonthDay extends FutureValidator<MonthDay> {
+
+        public ForMonthDay() {
+            super(MonthDay::now);
+        }
+    }
+
+    public static class ForYear extends FutureValidator<Year> {
+
+        public ForYear() {
+            super(Year::now);
+        }
+    }
+
+    public static class ForYearMonth extends FutureValidator<YearMonth> {
+
+        public ForYearMonth() {
+            super(YearMonth::now);
+        }
+    }
+
+    protected FutureValidator(Function<Clock, T> now) {
+        super(now, n -> n > 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForNumber.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForNumber.java b/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForNumber.java
index 78524f9..0ad81a8 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForNumber.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForNumber.java
@@ -43,10 +43,10 @@ public class MaxValidatorForNumber implements ConstraintValidator<Max, Number> {
             return true;
         }
         if (value instanceof BigDecimal) {
-            return ((BigDecimal) value).compareTo(BigDecimal.valueOf(max)) != 1;
+            return ((BigDecimal) value).compareTo(BigDecimal.valueOf(max)) < 1;
         }
         if (value instanceof BigInteger) {
-            return ((BigInteger) value).compareTo(BigInteger.valueOf(max)) != 1;
+            return ((BigInteger) value).compareTo(BigInteger.valueOf(max)) < 1;
         }
         return value.longValue() <= max;
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForString.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForString.java b/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForString.java
index 4170a5c..f14f8e7 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForString.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/MaxValidatorForString.java
@@ -42,7 +42,7 @@ public class MaxValidatorForString implements ConstraintValidator<Max, String> {
             return true;
         }
         try {
-            return new BigDecimal(value).compareTo(BigDecimal.valueOf(max)) != 1;
+            return new BigDecimal(value).compareTo(BigDecimal.valueOf(max)) < 1;
         } catch (NumberFormatException nfe) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForNumber.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForNumber.java b/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForNumber.java
index b5aeaad..c467de2 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForNumber.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForNumber.java
@@ -42,10 +42,10 @@ public class MinValidatorForNumber implements ConstraintValidator<Min, Number> {
             return true;
         }
         if (value instanceof BigDecimal) {
-            return ((BigDecimal) value).compareTo(BigDecimal.valueOf(minValue)) != -1;
+            return ((BigDecimal) value).compareTo(BigDecimal.valueOf(minValue)) >= 0;
         }
         if (value instanceof BigInteger) {
-            return ((BigInteger) value).compareTo(BigInteger.valueOf(minValue)) != -1;
+            return ((BigInteger) value).compareTo(BigInteger.valueOf(minValue)) >= 0;
         }
         return value.longValue() >= minValue;
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForString.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForString.java b/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForString.java
index bd3a4dd..5d45fc2 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForString.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/MinValidatorForString.java
@@ -42,7 +42,7 @@ public class MinValidatorForString implements ConstraintValidator<Min, String> {
             return true;
         }
         try {
-            return new BigDecimal(value).compareTo(BigDecimal.valueOf(minValue)) != -1;
+            return new BigDecimal(value).compareTo(BigDecimal.valueOf(minValue)) >= 0;
         } catch (NumberFormatException nfe) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotBlankValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotBlankValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotBlankValidator.java
new file mode 100644
index 0000000..e201c0d
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotBlankValidator.java
@@ -0,0 +1,34 @@
+/*
+ * 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 javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Validate {@link NotBlank} for {@link CharSequence}.
+ */
+public class NotBlankValidator implements ConstraintValidator<NotBlank, CharSequence> {
+
+    @Override
+    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
+        return value == null || value.length() > 0 && !value.chars().allMatch(Character::isWhitespace);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmpty.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmpty.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmpty.java
index ffa8cf8..00497ea 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmpty.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmpty.java
@@ -18,18 +18,22 @@
  */
 package org.apache.bval.constraints;
 
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.Documented;
-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.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.OverridesAttribute;
+import javax.validation.Payload;
+
 /**
  * <pre>
  * This class is NOT part of the bean_validation spec and might disappear
@@ -37,14 +41,20 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  * </pre>
  */
 @Documented
-@Constraint(validatedBy = { NotEmptyValidatorForCollection.class, NotEmptyValidatorForMap.class,
-    NotEmptyValidatorForString.class, NotEmptyValidator.class })
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, PARAMETER })
+@Constraint(validatedBy = {})
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
+@javax.validation.constraints.NotEmpty
+@Deprecated
 public @interface NotEmpty {
     Class<?>[] groups() default {};
 
+    @OverridesAttribute(constraint = javax.validation.constraints.NotEmpty.class, name = "message")
     String message() default "{org.apache.bval.constraints.NotEmpty.message}";
 
     Class<? extends Payload>[] payload() default {};
+
+    public @interface List {
+        NotEmpty[] value();
+    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
index 4316b39..92c8739 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
@@ -25,14 +25,10 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
- * Description:  Check the non emptyness of an
+ * Description:  Check the non emptiness of an
  * any object that has a public isEmpty():boolean or a valid toString() method
  */
-public class NotEmptyValidator implements ConstraintValidator<NotEmpty, Object> {
-    @Override
-    public void initialize(NotEmpty constraintAnnotation) {
-        // do nothing
-    }
+public class NotEmptyValidator implements ConstraintValidator<javax.validation.constraints.NotEmpty, Object> {
 
     @Override
     public boolean isValid(Object value, ConstraintValidatorContext context) {
@@ -45,15 +41,12 @@ public class NotEmptyValidator implements ConstraintValidator<NotEmpty, Object>
         try {
             final Method isEmptyMethod = value.getClass().getMethod("isEmpty");
             if (isEmptyMethod != null) {
-                return !((Boolean) isEmptyMethod.invoke(value)).booleanValue();
+                return !Boolean.TRUE.equals(isEmptyMethod.invoke(value));
             }
-        } catch (IllegalAccessException iae) {
-            // do nothing
-        } catch (NoSuchMethodException nsme) {
-            // do nothing
-        } catch (InvocationTargetException ite) {
+        } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException iae) {
             // do nothing
         }
-        return !value.toString().isEmpty();
+        final String s = value.toString();
+        return s != null && !s.isEmpty();
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java
new file mode 100644
index 0000000..320c105
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java
@@ -0,0 +1,34 @@
+/*
+ * 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 javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * Description: <br/>
+ */
+public class NotEmptyValidatorForCharSequence
+    implements ConstraintValidator<javax.validation.constraints.NotEmpty, CharSequence> {
+
+    @Override
+    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
+        return value == null || value.length() > 0;
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
index 5faab13..da0c438 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
@@ -25,11 +25,8 @@ import java.util.Collection;
 /**
  * Description: <br/>
  */
-public class NotEmptyValidatorForCollection implements ConstraintValidator<NotEmpty, Collection<?>> {
-    @Override
-    public void initialize(NotEmpty constraintAnnotation) {
-        // do nothing
-    }
+public class NotEmptyValidatorForCollection
+    implements ConstraintValidator<javax.validation.constraints.NotEmpty, Collection<?>> {
 
     @Override
     public boolean isValid(Collection<?> value, ConstraintValidatorContext context) {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
index b5a4f49..6a5221e 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
@@ -25,11 +25,7 @@ import java.util.Map;
 /**
  * Description: <br/>
  */
-public class NotEmptyValidatorForMap implements ConstraintValidator<NotEmpty, Map<?, ?>> {
-    @Override
-    public void initialize(NotEmpty constraintAnnotation) {
-        // do nothing
-    }
+public class NotEmptyValidatorForMap implements ConstraintValidator<javax.validation.constraints.NotEmpty, Map<?, ?>> {
 
     @Override
     public boolean isValid(Map<?, ?> value, ConstraintValidatorContext context) {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForString.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForString.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForString.java
deleted file mode 100644
index 9fc3023..0000000
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForString.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
-/**
- * Description: <br/>
- */
-public class NotEmptyValidatorForString implements ConstraintValidator<NotEmpty, String> {
-    @Override
-    public void initialize(NotEmpty constraintAnnotation) {
-        // do nothing
-    }
-
-    @Override
-    public boolean isValid(String value, ConstraintValidatorContext context) {
-        return value == null || !value.isEmpty();
-    }
-}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NotNullValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NotNullValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NotNullValidator.java
index b39d493..c14cff2 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NotNullValidator.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NotNullValidator.java
@@ -24,10 +24,6 @@ import javax.validation.constraints.NotNull;
 
 /** valid when object is NOT null */
 public class NotNullValidator implements ConstraintValidator<NotNull, Object> {
-    @Override
-    public void initialize(NotNull constraintAnnotation) {
-        // do nothing
-    }
 
     @Override
     public boolean isValid(Object value, ConstraintValidatorContext context) {

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NullValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NullValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NullValidator.java
index 7c16296..523ef75 100644
--- a/bval-jsr/src/main/java/org/apache/bval/constraints/NullValidator.java
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NullValidator.java
@@ -28,11 +28,6 @@ import javax.validation.constraints.Null;
 public class NullValidator implements ConstraintValidator<Null, Object> {
 
     @Override
-    public void initialize(Null annotation) {
-        // do nothing
-    }
-
-    @Override
     public boolean isValid(Object object, ConstraintValidatorContext context) {
         return object == null;
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/NumberSignValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/NumberSignValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/NumberSignValidator.java
new file mode 100644
index 0000000..fe8f59c
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/NumberSignValidator.java
@@ -0,0 +1,68 @@
+/*
+ * 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.util.function.IntPredicate;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.Negative;
+
+import org.apache.bval.util.Validate;
+
+/**
+ * Description: validate positive/negative number values.
+ */
+public abstract class NumberSignValidator implements ConstraintValidator<Negative, Number> {
+    public static class ForPositive extends NumberSignValidator {
+        public static class OrZero extends NumberSignValidator {
+            public OrZero() {
+                super(n -> n >= 0);
+            }
+        }
+
+        public ForPositive() {
+            super(n -> n > 0);
+        }
+    }
+
+    public static class ForNegative extends NumberSignValidator {
+        public static class OrZero extends NumberSignValidator {
+            public OrZero() {
+                super(n -> n <= 0);
+            }
+        }
+
+        public ForNegative() {
+            super(n -> n < 0);
+        }
+    }
+    
+    private final IntPredicate comparisonTest;
+    
+    protected NumberSignValidator(IntPredicate comparisonTest) {
+        super();
+        this.comparisonTest = Validate.notNull(comparisonTest);
+    }
+
+    @Override
+    public boolean isValid(Number value, ConstraintValidatorContext context) {
+        return value == null || comparisonTest.test(Double.compare(value.doubleValue(), 0.0));
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/PastOrPresentValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/PastOrPresentValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/PastOrPresentValidator.java
new file mode 100644
index 0000000..d1e3e19
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/PastOrPresentValidator.java
@@ -0,0 +1,138 @@
+/*
+ * 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.time.Clock;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.ZonedDateTime;
+import java.time.chrono.ChronoLocalDate;
+import java.time.chrono.ChronoLocalDateTime;
+import java.time.chrono.ChronoZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.function.Function;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.constraints.PastOrPresent;
+
+/**
+ * Defines built-in {@link ConstraintValidator} implementations for {@link PastOrPresent}.
+ *
+ * @param <T>
+ *            validated type
+ */
+public abstract class PastOrPresentValidator<T extends Comparable<T>> extends TimeValidator<PastOrPresent, T> {
+
+    public static class ForDate extends PastOrPresentValidator<Date> {
+
+        public ForDate() {
+            super(clock -> Date.from(clock.instant()));
+        }
+    }
+
+    public static class ForCalendar extends PastOrPresentValidator<Calendar> {
+
+        public ForCalendar() {
+            super(clock -> GregorianCalendar.from(clock.instant().atZone(clock.getZone())));
+        }
+    }
+
+    public static class ForInstant extends PastOrPresentValidator<Instant> {
+
+        public ForInstant() {
+            super(Instant::now);
+        }
+    }
+
+    public static class ForChronoLocalDate extends PastOrPresentValidator<ChronoLocalDate> {
+
+        public ForChronoLocalDate() {
+            super(LocalDate::now);
+        }
+    }
+
+    public static class ForChronoLocalDateTime extends PastOrPresentValidator<ChronoLocalDateTime<?>> {
+
+        public ForChronoLocalDateTime() {
+            super(LocalDateTime::now);
+        }
+    }
+
+    public static class ForLocalTime extends PastOrPresentValidator<LocalTime> {
+
+        public ForLocalTime() {
+            super(LocalTime::now);
+        }
+    }
+
+    public static class ForOffsetDateTime extends PastOrPresentValidator<OffsetDateTime> {
+
+        public ForOffsetDateTime() {
+            super(OffsetDateTime::now);
+        }
+    }
+
+    public static class ForOffsetTime extends PastOrPresentValidator<OffsetTime> {
+
+        public ForOffsetTime() {
+            super(OffsetTime::now);
+        }
+    }
+
+    public static class ForChronoZonedDateTime extends PastOrPresentValidator<ChronoZonedDateTime<?>> {
+
+        public ForChronoZonedDateTime() {
+            super(ZonedDateTime::now);
+        }
+    }
+
+    public static class ForMonthDay extends PastOrPresentValidator<MonthDay> {
+
+        public ForMonthDay() {
+            super(MonthDay::now);
+        }
+    }
+
+    public static class ForYear extends PastOrPresentValidator<Year> {
+
+        public ForYear() {
+            super(Year::now);
+        }
+    }
+
+    public static class ForYearMonth extends PastOrPresentValidator<YearMonth> {
+
+        public ForYearMonth() {
+            super(YearMonth::now);
+        }
+    }
+
+    protected PastOrPresentValidator(Function<Clock, T> now) {
+        super(now, n -> n <= 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/PastValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/PastValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/PastValidator.java
new file mode 100644
index 0000000..0136d83
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/PastValidator.java
@@ -0,0 +1,138 @@
+/*
+ * 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.time.Clock;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.ZonedDateTime;
+import java.time.chrono.ChronoLocalDate;
+import java.time.chrono.ChronoLocalDateTime;
+import java.time.chrono.ChronoZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.function.Function;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.constraints.Past;
+
+/**
+ * Defines built-in {@link ConstraintValidator} implementations for {@link Past}.
+ *
+ * @param <T>
+ *            validated type
+ */
+public abstract class PastValidator<T extends Comparable<T>> extends TimeValidator<Past, T> {
+
+    public static class ForDate extends PastValidator<Date> {
+
+        public ForDate() {
+            super(clock -> Date.from(clock.instant()));
+        }
+    }
+
+    public static class ForCalendar extends PastValidator<Calendar> {
+
+        public ForCalendar() {
+            super(clock -> GregorianCalendar.from(clock.instant().atZone(clock.getZone())));
+        }
+    }
+
+    public static class ForInstant extends PastValidator<Instant> {
+
+        public ForInstant() {
+            super(Instant::now);
+        }
+    }
+
+    public static class ForChronoLocalDate extends PastValidator<ChronoLocalDate> {
+
+        public ForChronoLocalDate() {
+            super(LocalDate::now);
+        }
+    }
+
+    public static class ForChronoLocalDateTime extends PastValidator<ChronoLocalDateTime<?>> {
+
+        public ForChronoLocalDateTime() {
+            super(LocalDateTime::now);
+        }
+    }
+
+    public static class ForLocalTime extends PastValidator<LocalTime> {
+
+        public ForLocalTime() {
+            super(LocalTime::now);
+        }
+    }
+
+    public static class ForOffsetDateTime extends PastValidator<OffsetDateTime> {
+
+        public ForOffsetDateTime() {
+            super(OffsetDateTime::now);
+        }
+    }
+
+    public static class ForOffsetTime extends PastValidator<OffsetTime> {
+
+        public ForOffsetTime() {
+            super(OffsetTime::now);
+        }
+    }
+
+    public static class ForChronoZonedDateTime extends PastValidator<ChronoZonedDateTime<?>> {
+
+        public ForChronoZonedDateTime() {
+            super(ZonedDateTime::now);
+        }
+    }
+
+    public static class ForMonthDay extends PastValidator<MonthDay> {
+
+        public ForMonthDay() {
+            super(MonthDay::now);
+        }
+    }
+
+    public static class ForYear extends PastValidator<Year> {
+
+        public ForYear() {
+            super(Year::now);
+        }
+    }
+
+    public static class ForYearMonth extends PastValidator<YearMonth> {
+
+        public ForYearMonth() {
+            super(YearMonth::now);
+        }
+    }
+
+    protected PastValidator(Function<Clock, T> now) {
+        super(now, n -> n < 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/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 9534e6b..8a53062 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
@@ -27,7 +27,7 @@ import java.util.regex.PatternSyntaxException;
  * validator using a regular expression,
  * based on the jsr Pattern constraint annotation.
  */
-public class PatternValidator implements ConstraintValidator<Pattern, String> {
+public class PatternValidator implements ConstraintValidator<Pattern, CharSequence> {
     protected java.util.regex.Pattern pattern;
 
     @Override
@@ -46,7 +46,7 @@ public class PatternValidator implements ConstraintValidator<Pattern, String> {
     }
 
     @Override
-    public boolean isValid(String value, ConstraintValidatorContext context) {
+    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
         return value == null || pattern.matcher(value).matches();
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/constraints/TimeValidator.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/constraints/TimeValidator.java b/bval-jsr/src/main/java/org/apache/bval/constraints/TimeValidator.java
new file mode 100644
index 0000000..02e3836
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/constraints/TimeValidator.java
@@ -0,0 +1,44 @@
+/*
+ * 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.time.Clock;
+import java.util.function.Function;
+import java.util.function.IntPredicate;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+public abstract class TimeValidator<A extends Annotation, T extends Comparable<T>> implements ConstraintValidator<A, T> {
+
+    private final Function<Clock, T> now;
+    private final IntPredicate test;
+    
+    protected TimeValidator(Function<Clock, T> now, IntPredicate test) {
+        super();
+        this.now = now;
+        this.test = test;
+    }
+
+    @Override
+    public final boolean isValid(T value, ConstraintValidatorContext context) {
+        return value == null || test.test(value.compareTo(now.apply(context.getClockProvider().getClock())));
+    }
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/3f287a7a/bval-jsr/src/main/java/org/apache/bval/context/ValidationContext.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/context/ValidationContext.java b/bval-jsr/src/main/java/org/apache/bval/context/ValidationContext.java
new file mode 100644
index 0000000..37415ba
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/context/ValidationContext.java
@@ -0,0 +1,125 @@
+package org.apache.bval.context;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.validation.ClockProvider;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.Path;
+import javax.validation.ValidationException;
+import javax.validation.metadata.CascadableDescriptor;
+import javax.validation.metadata.ContainerDescriptor;
+import javax.validation.metadata.ElementDescriptor;
+
+import org.apache.bval.jsr.ApacheValidatorFactory;
+import org.apache.bval.jsr.descriptor.BeanD;
+import org.apache.bval.jsr.util.PathImpl;
+import org.apache.bval.model.ValidationListener;
+import org.apache.bval.util.Exceptions;
+import org.apache.bval.util.Validate;
+
+/**
+ * Context for a single validation call over one object or graph.
+ */
+public class ValidationContext {
+
+    abstract class ElementContext<D> {
+
+        class ValidatorContext implements ConstraintValidatorContext {
+            private final List<ValidationListener.Error> errorMessages = new LinkedList<>();
+            private boolean disableDefaultConstraintViolation;
+
+            /**
+             * Get the queued error messages.
+             * 
+             * @return List
+             */
+            List<ValidationListener.Error> getErrorMessages() {
+                if (disableDefaultConstraintViolation && errorMessages.isEmpty()) {
+                    throw new ValidationException(
+                        "At least one custom message must be created if the default error message gets disabled.");
+                }
+
+                List<ValidationListener.Error> returnedErrorMessages = new ArrayList<>(errorMessages);
+                if (!disableDefaultConstraintViolation) {
+                    returnedErrorMessages
+                        .add(new ValidationListener.Error(getDefaultConstraintMessageTemplate(), getPath(), null));
+                }
+                return returnedErrorMessages;
+            }
+
+            @Override
+            public void disableDefaultConstraintViolation() {
+                this.disableDefaultConstraintViolation = true;
+            }
+
+            @Override
+            public String getDefaultConstraintMessageTemplate() {
+                // TODO Auto-generated method stub
+                return null;
+            }
+
+            @Override
+            public ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate) {
+                // TODO Auto-generated method stub
+                return null;
+            }
+
+            @Override
+            public final ClockProvider getClockProvider() {
+                return validatorFactory.getClockProvider();
+            }
+
+            @Override
+            public final <T> T unwrap(Class<T> type) {
+                Exceptions.raiseUnless(type.isInstance(this), ValidationException::new, "Type %s not supported", type);
+                return type.cast(this);
+            }
+        }
+
+        protected final D descriptor;
+
+        ElementContext(D descriptor) {
+            super();
+            this.descriptor = Validate.notNull(descriptor, "descriptor");
+        }
+
+        protected abstract PathImpl getPath();
+    }
+
+    private class BeanContext extends ElementContext<BeanD> {
+        BeanContext(BeanD descriptor) {
+            super(descriptor);
+        }
+
+        @Override
+        protected PathImpl getPath() {
+            return PathImpl.create();
+        }
+    }
+
+    private class CascadableContainerContext<D extends ElementDescriptor & CascadableDescriptor & ContainerDescriptor>
+        extends ElementContext<D> {
+
+        private final PathImpl path;
+
+        CascadableContainerContext(D descriptor, Path path) {
+            super(descriptor);
+            this.path = PathImpl.copy(Validate.notNull(path, "path"));
+        }
+
+        @Override
+        protected PathImpl getPath() {
+            // careful, live
+            return path;
+        }
+    }
+
+    private final ApacheValidatorFactory validatorFactory;
+
+    public ValidationContext(ApacheValidatorFactory validatorFactory) {
+        super();
+        this.validatorFactory = Validate.notNull(validatorFactory, "validatorFactory");
+    }
+}