/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.bond; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.opengamma.core.security.Security; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueRequirementNames; import com.opengamma.financial.property.DefaultPropertyFunction; import com.opengamma.financial.security.FinancialSecurityTypes; import com.opengamma.financial.security.FinancialSecurityUtils; import com.opengamma.financial.security.bond.BondSecurity; import com.opengamma.financial.security.future.BondFutureSecurity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * */ public class BondSecurityCurveNameDefaults extends DefaultPropertyFunction { private static final String[] s_bondValueNames = new String[] { ValueRequirementNames.CLEAN_PRICE, ValueRequirementNames.DIRTY_PRICE, ValueRequirementNames.MACAULAY_DURATION, ValueRequirementNames.MODIFIED_DURATION, ValueRequirementNames.PRESENT_VALUE, ValueRequirementNames.YTM, ValueRequirementNames.Z_SPREAD, ValueRequirementNames.PRESENT_VALUE_Z_SPREAD_SENSITIVITY, ValueRequirementNames.CONVEXITY, ValueRequirementNames.ACCRUED_INTEREST, ValueRequirementNames.PV01, ValueRequirementNames.DV01, }; private static final String[] s_bondFutureValueNames = new String[] { ValueRequirementNames.GROSS_BASIS, ValueRequirementNames.NET_BASIS }; private final Map<String, Pair<String, String>> _currencyAndRiskFreeCurveNames; private final Map<String, Pair<String, String>> _currencyAndCreditCurveNames; public BondSecurityCurveNameDefaults(final String... currencyAndCurveConfigNames) { super(FinancialSecurityTypes.BOND_SECURITY.or(FinancialSecurityTypes.BOND_FUTURE_SECURITY), true); ArgumentChecker.notNull(currencyAndCurveConfigNames, "currency and curve config names"); ArgumentChecker.isTrue(currencyAndCurveConfigNames.length % 5 == 0, "Must have a risk-free curve name, risk-free curve config, credit curve name and credit curve config per currency"); _currencyAndCreditCurveNames = new HashMap<>(); _currencyAndRiskFreeCurveNames = new HashMap<>(); for (int i = 0; i < currencyAndCurveConfigNames.length; i += 5) { final String currency = currencyAndCurveConfigNames[i]; final String riskFreeCurve = currencyAndCurveConfigNames[i + 1]; final String riskFreeConfig = currencyAndCurveConfigNames[i + 2]; final String creditCurve = currencyAndCurveConfigNames[i + 3]; final String creditConfig = currencyAndCurveConfigNames[i + 4]; _currencyAndRiskFreeCurveNames.put(currency, Pairs.of(riskFreeCurve, riskFreeConfig)); _currencyAndCreditCurveNames.put(currency, Pairs.of(creditCurve, creditConfig)); } } @Override public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) { final String currency = FinancialSecurityUtils.getCurrency(target.getSecurity()).getCode(); return _currencyAndCreditCurveNames.containsKey(currency); } private static void addProperties(final PropertyDefaults defaults, final String[] values) { for (final String value : values) { defaults.addValuePropertyName(value, BondFunction.PROPERTY_CREDIT_CURVE); defaults.addValuePropertyName(value, BondFunction.PROPERTY_RISK_FREE_CURVE); defaults.addValuePropertyName(value, BondFunction.PROPERTY_CREDIT_CURVE_CONFIG); defaults.addValuePropertyName(value, BondFunction.PROPERTY_RISK_FREE_CURVE_CONFIG); } } @Override protected void getDefaults(final PropertyDefaults defaults) { final Security target = defaults.getTarget().getSecurity(); if (target instanceof BondSecurity) { addProperties(defaults, s_bondValueNames); } else { assert target instanceof BondFutureSecurity; addProperties(defaults, s_bondFutureValueNames); } } @Override protected Set<String> getDefaultValue(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue, final String propertyName) { final String currency = FinancialSecurityUtils.getCurrency(target.getSecurity()).getCode(); if (BondFunction.PROPERTY_CREDIT_CURVE.equals(propertyName)) { return Collections.singleton(_currencyAndCreditCurveNames.get(currency).getFirst()); } if (BondFunction.PROPERTY_CREDIT_CURVE_CONFIG.equals(propertyName)) { return Collections.singleton(_currencyAndCreditCurveNames.get(currency).getSecond()); } if (BondFunction.PROPERTY_RISK_FREE_CURVE.equals(propertyName)) { return Collections.singleton(_currencyAndRiskFreeCurveNames.get(currency).getFirst()); } if (BondFunction.PROPERTY_RISK_FREE_CURVE_CONFIG.equals(propertyName)) { return Collections.singleton(_currencyAndRiskFreeCurveNames.get(currency).getSecond()); } return null; } }