DateWithinRelativeRangeValidator.java

package uk.gov.dhsc.htbhf.claimant.model.constraint;

import java.time.LocalDate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class DateWithinRelativeRangeValidator implements ConstraintValidator<DateWithinRelativeRange, LocalDate> {

    private int monthsInPast;
    private int monthsInFuture;

    @Override
    public void initialize(DateWithinRelativeRange constraintAnnotation) {
        this.monthsInPast = constraintAnnotation.monthsInPast();
        this.monthsInFuture = constraintAnnotation.monthsInFuture();
    }

    @Override
    public boolean isValid(LocalDate value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        return isWithinValidRange(value);
    }

    private boolean isWithinValidRange(LocalDate value) {
        LocalDate now = LocalDate.now();
        LocalDate lastValidDate = now.plusMonths(monthsInFuture);
        boolean isBeforeEnd = value.isBefore(lastValidDate) || value.isEqual(lastValidDate);

        LocalDate firstValidDate = now.minusMonths(monthsInPast);
        boolean isAfterStart = value.isAfter(firstValidDate) || value.isEqual(firstValidDate);

        return isAfterStart && isBeforeEnd;
    }
}