From 6a6840fc79d89945ba4adb7b3984ff596e308204 Mon Sep 17 00:00:00 2001 From: amentis Date: Mon, 18 Dec 2023 10:30:37 +0200 Subject: [PATCH] add custom required one field validator --- dmp-backend/core/pom.xml | 7 +++- .../commons/validation/RequiredOneField.java | 21 ++++++++++ .../validation/RequiredOneFieldValidator.java | 40 +++++++++++++++++++ .../model/persist/DmpUserInvitePersist.java | 4 ++ .../persist/DmpUserInviteTypePersist.java | 2 + 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java diff --git a/dmp-backend/core/pom.xml b/dmp-backend/core/pom.xml index 6c607edd2..4b6344a6e 100644 --- a/dmp-backend/core/pom.xml +++ b/dmp-backend/core/pom.xml @@ -48,7 +48,12 @@ org.eclipse.angus jakarta.mail - + + commons-beanutils + commons-beanutils + 1.9.4 + + diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java new file mode 100644 index 000000000..1c42ea6f4 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneField.java @@ -0,0 +1,21 @@ +package eu.eudat.commons.validation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +@Constraint( validatedBy = { RequiredOneFieldValidator.class } ) +@Documented +@Target( { ElementType.TYPE } ) +@Retention( RetentionPolicy.RUNTIME ) +public @interface RequiredOneField { + + String message() default "One field is required"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + String[] fieldNames(); +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java new file mode 100644 index 000000000..6b1cc6c5f --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/RequiredOneFieldValidator.java @@ -0,0 +1,40 @@ +package eu.eudat.commons.validation; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.apache.commons.beanutils.PropertyUtils; + + +public class RequiredOneFieldValidator implements ConstraintValidator { + + private String[] fieldNames; + + public void initialize(RequiredOneField constraintAnnotation) { + this.fieldNames = constraintAnnotation.fieldNames(); + } + + public boolean isValid(Object object, ConstraintValidatorContext constraintContext) { + + if (object == null) { + return true; + } + int requiredCount = 0; + try { + for (String fieldName:fieldNames){ + + Object property = PropertyUtils.getProperty(object, fieldName); + if (property != null) { + requiredCount = requiredCount + 1; + } + } + if (requiredCount == 1){ + return true; + } + return false; + } catch (Exception e) { + return false; + } + } + +} + diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java index ae25ccc14..9eb8aa670 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInvitePersist.java @@ -3,12 +3,16 @@ package eu.eudat.model.persist; import eu.eudat.commons.enums.DmpUserRole; import eu.eudat.commons.validation.ValidEnum; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import java.util.List; public class DmpUserInvitePersist { @Valid + @NotNull + @NotEmpty private List users; @ValidEnum(message = "{validation.empty}") diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java index eeb0fd899..3d1fd7f4d 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java @@ -1,8 +1,10 @@ package eu.eudat.model.persist; +import eu.eudat.commons.validation.RequiredOneField; import java.util.UUID; +@RequiredOneField(fieldNames={"userId","email"}) public class DmpUserInviteTypePersist { private UUID userId;