package eu.ztsh.wymiana.validation; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Collectors; public class AdultValidator implements ConstraintValidator { private final Pattern pattern = Pattern.compile("\\d{11}"); private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (!pattern.matcher(value).matches()) { return false; } var datePart = Arrays.stream(value.substring(0, 6).split("")).map(Integer::parseInt).toArray(Integer[]::new); final String prefix; if (datePart[2] > 1) { datePart[2] = (datePart[2] - 2); prefix = "20"; } else { prefix = "19"; } var dateStamp = prefix.concat(Arrays.stream(datePart).map(Objects::toString).collect(Collectors.joining())); try { return LocalDate.parse(dateStamp, dtf) .plusYears(18) .isBefore(LocalDate.now(context.getClockProvider().getClock())); } catch (DateTimeParseException exception) { return false; } } }