/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.curve.forward;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.InitializingBean;
import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean;
import com.opengamma.engine.function.config.FunctionConfiguration;
import com.opengamma.engine.function.config.FunctionConfigurationSource;
import com.opengamma.financial.property.DefaultPropertyFunction.PriorityClass;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.Pair;
/**
* Function repository configuration source for the functions contained in this package.
*/
public class ForwardFunctions extends AbstractFunctionConfigurationBean {
/**
* Default instance of a repository configuration source exposing the functions from this package.
*
* @return the configuration source exposing functions from this package
*/
public static FunctionConfigurationSource instance() {
return new ForwardFunctions().getObjectCreating();
}
/**
* Function repository configuration source for the default functions contained in this package.
*/
public static class Defaults extends AbstractFunctionConfigurationBean {
/**
* Currency specific data.
*/
public static class CurrencyInfo implements InitializingBean {
private String _curveConfiguration;
private String _discountingCurve;
private String _forwardCurve;
public String getCurveConfiguration() {
return _curveConfiguration;
}
public void setCurveConfiguration(final String curveConfiguration) {
_curveConfiguration = curveConfiguration;
}
public String getDiscountingCurve() {
return _discountingCurve;
}
public void setDiscountingCurve(final String discountingCurve) {
_discountingCurve = discountingCurve;
}
public String getForwardCurve() {
return _forwardCurve;
}
public void setForwardCurve(final String forwardCurve) {
_forwardCurve = forwardCurve;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getCurveConfiguration(), "curveConfiguration");
ArgumentChecker.notNullInjected(getDiscountingCurve(), "discountingCurve");
ArgumentChecker.notNullInjected(getForwardCurve(), "forwardCurve");
}
}
/**
* Currency pair specific data.
*/
public static class CurrencyPairInfo implements InitializingBean {
private String _curveName;
private String _curveCalculationMethod = ForwardCurveValuePropertyNames.PROPERTY_YIELD_CURVE_IMPLIED_METHOD;
public String getCurveName() {
return _curveName;
}
public void setCurveName(final String curveName) {
_curveName = curveName;
}
public String getCurveCalculationMethod() {
return _curveCalculationMethod;
}
public void setCurveCalculationMethod(final String curveCalculationMethod) {
_curveCalculationMethod = curveCalculationMethod;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getCurveName(), "curveName");
ArgumentChecker.notNullInjected(getCurveCalculationMethod(), "curveCalculationMethod");
}
}
private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<>();
private final Map<Pair<String, String>, CurrencyPairInfo> _perCurrencyPairInfo = new HashMap<>();
private String _interpolator = "DoubleQuadratic";
private String _leftExtrapolator = "LinearExtrapolator";
private String _rightExtrapolator = "FlatExtrapolator";
public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) {
_perCurrencyInfo.clear();
_perCurrencyInfo.putAll(perCurrencyInfo);
}
public Map<String, CurrencyInfo> getPerCurrencyInfo() {
return _perCurrencyInfo;
}
public void setCurrencyInfo(final String currency, final CurrencyInfo info) {
_perCurrencyInfo.put(currency, info);
}
public CurrencyInfo getCurrencyInfo(final String currency) {
return _perCurrencyInfo.get(currency);
}
public void setPerCurrencyPairInfo(final Map<Pair<String, String>, CurrencyPairInfo> perCurrencyPairInfo) {
_perCurrencyPairInfo.clear();
_perCurrencyPairInfo.putAll(perCurrencyPairInfo);
}
public Map<Pair<String, String>, CurrencyPairInfo> getPerCurrencyPairInfo() {
return _perCurrencyPairInfo;
}
public void setCurrencyPairInfo(final Pair<String, String> currencyPair, final CurrencyPairInfo info) {
_perCurrencyPairInfo.put(currencyPair, info);
}
public CurrencyPairInfo getCurrencyPairInfo(final Pair<String, String> currencyPair) {
return _perCurrencyPairInfo.get(currencyPair);
}
public void setInterpolator(final String interpolator) {
_interpolator = interpolator;
}
public String getInterpolator() {
return _interpolator;
}
public void setLeftExtrapolator(final String leftExtrapolator) {
_leftExtrapolator = leftExtrapolator;
}
public String getLeftExtrapolator() {
return _leftExtrapolator;
}
public void setRightExtrapolator(final String rightExtrapolator) {
_rightExtrapolator = rightExtrapolator;
}
public String getRightExtrapolator() {
return _rightExtrapolator;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getInterpolator(), "interpolator");
ArgumentChecker.notNullInjected(getLeftExtrapolator(), "leftExtrapolator");
ArgumentChecker.notNullInjected(getRightExtrapolator(), "rightExtrapolator");
super.afterPropertiesSet();
}
protected void addForwardCurveDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyInfo().size() * 3];
int i = 0;
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getCurveConfiguration();
args[i++] = e.getValue().getDiscountingCurve();
}
functions.add(functionConfiguration(FXForwardCurveFromYieldCurvesPrimitiveDefaults.class, args));
functions.add(functionConfiguration(FXForwardCurveFromYieldCurvesSecurityDefaults.class, args));
}
protected void addFXForwardCurveDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyPairInfo().size() * 3];
int i = 0;
for (final Map.Entry<Pair<String, String>, CurrencyPairInfo> e : getPerCurrencyPairInfo().entrySet()) {
final String ccy1 = e.getKey().getFirst();
final String ccy2 = e.getKey().getSecond();
if (ccy1.compareTo(ccy2) <= 0) {
args[i++] = ccy1 + ccy2;
} else {
args[i++] = ccy2 + ccy1;
}
args[i++] = e.getValue().getCurveName();
args[i++] = e.getValue().getCurveCalculationMethod();
}
functions.add(functionConfiguration(FXForwardCurvePrimitiveDefaults.class, args));
functions.add(functionConfiguration(FXForwardCurveSecurityDefaults.class, args));
functions.add(functionConfiguration(FXForwardCurveTradeDefaults.class, args));
}
/**
* Adds defaults for functions that calculate a commodity forward curve using future quotes.
* @param functions The list of functions
*/
protected void addCommodityForwardFromFutureCurvePerCurrencyDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyInfo().size() * 3 + 1];
args[0] = PriorityClass.ABOVE_NORMAL.name();
int i = 1;
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getForwardCurve();
args[i++] = e.getValue().getCurveConfiguration();
}
functions.add(functionConfiguration(CommodityForwardCurveFromFuturePerCurrencyDefaults.class, args));
}
/**
* Adds defaults for functions that calculate an equity forward curve using future quotes.
* @param functions The list of functions
*/
protected void addEquityForwardFromFutureCurvePerCurrencyDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyInfo().size() * 3 + 1];
args[0] = PriorityClass.ABOVE_NORMAL.name();
int i = 1;
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getForwardCurve();
args[i++] = e.getValue().getCurveConfiguration();
}
functions.add(functionConfiguration(EquityIndexForwardCurveFromFuturePerCurrencyDefaults.class, args));
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(FXForwardCurveFromMarketQuotesDefaults.class, getInterpolator(), getLeftExtrapolator(), getRightExtrapolator()));
functions.add(functionConfiguration(InterpolatedForwardCurveDefaults.class, getInterpolator(), getLeftExtrapolator(), getRightExtrapolator()));
if (!getPerCurrencyInfo().isEmpty()) {
addForwardCurveDefaults(functions);
addCommodityForwardFromFutureCurvePerCurrencyDefaults(functions);
addEquityForwardFromFutureCurvePerCurrencyDefaults(functions);
}
if (!getPerCurrencyPairInfo().isEmpty()) {
addFXForwardCurveDefaults(functions);
}
}
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(ForwardSwapCurveFromMarketQuotesFunction.class));
functions.add(functionConfiguration(ForwardSwapCurveMarketDataFunction.class));
functions.add(functionConfiguration(FXForwardCurveFromMarketQuotesFunction.class));
functions.add(functionConfiguration(FXForwardCurveFromYieldCurvesFunction.class));
functions.add(functionConfiguration(FXForwardCurveMarketDataFunction.class));
functions.add(functionConfiguration(FXForwardPointsCurveMarketDataFunction.class));
functions.add(functionConfiguration(CommodityForwardCurveFromFutureCurveFunction.class));
functions.add(functionConfiguration(EquityIndexForwardCurveFromFutureCurveFunction.class));
}
}