/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.basics.date;
import static com.opengamma.basics.date.LocalDateUtils.plusDays;
import static java.time.DayOfWeek.FRIDAY;
import static java.time.DayOfWeek.SATURDAY;
import static java.time.DayOfWeek.SUNDAY;
import static java.time.DayOfWeek.THURSDAY;
import java.time.DayOfWeek;
import java.time.LocalDate;
import com.opengamma.collect.ArgChecker;
import com.opengamma.collect.range.LocalDateRange;
/**
* Standard holiday calendar implementations.
* <p>
* See {@link HolidayCalendars} for the description of each.
*/
enum StandardHolidayCalendars implements HolidayCalendar {
// no holidays
NO_HOLIDAYS("NoHolidays") {
@Override
public boolean isHoliday(LocalDate date) {
ArgChecker.notNull(date, "date");
return false;
}
@Override
public boolean isBusinessDay(LocalDate date) {
ArgChecker.notNull(date, "date");
return true;
}
@Override
public LocalDate shift(LocalDate date, int amount) {
ArgChecker.notNull(date, "date");
return plusDays(date, amount);
}
@Override
public LocalDate next(LocalDate date) {
ArgChecker.notNull(date, "date");
return plusDays(date, 1);
}
@Override
public LocalDate previous(LocalDate date) {
ArgChecker.notNull(date, "date");
return plusDays(date, -1);
}
@Override
public int daysBetween(LocalDate startInclusive, LocalDate endExclusive) {
return Math.toIntExact(LocalDateUtils.daysBetween(startInclusive, endExclusive));
}
@Override
public int daysBetween(LocalDateRange dateRange) {
return daysBetween(dateRange.getStart(), dateRange.getEndExclusive());
}
@Override
public HolidayCalendar combineWith(HolidayCalendar other) {
return ArgChecker.notNull(other, "other");
}
},
// Saturday and Sunday only
SAT_SUN("Sat/Sun") {
@Override
public boolean isHoliday(LocalDate date) {
ArgChecker.notNull(date, "date");
DayOfWeek dow = date.getDayOfWeek();
return dow == SATURDAY || dow == SUNDAY;
}
},
// Friday and Saturday only
FRI_SAT("Fri/Sat") {
@Override
public boolean isHoliday(LocalDate date) {
ArgChecker.notNull(date, "date");
DayOfWeek dow = date.getDayOfWeek();
return dow == FRIDAY || dow == SATURDAY;
}
},
// Thursday and Friday only
THU_FRI("Thu/Fri") {
@Override
public boolean isHoliday(LocalDate date) {
ArgChecker.notNull(date, "date");
DayOfWeek dow = date.getDayOfWeek();
return dow == THURSDAY || dow == FRIDAY;
}
};
// name
private final String name;
// create
private StandardHolidayCalendars(String name) {
this.name = name;
}
@Override
public LocalDate shift(LocalDate date, int amount) {
// optimize because we know there are 5 business days in a week
// method implemented here as cannot reach default method from enum subclass
ArgChecker.notNull(date, "date");
LocalDate weekAdjusted = date.plusWeeks(amount / 5);
return HolidayCalendar.super.shift(weekAdjusted, amount % 5);
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}