/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.schedule;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.Month;
/**
*
*/
public class ScheduleCalculatorFactory {
/** Daily */
public static final String DAILY = "Daily";
/** Weekly */
public static final String WEEKLY = "Weekly";
/** Weekly on day */
public static final String WEEKLY_ON_DAY = "WeeklyOnDay";
/** Monthly */
public static final String MONTHLY = "Monthly";
/** First of month */
public static final String FIRST_OF_MONTH = "FirstOfMonth";
/** End of month */
public static final String END_OF_MONTH = "EndOfMonth";
/** Monthly on day */
public static final String MONTHLY_ON_DAY = "MonthlyOnDay";
/** Quarterly */
public static final String QUARTERLY = "Quarterly";
/** Quarterly EOM */
public static final String QUARTERLY_EOM = "QuarterlyEOM";
/** Semi-annual */
public static final String SEMI_ANNUAL = "SemiAnnual";
/** Semi-annual EOM*/
public static final String SEMI_ANNUAL_EOM = "SemiAnnualEOM";
/** Annual */
public static final String ANNUAL = "Annual";
/** First of year */
public static final String FIRST_OF_YEAR = "FirstOfYear";
/** End of year */
public static final String END_OF_YEAR = "EndOfYear";
/** Annual on day and month */
public static final String ANNUAL_ON_DAY_AND_MONTH = "AnnualOnDayAndMonth";
/** Annual EOM */
public static final String ANNUAL_EOM = "AnnualEOM";
/** Daily calculator */
public static final DailyScheduleCalculator DAILY_CALCULATOR = new DailyScheduleCalculator();
/** Weekly calculator */
public static final WeeklyScheduleCalculator WEEKLY_CALCULATOR = new WeeklyScheduleCalculator();
/** Monthly calculator */
public static final MonthlyScheduleCalculator MONTHLY_CALCULATOR = new MonthlyScheduleCalculator();
/** First of month calculator */
public static final FirstOfMonthScheduleCalculator FIRST_OF_MONTH_CALCULATOR = new FirstOfMonthScheduleCalculator();
/** End of month calculator */
public static final EndOfMonthScheduleCalculator END_OF_MONTH_CALCULATOR = new EndOfMonthScheduleCalculator();
/** Quarterly calculator */
public static final QuarterlyScheduleCalculator QUARTERLY_CALCULATOR = new QuarterlyScheduleCalculator();
/** Quarterly EOM calculator */
public static final EndOfMonthQuarterlyScheduleCalculator QUARTERLY_EOM_CALCULATOR = new EndOfMonthQuarterlyScheduleCalculator();
/** Semi-annual calculator */
public static final SemiAnnualScheduleCalculator SEMI_ANNUAL_CALCULATOR = new SemiAnnualScheduleCalculator();
/** Semi-annual EOM calculator */
public static final EndOfMonthSemiAnnualScheduleCalculator SEMI_ANNUAL_EOM_CALCULATOR = new EndOfMonthSemiAnnualScheduleCalculator();
/** Annual calculator */
public static final AnnualScheduleCalculator ANNUAL_CALCULATOR = new AnnualScheduleCalculator();
/** First of year calculator */
public static final FirstOfYearScheduleCalculator FIRST_OF_YEAR_CALCULATOR = new FirstOfYearScheduleCalculator();
/** End of year calculator */
public static final EndOfYearScheduleCalculator END_OF_YEAR_CALCULATOR = new EndOfYearScheduleCalculator();
/** Annual EOM calculator */
public static final EndOfMonthAnnualScheduleCalculator ANNUAL_EOM_CALCULATOR = new EndOfMonthAnnualScheduleCalculator();
private static final Map<String, Schedule> s_instances = new HashMap<>();
static {
s_instances.put(DAILY, DAILY_CALCULATOR);
s_instances.put(END_OF_MONTH, END_OF_MONTH_CALCULATOR);
s_instances.put(END_OF_YEAR, END_OF_YEAR_CALCULATOR);
s_instances.put(FIRST_OF_MONTH, FIRST_OF_MONTH_CALCULATOR);
s_instances.put(FIRST_OF_YEAR, FIRST_OF_YEAR_CALCULATOR);
s_instances.put(MONTHLY, MONTHLY_CALCULATOR);
s_instances.put(WEEKLY, WEEKLY_CALCULATOR);
s_instances.put(ANNUAL, ANNUAL_CALCULATOR);
s_instances.put(QUARTERLY, QUARTERLY_CALCULATOR);
s_instances.put(QUARTERLY_EOM, QUARTERLY_EOM_CALCULATOR);
s_instances.put(SEMI_ANNUAL, SEMI_ANNUAL_CALCULATOR);
s_instances.put(SEMI_ANNUAL_EOM, SEMI_ANNUAL_EOM_CALCULATOR);
s_instances.put(ANNUAL_EOM, ANNUAL_EOM_CALCULATOR);
}
public static Schedule getScheduleCalculator(final String name) {
final Schedule schedule = s_instances.get(name);
if (schedule == null) {
throw new IllegalArgumentException("Could not get schedule calculator with name " + name);
}
return schedule;
}
public static Schedule getScheduleCalculator(final String name, final DayOfWeek dayOfWeek) {
Validate.notNull(name, "name");
if (!name.equals(WEEKLY_ON_DAY)) {
throw new IllegalArgumentException("Can only ask for " + WEEKLY_ON_DAY + " schedule");
}
return new WeeklyScheduleOnDayCalculator(dayOfWeek);
}
public static Schedule getScheduleCalculator(final String name, final int dayOfMonth, final Month monthOfYear) {
Validate.notNull(name, "name");
if (!name.equals(ANNUAL_ON_DAY_AND_MONTH)) {
throw new IllegalArgumentException("Can only ask for " + ANNUAL_ON_DAY_AND_MONTH + " schedule");
}
return new AnnualScheduleOnDayAndMonthCalculator(dayOfMonth, monthOfYear);
}
}