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 = {}) [email protected] +@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) [email protected] +@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"); + } +}
