/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.convention.rolldate;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.temporal.Temporal;
import org.threeten.bp.temporal.TemporalAdjuster;
import org.threeten.bp.temporal.TemporalAdjusters;
/**
* Convention that controls rolling date adjustments.
*/
public enum RollConvention {
/**
* EOM, end of month roll date adjuster.
*/
EOM {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return EndOfMonthRollDateAdjuster.getAdjuster();
}
},
/**
* FRN Convention or Eurodollar convention roll date adjuster.
*/
FRN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numDaysToAdjust) {
throw new UnsupportedOperationException("FRN not implemented yet.");
}
},
/**
* IMM settlement dates roll date adjuster.
* 3rd Wednesday of March, June, September or December
*/
IMM {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
switch (numMonthsToAdjust) {
case 1:
return MonthlyIMMRollDateAdjuster.getAdjuster();
case 3:
return QuarterlyIMMRollDateAdjuster.getAdjuster();
default:
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.WEDNESDAY));
}
}
},
/**
* One Sydney business day preceeding the 2nd Friday of the month.
*/
IMM_AUD {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
throw new UnsupportedOperationException("IMM_AUD not implemented yet.");
}
},
/**
* IMM_CAD.
*/
IMM_CAD {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
throw new UnsupportedOperationException("IMM_CAD not implemented yet.");
}
},
/**
* The Wednesday after the 9th day of the month.
*/
IMM_NZD {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
return temporal.with(new DayOfMonthTemporalAdjuster(9)).with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
}
});
}
},
/**
* Sydney Futures Exchange convention. 2nd Friday of the month.
*/
SFE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY));
}
},
/**
* No adjustment i.e. daily or can be used if date should be taken with no adjustment.
*/
NONE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
return temporal;
}
});
}
},
/**
* Treasury bill convention. Each Monday
*/
TBILL {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return MON.getRollDateAdjuster(numMonthsToAdjust);
}
},
/**
* 1st day of the month roll date adjuster.
*/
ONE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(1));
}
},
/**
* 2nd day of the month roll date adjuster.
*/
TWO {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(2));
}
},
/**
* 3rd day of the month roll date adjuster.
*/
THREE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(3));
}
},
/**
* 4th day of the month roll date adjuster.
*/
FOUR {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(4));
}
},
/**
* 5th day of the month roll date adjuster.
*/
FIVE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(5));
}
},
/**
* 6th day of the month roll date adjuster.
*/
SIX {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(6));
}
},
/**
* 7th day of the month roll date adjuster.
*/
SEVEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(7));
}
},
/**
* 8th day of the month roll date adjuster.
*/
EIGHT {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(8));
}
},
/**
* 9th day of the month roll date adjuster.
*/
NINE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(9));
}
},
/**
* 10th day of the month roll date adjuster.
*/
TEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(10));
}
},
/**
* 11th day of the month roll date adjuster.
*/
ELEVEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(11));
}
},
/**
* 12th day of the month roll date adjuster.
*/
TWELVE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(12));
}
},
/**
* 13th day of the month roll date adjuster.
*/
THIRTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(13));
}
},
/**
* 14th day of the month roll date adjuster.
*/
FOURTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(14));
}
},
/**
* 15th day of the month roll date adjuster.
*/
FIFTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(15));
}
},
/**
* 16th day of the month roll date adjuster.
*/
SIXTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(16));
}
},
/**
* 17th day of the month roll date adjuster.
*/
SEVENTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(17));
}
},
/**
* 18th day of the month roll date adjuster.
*/
EIGHTEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(18));
}
},
/**
* 19th day of the month roll date adjuster.
*/
NINETEEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(19));
}
},
/**
* 20th day of the month roll date adjuster.
*/
TWENTY {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(20));
}
},
/**
* 21st day of the month roll date adjuster.
*/
TWENTY_ONE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(21));
}
},
/**
* 22nd day of the month roll date adjuster.
*/
TWENTY_TWO {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(22));
}
},
/**
* 23rd day of the month roll date adjuster.
*/
TWENTY_THREE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(23));
}
},
/**
* 24th day of the month roll date adjuster.
*/
TWENTY_FOUR {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(24));
}
},
/**
* 25th day of the month roll date adjuster.
*/
TWENTY_FIVE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(25));
}
},
/**
* 26th day of the month roll date adjuster.
*/
TWENTY_SIX {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(26));
}
},
/**
* 27th day of the month roll date adjuster.
*/
TWENTY_SEVEN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(27));
}
},
/**
* 28th day of the month roll date adjuster.
*/
TWENTY_EIGHT {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(28));
}
},
/**
* 29th day of the month roll date adjuster.
*/
TWENTY_NINE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(29));
}
},
/**
* 30th day of the month roll date adjuster.
*/
THIRTY {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, new DayOfMonthTemporalAdjuster(30));
}
},
/**
* Monday roll date adjuster.
*/
MON {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
}
},
/**
* Tuesday roll date adjuster.
*/
TUE {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
}
},
/**
* Wednesday roll date adjuster.
*/
WED {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
}
},
/**
* Thursday roll date adjuster.
*/
THU {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY));
}
},
/**
* Friday roll date adjuster.
*/
FRI {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
}
},
/**
* Saturday roll date adjuster.
*/
SAT {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY));
}
},
/**
* Sunday roll date adjuster.
*/
SUN {
@Override
public RollDateAdjuster getRollDateAdjuster(int numMonthsToAdjust) {
return new GeneralRollDateAdjuster(numMonthsToAdjust, TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
}
};
/**
* Get convention for this day of month.
*
* @param dayOfMonth the day of the month
* @return the convention, not null
* @throws IllegalArgumentException if the day of month is invalid
*/
public static RollConvention dayOfMonth(final int dayOfMonth) {
switch(dayOfMonth) {
case 1:
return ONE;
case 2:
return TWO;
case 3:
return THREE;
case 4:
return FOUR;
case 5:
return FIVE;
case 6:
return SIX;
case 7:
return SEVEN;
case 8:
return EIGHT;
case 9:
return NINE;
case 10:
return TEN;
case 11:
return ELEVEN;
case 12:
return TWELVE;
case 13:
return THIRTEEN;
case 14:
return FOURTEEN;
case 15:
return FIFTEEN;
case 16:
return SIXTEEN;
case 17:
return SEVENTEEN;
case 18:
return EIGHTEEN;
case 19:
return NINETEEN;
case 20:
return TWENTY;
case 21:
return TWENTY_ONE;
case 22:
return TWENTY_TWO;
case 23:
return TWENTY_THREE;
case 24:
return TWENTY_FOUR;
case 25:
return TWENTY_FIVE;
case 26:
return TWENTY_SIX;
case 27:
return TWENTY_SEVEN;
case 28:
return TWENTY_EIGHT;
case 29:
return TWENTY_NINE;
case 30:
return THIRTY;
default:
throw new IllegalArgumentException("RollConvention only valid for days 1-30: " + dayOfMonth);
}
}
/**
* Gets the roll date adjuster.
*
* @param numMonthsToAdjust the number of months to adjust, not null
* @return the adjuster, not null
*/
public abstract RollDateAdjuster getRollDateAdjuster(final int numMonthsToAdjust);
}