/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.convention.frequency; import java.io.Serializable; import com.opengamma.util.ArgumentChecker; /** * Simple implementation of the frequency convention. */ public final class SimpleFrequency implements Frequency, Serializable { /** Serialization version. */ private static final long serialVersionUID = 1L; /** * A frequency with a period of zero. */ public static final SimpleFrequency NEVER = new SimpleFrequency(NEVER_NAME, 0); /** * A frequency with a period of one year. */ public static final SimpleFrequency ANNUAL = new SimpleFrequency(ANNUAL_NAME, 1); /** * A frequency with a period of six months. */ public static final SimpleFrequency SEMI_ANNUAL = new SimpleFrequency(SEMI_ANNUAL_NAME, 2); /** * A frequency with a period of three months. */ public static final SimpleFrequency QUARTERLY = new SimpleFrequency(QUARTERLY_NAME, 4); /** * A frequency with a period of two months. */ public static final SimpleFrequency BIMONTHLY = new SimpleFrequency(BIMONTHLY_NAME, 6); /** * A frequency with a period of one month. */ public static final SimpleFrequency MONTHLY = new SimpleFrequency(MONTHLY_NAME, 12); /** * A frequency with a period of twenty eight days. */ public static final SimpleFrequency TWENTY_EIGHT_DAYS = new SimpleFrequency(TWENTY_EIGHT_DAYS_NAME, 365. / 28); /** * A frequency with a period of three weeks. */ public static final SimpleFrequency THREE_WEEKS = new SimpleFrequency(THREE_WEEK_NAME, 365. / 21); /** * A frequency with a period of two weeks. */ public static final SimpleFrequency BIWEEKLY = new SimpleFrequency(BIWEEKLY_NAME, 26); /** * A frequency with a period of one week. */ public static final SimpleFrequency WEEKLY = new SimpleFrequency(WEEKLY_NAME, 52); /** * A frequency with a period of one day. */ public static final SimpleFrequency DAILY = new SimpleFrequency(DAILY_NAME, 365); /** * A continuous frequency. */ // TODO where converting to/from say continuously compounded interest rates, can't use Double.MAX_VALUE, but need different formula public static final SimpleFrequency CONTINUOUS = new SimpleFrequency(CONTINUOUS_NAME, Double.MAX_VALUE); /** * A frequency with a period of four months */ public static final SimpleFrequency FOUR_MONTHS = new SimpleFrequency(FOUR_MONTH_NAME, 3); /** * A frequency with a period of five months */ public static final SimpleFrequency FIVE_MONTHS = new SimpleFrequency(FIVE_MONTH_NAME, 2.4); /** * A frequency with a period of seven months */ public static final SimpleFrequency SEVEN_MONTHS = new SimpleFrequency(SEVEN_MONTH_NAME, 12. / 7); /** * A frequency with a period of eight months */ public static final SimpleFrequency EIGHT_MONTHS = new SimpleFrequency(EIGHT_MONTH_NAME, 1.5); /** * A frequency with a period of nine months */ public static final SimpleFrequency NINE_MONTHS = new SimpleFrequency(NINE_MONTH_NAME, 4. / 3); /** * A frequency with a period of ten months */ public static final SimpleFrequency TEN_MONTHS = new SimpleFrequency(TEN_MONTH_NAME, 1.2); /** * A frequency with a period of eleven months */ public static final SimpleFrequency ELEVEN_MONTHS = new SimpleFrequency(ELEVEN_MONTH_NAME, 12. / 11); /** * A frequency with a period of eighteen months */ public static final SimpleFrequency EIGHTEEN_MONTHS = new SimpleFrequency(EIGHTEEN_MONTH_NAME, 12. / 18); /** * The name of the convention. */ private final String _name; /** * The number of periods per year. */ private final Double _periodsPerYear; /** * Creates an instance. * * @param name the convention name, not null * @param periodsPerYear the number of periods per year, greater than zero * @throws IllegalArgumentException if the name is null * @throws IllegalArgumentException if the frequency is zero or negative */ /* package */SimpleFrequency(final String name, final double periodsPerYear) { ArgumentChecker.notNull(name, "name"); ArgumentChecker.notNegative(periodsPerYear, "periods per year"); _name = name; _periodsPerYear = periodsPerYear; } // ------------------------------------------------------------------------- /** * @deprecated use getName() * @return the name of the convention */ @Override @Deprecated public String getConventionName() { return getName(); } @Override public String getName() { return _name; } /** * Gets the number of periods per year. * * @return the periods per year */ public double getPeriodsPerYear() { return _periodsPerYear; } // ------------------------------------------------------------------------- @Override public boolean equals(final Object obj) { if (obj == this) { return true; } if (obj instanceof SimpleFrequency) { final SimpleFrequency other = (SimpleFrequency) obj; return _name.equals(other._name) && _periodsPerYear.equals(other._periodsPerYear); } return false; } @Override public int hashCode() { return _name.hashCode() ^ _periodsPerYear.hashCode(); } @Override public String toString() { return "Frequency[" + "name = " + _name + " pa = " + _periodsPerYear + "]"; } // ------------------------------------------------------------------------- // REVIEW Elaine 2010-06-18 This is awful, but I'm not sure if we actually need SimpleFrequency, // so I'm going to use PeriodFrequency where possible and see if this class can be eliminated entirely /** * Converts this to a period frequency. * * @return the period frequency, not null */ public PeriodFrequency toPeriodFrequency() { if (_name.equals(ANNUAL_NAME)) { return PeriodFrequency.ANNUAL; } if (_name.equals(BIMONTHLY_NAME)) { return PeriodFrequency.BIMONTHLY; } if (_name.equals(BIWEEKLY_NAME)) { return PeriodFrequency.BIWEEKLY; } if (_name.equals(CONTINUOUS_NAME)) { return PeriodFrequency.CONTINUOUS; } if (_name.equals(DAILY_NAME)) { return PeriodFrequency.DAILY; } if (_name.equals(MONTHLY_NAME)) { return PeriodFrequency.MONTHLY; } if (_name.equals(QUARTERLY_NAME)) { return PeriodFrequency.QUARTERLY; } if (_name.equals(SEMI_ANNUAL_NAME)) { return PeriodFrequency.SEMI_ANNUAL; } if (_name.equals(WEEKLY_NAME)) { return PeriodFrequency.WEEKLY; } if (_name.equals(FOUR_MONTH_NAME)) { return PeriodFrequency.FOUR_MONTHS; } if (_name.equals(FIVE_MONTH_NAME)) { return PeriodFrequency.FIVE_MONTHS; } if (_name.equals(SEVEN_MONTH_NAME)) { return PeriodFrequency.SEVEN_MONTHS; } if (_name.equals(EIGHT_MONTH_NAME)) { return PeriodFrequency.EIGHT_MONTHS; } if (_name.equals(NINE_MONTH_NAME)) { return PeriodFrequency.NINE_MONTHS; } if (_name.equals(TEN_MONTH_NAME)) { return PeriodFrequency.TEN_MONTHS; } if (_name.equals(ELEVEN_MONTH_NAME)) { return PeriodFrequency.ELEVEN_MONTHS; } if (_name.equals(EIGHTEEN_MONTH_NAME)) { return PeriodFrequency.EIGHTEEN_MONTHS; } if (_name.equals(TWENTY_EIGHT_DAYS_NAME)) { return PeriodFrequency.TWENTY_EIGHT_DAYS; } if (_name.equals(THREE_WEEK_NAME)) { return PeriodFrequency.THREE_WEEKS; } if (_name.equals(NEVER_NAME)) { return PeriodFrequency.NEVER; } throw new IllegalArgumentException("Cannot get a period frequency for " + toString()); } }