/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.ircurve; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.opengamma.core.change.ChangeEvent; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean; import com.opengamma.engine.function.config.BeanDynamicFunctionConfigurationSource; import com.opengamma.engine.function.config.FunctionConfiguration; import com.opengamma.engine.function.config.FunctionConfigurationSource; import com.opengamma.engine.function.config.VersionedFunctionConfigurationBean; import com.opengamma.financial.analytics.BucketedPV01Function; import com.opengamma.financial.analytics.curve.ConstantCurveDefinition; import com.opengamma.financial.analytics.curve.CurveDefinition; import com.opengamma.financial.analytics.curve.CurveDefinitionFunction; import com.opengamma.financial.analytics.curve.CurveMarketDataFunction; import com.opengamma.financial.analytics.curve.CurveSpecificationFunction; import com.opengamma.financial.analytics.curve.InterpolatedCurveDefinition; import com.opengamma.financial.analytics.curve.SpreadCurveDefinition; import com.opengamma.financial.analytics.ircurve.calcconfig.MultiCurveCalculationConfig; import com.opengamma.financial.analytics.model.curve.interestrate.ImpliedDepositCurveFunction; import com.opengamma.financial.analytics.model.curve.interestrate.ImpliedDepositCurveSeriesFunction; import com.opengamma.financial.config.ConfigMasterChangeProvider; import com.opengamma.financial.security.function.ISINFunction; import com.opengamma.master.config.ConfigDocument; import com.opengamma.master.config.ConfigMaster; import com.opengamma.master.config.ConfigSearchRequest; import com.opengamma.master.config.impl.ConfigSearchIterator; /** * Function repository configuration source for the functions contained in this package. */ public class IRCurveFunctions 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 IRCurveFunctions().getObjectCreating(); } public static FunctionConfigurationSource providers(final ConfigMaster configMaster) { return new BeanDynamicFunctionConfigurationSource(ConfigMasterChangeProvider.of(configMaster)) { @Override protected VersionedFunctionConfigurationBean createConfiguration() { final Providers providers = new Providers(); providers.setConfigMaster(configMaster); return providers; } @Override protected boolean isPropogateEvent(final ChangeEvent event) { return Providers.isMonitoredType(event.getObjectId().getValue()); } }; } /** * Function repository configuration source for yield curve functions based on the items defined in a Config Master. */ public static class Providers extends VersionedFunctionConfigurationBean { private static final Class<?>[] s_curveClasses = new Class[] {CurveDefinition.class, InterpolatedCurveDefinition.class, ConstantCurveDefinition.class, SpreadCurveDefinition.class }; private static final Set<String> s_monitoredTypes; static { s_monitoredTypes = new HashSet<String>(); s_monitoredTypes.add(MultiCurveCalculationConfig.class.getName()); s_monitoredTypes.add(YieldCurveDefinition.class.getName()); for (Class<?> curveClass : s_curveClasses) { s_monitoredTypes.add(curveClass.getName()); } } private ConfigMaster _configMaster; public void setConfigMaster(final ConfigMaster configMaster) { _configMaster = configMaster; } public ConfigMaster getConfigMaster() { return _configMaster; } protected void addYieldCurveFunctions(final List<FunctionConfiguration> functions, final String currency, final String curveName) { functions.add(functionConfiguration(YieldCurveMarketDataFunction.class, currency, curveName)); functions.add(functionConfiguration(YieldCurveInterpolatingFunction.class, currency, curveName)); functions.add(functionConfiguration(YieldCurveDataFunction.class, currency, curveName)); } protected void addCurveFunctions(final List<FunctionConfiguration> functions, final String curveName) { functions.add(functionConfiguration(CurveDefinitionFunction.class, curveName)); functions.add(functionConfiguration(CurveSpecificationFunction.class, curveName)); functions.add(functionConfiguration(CurveMarketDataFunction.class, curveName)); } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { // implied deposit curves final List<String> impliedDepositCurveNames = new ArrayList<>(); final ConfigSearchRequest<YieldCurveDefinition> searchRequest = new ConfigSearchRequest<>(); searchRequest.setType(MultiCurveCalculationConfig.class); searchRequest.setVersionCorrection(getVersionCorrection()); for (final ConfigDocument configDocument : ConfigSearchIterator.iterable(_configMaster, searchRequest)) { final String documentName = configDocument.getName(); final MultiCurveCalculationConfig config = ((ConfigItem<MultiCurveCalculationConfig>) configDocument.getConfig()).getValue(); if (config.getCalculationMethod().equals(ImpliedDepositCurveFunction.IMPLIED_DEPOSIT)) { functions.add(functionConfiguration(ImpliedDepositCurveFunction.class, documentName)); functions.add(functionConfiguration(ImpliedDepositCurveSeriesFunction.class, documentName)); final String currencyISO = config.getTarget().getUniqueId().getValue(); final String[] yieldCurveNames = config.getYieldCurveNames(); for (final String curveName : yieldCurveNames) { functions.add(functionConfiguration(ImpliedYieldCurveSpecificationFunction.class, currencyISO, curveName)); impliedDepositCurveNames.add(curveName); } } } searchRequest.setType(YieldCurveDefinition.class); searchRequest.setVersionCorrection(getVersionCorrection()); for (final ConfigDocument configDocument : ConfigSearchIterator.iterable(getConfigMaster(), searchRequest)) { final String documentName = configDocument.getName(); final int underscore = documentName.lastIndexOf('_'); if (underscore <= 0) { continue; } final String curveName = documentName.substring(0, underscore); if (!impliedDepositCurveNames.contains(curveName)) { // don't want to add curves with implied rates to the normal yield curve calculator final String currencyISO = documentName.substring(underscore + 1); addYieldCurveFunctions(functions, currencyISO, curveName); } } // new curves for (final Class<?> klass : s_curveClasses) { searchRequest.setType(klass); searchRequest.setVersionCorrection(getVersionCorrection()); for (final ConfigDocument configDocument : ConfigSearchIterator.iterable(getConfigMaster(), searchRequest)) { final String documentName = configDocument.getName(); addCurveFunctions(functions, documentName); } } } public static boolean isMonitoredType(final String type) { return s_monitoredTypes.contains(type); } } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { functions.add(functionConfiguration(BucketedPV01Function.class)); functions.add(functionConfiguration(DefaultYieldCurveMarketDataShiftFunction.class)); functions.add(functionConfiguration(DefaultYieldCurveShiftFunction.class)); functions.add(functionConfiguration(ISINFunction.class)); functions.add(functionConfiguration(YieldCurveMarketDataShiftFunction.class)); functions.add(functionConfiguration(YieldCurveShiftFunction.class)); } }