/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.forex.defaultproperties; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.InitializingBean; import com.opengamma.analytics.math.interpolation.Interpolator1DFactory; import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean; import com.opengamma.engine.function.config.FunctionConfiguration; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.Pair; /** * Function repository configuration source for the default functions contained in this package. */ public class DefaultPropertiesFunctions extends AbstractFunctionConfigurationBean { /** * Currency specific data. */ public static class CurrencyInfo implements InitializingBean { /** The curve configuration name */ private String _curveConfiguration; /** The discounting curve name */ private String _discountingCurve; /** * Gets the curve configuration name. * @return The curve configuration name */ public String getCurveConfiguration() { return _curveConfiguration; } /** * Sets the curve configuration name. * @param curveConfiguration The curve configuration name, not null */ public void setCurveConfiguration(final String curveConfiguration) { _curveConfiguration = curveConfiguration; } /** * Gets the discounting curve name * @return The discounting curve name */ public String getDiscountingCurve() { return _discountingCurve; } /** * Sets the discounting curve name. * @param discountingCurve The discounting curve name, not null */ public void setDiscountingCurve(final String discountingCurve) { _discountingCurve = discountingCurve; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getCurveConfiguration(), "curveConfiguration"); ArgumentChecker.notNullInjected(getDiscountingCurve(), "discountingCurve"); } } /** * Currency-pair specific data. */ public static class CurrencyPairInfo implements InitializingBean { /** The surface name */ private String _surfaceName; /** The forward curve name */ private String _forwardCurveName; /** * Sets the surface name * @param surfaceName The surface name, not null */ public void setSurfaceName(final String surfaceName) { _surfaceName = surfaceName; } /** * Gets the surface name. * @return The surface name */ public String getSurfaceName() { return _surfaceName; } /** * Gets the forward curve name. * @return The forward curve name */ public String getForwardCurveName() { return _forwardCurveName; } /** * Sets the forward curve name * @param forwardCurveName The forward curve name, not null */ public void setForwardCurveName(final String forwardCurveName) { _forwardCurveName = forwardCurveName; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getSurfaceName(), "surfaceName"); ArgumentChecker.notNullInjected(getForwardCurveName(), "forwardCurveName"); } } /** The per-currency defaults */ private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<>(); /** The per-currency pair defaults */ private final Map<Pair<String, String>, CurrencyPairInfo> _perCurrencyPairInfo = new HashMap<>(); /** The default interpolator name */ private String _interpolatorName = Interpolator1DFactory.DOUBLE_QUADRATIC; /** The default left extrapolator name */ private String _leftExtrapolatorName = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; /** The default right extrapolator name */ private String _rightExtrapolatorName = Interpolator1DFactory.LINEAR_EXTRAPOLATOR; /** * Sets the defaults for a set of currencies. * @param perCurrencyInfo The currency pair defaults */ public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) { _perCurrencyInfo.clear(); _perCurrencyInfo.putAll(perCurrencyInfo); } /** * Gets the defaults for a currency. * @return The currency defaults */ public Map<String, CurrencyInfo> getPerCurrencyInfo() { return _perCurrencyInfo; } /** * Sets the defaults for a currency. * @param currency The currency * @param info The defaults */ public void setCurrencyInfo(final String currency, final CurrencyInfo info) { _perCurrencyInfo.put(currency, info); } /** * Gets the defaults for a currency. * @param currency The currency * @return The defaults */ public CurrencyInfo getCurrencyInfo(final String currency) { return _perCurrencyInfo.get(currency); } /** * Sets the defaults for a set of currency pairs. * @param perCurrencyPairInfo The currency pairs and defaults */ public void setPerCurrencyPairInfo(final Map<Pair<String, String>, CurrencyPairInfo> perCurrencyPairInfo) { _perCurrencyPairInfo.clear(); _perCurrencyPairInfo.putAll(perCurrencyPairInfo); } /** * Gets the defaults for a currency pair. * @return The defaults */ public Map<Pair<String, String>, CurrencyPairInfo> getPerCurrencyPairInfo() { return _perCurrencyPairInfo; } /** * Sets defaults for a currency pair. * @param currencyPair The currency pair * @param info The currency pair defaults */ public void setCurrencyPairInfo(final Pair<String, String> currencyPair, final CurrencyPairInfo info) { _perCurrencyPairInfo.put(currencyPair, info); } /** * Gets defaults for a currency pair. * @param currencyPair The currency pair * @return The currency pair defaults */ public CurrencyPairInfo getCurrencyPairInfo(final Pair<String, String> currencyPair) { return _perCurrencyPairInfo.get(currencyPair); } /** * Sets the interpolator name. * @param interpolatorName The interpolator name, not null */ public void setInterpolatorName(final String interpolatorName) { _interpolatorName = interpolatorName; } /** * Gets the interpolator name. * @return The interpolator name */ public String getInterpolatorName() { return _interpolatorName; } /** * Sets the left extrapolator name. * @param leftExtrapolatorName The left extrapolator name, not null */ public void setLeftExtrapolatorName(final String leftExtrapolatorName) { _leftExtrapolatorName = leftExtrapolatorName; } /** * Gets the left extrapolator name. * @return The left extrapolator name */ public String getLeftExtrapolatorName() { return _leftExtrapolatorName; } /** * Sets the right extrapolator name. * @param rightExtrapolatorName The right extrapolator name, not null */ public void setRightExtrapolatorName(final String rightExtrapolatorName) { _rightExtrapolatorName = rightExtrapolatorName; } /** * Gets the right extrapolator name. * @return The right extrapolator name */ public String getRightExtrapolatorName() { return _rightExtrapolatorName; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getInterpolatorName(), "interpolatorName"); ArgumentChecker.notNullInjected(getLeftExtrapolatorName(), "leftExtrapolatorName"); ArgumentChecker.notNullInjected(getRightExtrapolatorName(), "rightExtrapolatorName"); super.afterPropertiesSet(); } /** * Adds defaults for FX forwards relevant to the discounting calculation method. * @param functions The list of functions */ protected void addFXForwardDefaults(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(FXForwardDefaults.class, args)); } /** * Adds defaults for FX forwards relevant to the forward point calculation method. * @param functions The list of functions */ protected void addFXForwardPointsDefaults(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()) { args[i++] = e.getKey().getFirst(); args[i++] = e.getKey().getSecond(); args[i++] = e.getValue().getForwardCurveName(); } functions.add(functionConfiguration(FXForwardForwardPointsDefaults.class, args)); } /** * Adds defaults for FX options relevant to the curves. * @param functions The list of functions */ protected void addFXOptionBlackCurveDefaults(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(FXOptionBlackCurveDefaults.class, args)); } /** * Adds defaults for FX options relevant to FX volatility surfaces. * @param functions The list of functions */ protected void addFXOptionBlackSurfaceDefaults(final List<FunctionConfiguration> functions) { final String[] args = new String[3 + getPerCurrencyPairInfo().size() * 3]; int i = 0; args[i++] = getInterpolatorName(); args[i++] = getLeftExtrapolatorName(); args[i++] = getRightExtrapolatorName(); for (final Map.Entry<Pair<String, String>, CurrencyPairInfo> e : getPerCurrencyPairInfo().entrySet()) { args[i++] = e.getKey().getFirst(); args[i++] = e.getKey().getSecond(); args[i++] = e.getValue().getSurfaceName(); } functions.add(functionConfiguration(FXOptionBlackSurfaceDefaults.class, args)); } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { if (!getPerCurrencyInfo().isEmpty()) { addFXForwardDefaults(functions); addFXOptionBlackCurveDefaults(functions); } if (!getPerCurrencyPairInfo().isEmpty()) { addFXOptionBlackSurfaceDefaults(functions); addFXForwardPointsDefaults(functions); } } }