/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.basics.schedule; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import com.opengamma.strata.collect.ArgChecker; /** * Standard roll convention implementations. * <p> * See {@link RollConventions} for the description of each. */ enum StandardRollConventions implements RollConvention { // no adjustment NONE("None") { @Override public LocalDate adjust(LocalDate date) { return ArgChecker.notNull(date, "date"); } }, // last day of month EOM("EOM") { @Override public LocalDate adjust(LocalDate date) { ArgChecker.notNull(date, "date"); return date.withDayOfMonth(date.lengthOfMonth()); } @Override public int getDayOfMonth() { // EOM is equivalent to 31 in FpML in most cases // because roll conventions 30 and 29 also have to adjust to end of February return 31; } }, // 3rd Wednesday IMM("IMM") { @Override public LocalDate adjust(LocalDate date) { ArgChecker.notNull(date, "date"); return date.with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.WEDNESDAY)); } }, // day before 2nd Friday IMMAUD("IMMAUD") { @Override public LocalDate adjust(LocalDate date) { ArgChecker.notNull(date, "date"); return date.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY)).minusDays(1); } }, // Wednesday on or after 9th IMMNZD("IMMNZD") { @Override public LocalDate adjust(LocalDate date) { ArgChecker.notNull(date, "date"); return date.withDayOfMonth(9).with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY)); } }, // 2nd Friday SFE("SFE") { @Override public LocalDate adjust(LocalDate date) { ArgChecker.notNull(date, "date"); return date.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY)); } }; // name private final String name; // create private StandardRollConventions(String name) { this.name = name; } @Override public String getName() { return name; } @Override public String toString() { return name; } }