/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.basics.date;
import java.time.LocalDate;
import java.time.Period;
import org.joda.convert.FromString;
import org.joda.convert.ToString;
import com.opengamma.strata.collect.named.ExtendedEnum;
import com.opengamma.strata.collect.named.Named;
/**
* A convention defining how a period is added to a date.
* <p>
* The purpose of this convention is to define how to handle the addition of a period.
* The default implementations include two different end-of-month rules.
* The convention is generally only applicable for month-based periods.
* <p>
* The most common implementations are provided in {@link PeriodAdditionConventions}.
* Additional implementations may be added by implementing this interface.
* <p>
* All implementations of this interface must be immutable and thread-safe.
*/
public interface PeriodAdditionConvention
extends Named {
/**
* Obtains an instance from the specified unique name.
*
* @param uniqueName the unique name
* @return the addition convention
* @throws IllegalArgumentException if the name is not known
*/
@FromString
public static PeriodAdditionConvention of(String uniqueName) {
return extendedEnum().lookup(uniqueName);
}
/**
* Gets the extended enum helper.
* <p>
* This helper allows instances of the convention to be looked up.
* It also provides the complete set of available instances.
*
* @return the extended enum helper
*/
public static ExtendedEnum<PeriodAdditionConvention> extendedEnum() {
return PeriodAdditionConventions.ENUM_LOOKUP;
}
//-------------------------------------------------------------------------
/**
* Adjusts the base date, adding the period and applying the convention rule.
* <p>
* The adjustment occurs in two steps.
* First, the period is added to the based date to create the end date.
* Second, the end date is adjusted by the convention rules.
*
* @param baseDate the base date to add to
* @param period the period to add
* @param calendar the holiday calendar to use
* @return the adjusted date
*/
public abstract LocalDate adjust(LocalDate baseDate, Period period, HolidayCalendar calendar);
/**
* Checks whether the convention requires a month-based period.
* <p>
* A month-based period contains only months and/or years, and not days.
*
* @return true if the convention requires a month-based period
*/
public abstract boolean isMonthBased();
/**
* Gets the name that uniquely identifies this convention.
* <p>
* This name is used in serialization and can be parsed using {@link #of(String)}.
*
* @return the unique name
*/
@ToString
@Override
public abstract String getName();
}