From c82ab9f27fc73eb715a246cada316cafb27f1072 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sat, 7 Dec 2024 16:48:13 +0100 Subject: [PATCH] [FEAT] add Email generic contraint check --- .../archidata/annotation/AnnotationTools.java | 9 ++++++++ .../dataAccess/options/CheckJPA.java | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/org/kar/archidata/annotation/AnnotationTools.java b/src/org/kar/archidata/annotation/AnnotationTools.java index 1017635..ce738ad 100644 --- a/src/org/kar/archidata/annotation/AnnotationTools.java +++ b/src/org/kar/archidata/annotation/AnnotationTools.java @@ -21,6 +21,7 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; @@ -235,6 +236,14 @@ public class AnnotationTools { return ((Pattern) annotation[0]).regexp(); } + public static boolean getConstraintsEmail(final Field element) throws DataAccessException { + final Annotation[] annotation = element.getDeclaredAnnotationsByType(Email.class); + if (annotation.length == 0) { + return false; + } + return true; + } + public static boolean isAnnotationGroup(final Field field, final Class annotationType) { try { final Annotation[] anns = field.getAnnotations(); diff --git a/src/org/kar/archidata/dataAccess/options/CheckJPA.java b/src/org/kar/archidata/dataAccess/options/CheckJPA.java index e46b07b..60a056f 100644 --- a/src/org/kar/archidata/dataAccess/options/CheckJPA.java +++ b/src/org/kar/archidata/dataAccess/options/CheckJPA.java @@ -401,6 +401,27 @@ public class CheckJPA implements CheckFunctionInterface { } }); } + if (AnnotationTools.getConstraintsEmail(field)) { + final String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; + final Pattern pattern = Pattern.compile(emailPattern); + add(fieldName, + ( + final String baseName, + final T data, + final List modifiedValue, + final QueryOptions options) -> { + final Object elem = field.get(data); + if (elem == null) { + return; + } + final String elemTyped = (String) elem; + if (!pattern.matcher(elemTyped).find()) { + throw new InputException(baseName + fieldName, + "does not match the required pattern[email] (constraints) must be '" + + emailPattern + "'"); + } + }); + } } else if (type == JsonValue.class) { final DataJson jsonAnnotation = AnnotationTools.getDataJson(field); if (jsonAnnotation != null && jsonAnnotation.checker() != CheckFunctionVoid.class) {