package com.opengamma.sesame.holidays; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.threeten.bp.DayOfWeek; import org.threeten.bp.LocalDate; import com.google.common.collect.ImmutableSet; import com.opengamma.core.AbstractSource; import com.opengamma.core.holiday.Holiday; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.core.holiday.HolidayType; import com.opengamma.core.holiday.impl.SimpleHoliday; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.money.Currency; public class UsdHolidaySource extends AbstractSource<Holiday> implements HolidaySource { /** * Map of exception dates and whether they are working or non-working. */ private final ConcurrentMap<LocalDate, Boolean> _nonWorkingDay = new ConcurrentHashMap<>(); public UsdHolidaySource() { int startYear = 2013; int endYear = 2063; for (int year = startYear; year <= endYear; year++) { addNonWorkingDay(LocalDate.of(year, 1, 1)); addNonWorkingDay(LocalDate.of(year, 7, 4)); addNonWorkingDay(LocalDate.of(year, 12, 25)); } addNonWorkingDay(LocalDate.of(2015, 1, 19)); addNonWorkingDay(LocalDate.of(2015, 2, 16)); addNonWorkingDay(LocalDate.of(2015, 5, 25)); addNonWorkingDay(LocalDate.of(2015, 9, 7)); addNonWorkingDay(LocalDate.of(2015, 10, 12)); addNonWorkingDay(LocalDate.of(2015, 11, 11)); addNonWorkingDay(LocalDate.of(2015, 11, 26)); addNonWorkingDay(LocalDate.of(2016, 1, 18)); addNonWorkingDay(LocalDate.of(2016, 2, 15)); addNonWorkingDay(LocalDate.of(2016, 5, 30)); addNonWorkingDay(LocalDate.of(2016, 9, 5)); addNonWorkingDay(LocalDate.of(2016, 10, 10)); addNonWorkingDay(LocalDate.of(2016, 11, 11)); addNonWorkingDay(LocalDate.of(2016, 11, 24)); addNonWorkingDay(LocalDate.of(2016, 12, 26)); addNonWorkingDay(LocalDate.of(2017, 1, 2)); addNonWorkingDay(LocalDate.of(2017, 1, 16)); addNonWorkingDay(LocalDate.of(2017, 2, 20)); addNonWorkingDay(LocalDate.of(2017, 5, 29)); addNonWorkingDay(LocalDate.of(2017, 9, 4)); addNonWorkingDay(LocalDate.of(2017, 10, 9)); addNonWorkingDay(LocalDate.of(2017, 11, 23)); } private void addNonWorkingDay(LocalDate date) { _nonWorkingDay.put(date, true); } private boolean isHoliday(LocalDate dateToCheck) { DayOfWeek day = dateToCheck.getDayOfWeek(); if (day.equals(DayOfWeek.SATURDAY) || day.equals(DayOfWeek.SUNDAY)) { return true; } return _nonWorkingDay.containsKey(dateToCheck); } @Override public boolean isHoliday(LocalDate dateToCheck, Currency currency) { return isHoliday(dateToCheck); } @Override public boolean isHoliday(LocalDate dateToCheck, HolidayType holidayType, ExternalIdBundle regionOrExchangeIds) { return isHoliday(dateToCheck); } @Override public boolean isHoliday(LocalDate dateToCheck, HolidayType holidayType, ExternalId regionOrExchangeId) { return isHoliday(dateToCheck); } @Override public Holiday get(UniqueId uniqueId) { throw new UnsupportedOperationException(); } @Override public Holiday get(ObjectId objectId, VersionCorrection versionCorrection) { throw new UnsupportedOperationException(); } @Override public Collection<Holiday> get(HolidayType holidayType, ExternalIdBundle regionOrExchangeIds) { SimpleHoliday holiday = new SimpleHoliday(_nonWorkingDay.keySet()); holiday.setType(holidayType); switch (holidayType) { case BANK: holiday.setRegionExternalId(regionOrExchangeIds.iterator().next()); break; case SETTLEMENT: case TRADING: holiday.setExchangeExternalId(regionOrExchangeIds.iterator().next()); break; case CUSTOM: holiday.setCustomExternalId(regionOrExchangeIds.iterator().next()); break; default: // Do nothing } return ImmutableSet.<Holiday>of(holiday); } @Override public Collection<Holiday> get(Currency currency) { SimpleHoliday holiday = new SimpleHoliday(_nonWorkingDay.keySet()); holiday.setType(HolidayType.CURRENCY); holiday.setCurrency(Currency.USD); return ImmutableSet.<Holiday>of(holiday); } }