package com.intrbiz.bergamot.model.timeperiod; import java.time.Clock; import java.time.LocalDateTime; import java.util.Calendar; public class DayOfMonthQualifier extends ComposedTimeRange { private static final long serialVersionUID = 1L; private int dayOfMonth; public DayOfMonthQualifier() { super(); } public DayOfMonthQualifier(int dayOfMonth) { super(); this.dayOfMonth = dayOfMonth; } public DayOfMonthQualifier(int dayOfMonth, TimeRange... ranges) { super(ranges); this.dayOfMonth = dayOfMonth; } public int getDayOfMonth() { return dayOfMonth; } public void setDayOfMonth(int dayOfMonth) { this.dayOfMonth = dayOfMonth; } @Override public boolean isInTimeRange(Calendar calendar) { int dom = this.dayOfMonth > 0 ? this.dayOfMonth : (calendar.getActualMaximum(Calendar.DAY_OF_MONTH) + this.dayOfMonth + 1); return calendar.get(Calendar.DAY_OF_MONTH) == dom && super.isInTimeRange(calendar); } @Override public LocalDateTime computeNextStartTime(Clock clock) { LocalDateTime next = super.computeNextStartTime(clock); if (next == null) return null; // set the day of month int dom = this.dayOfMonth > 0 ? this.dayOfMonth : (next.getMonth().maxLength() + this.dayOfMonth + 1); next = next.withDayOfMonth(dom); // is it next month if (! next.isAfter(LocalDateTime.now(clock))) next = next.plusMonths(1); // check the date is valid return (next.isAfter(LocalDateTime.now(clock))) ? next : null; } public String toString() { return this.dayOfMonth + " " + super.toString(); } }