/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.timeseries; import java.util.ArrayList; import java.util.Arrays; import java.util.List; 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.engine.value.ValueRequirementNames; import com.opengamma.financial.analytics.ircurve.YieldCurveDefinition; import com.opengamma.financial.analytics.ircurve.calcconfig.MultiCurveCalculationConfig; import com.opengamma.financial.analytics.model.curve.interestrate.ImpliedDepositCurveFunction; import com.opengamma.financial.config.ConfigMasterChangeProvider; 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 TimeSeriesFunctions 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 TimeSeriesFunctions().getObjectCreating(); } /** * Returns a factory that populates the repository with functions that produce {@link ValueRequirementNames#YIELD_CURVE_HISTORICAL_TIME_SERIES} for all curve types <b>except</b> * {@link ImpliedDepositCurveFunction#IMPLIED_DEPOSIT} * * @param configMaster The configuration master * @return A function configuration source */ 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(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 { /** The configuration master */ private ConfigMaster _configMaster; /** * Sets the configuration master. * * @param configMaster The config master */ public void setConfigMaster(final ConfigMaster configMaster) { _configMaster = configMaster; } /** * Gets the configuration master. * * @return The configuration master. */ public ConfigMaster getConfigMaster() { return _configMaster; } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { // search for the names of implied deposit curves and exclude from historical time series function final List<String> excludedCurves = 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)) { excludedCurves.addAll(Arrays.asList(config.getYieldCurveNames())); } } if (excludedCurves.isEmpty()) { functions.add(functionConfiguration(YieldCurveHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(YieldCurveConversionSeriesFunction.class)); } else { final String[] excludedCurvesArray = excludedCurves.toArray(new String[excludedCurves.size()]); functions.add(functionConfiguration(YieldCurveHistoricalTimeSeriesFunction.class, excludedCurvesArray)); functions.add(functionConfiguration(YieldCurveConversionSeriesFunction.class, excludedCurvesArray)); } } public static boolean isMonitoredType(final String type) { return MultiCurveCalculationConfig.class.getName().equals(type); } } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { functions.add(functionConfiguration(CreditSpreadCurveHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(CurveConfigurationHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(CurveHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(DefaultHistoricalTimeSeriesShiftFunction.class)); functions.add(functionConfiguration(FXForwardCurveHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(FXForwardCurveNodeReturnSeriesFunction.class)); functions.add(functionConfiguration(FXReturnSeriesFunction.class)); functions.add(functionConfiguration(FXVolatilitySurfaceHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(HistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(HistoricalTimeSeriesSecurityFunction.class)); functions.add(functionConfiguration(HistoricalTimeSeriesLatestPositionProviderIdValueFunction.class)); functions.add(functionConfiguration(HistoricalTimeSeriesLatestSecurityValueFunction.class)); functions.add(functionConfiguration(HistoricalTimeSeriesLatestValueFunction.class)); functions.add(functionConfiguration(HistoricalValuationFunction.class)); functions.add(functionConfiguration(YieldCurveInstrumentConversionHistoricalTimeSeriesFunction.class)); functions.add(functionConfiguration(YieldCurveInstrumentConversionHistoricalTimeSeriesShiftFunction.class)); functions.add(functionConfiguration(YieldCurveInstrumentConversionHistoricalTimeSeriesFunctionDeprecated.class)); functions.add(functionConfiguration(YieldCurveInstrumentConversionHistoricalTimeSeriesShiftFunctionDeprecated.class)); functions.add(functionConfiguration(VolatilityWeightedFXForwardCurveNodeReturnSeriesFunction.class)); functions.add(functionConfiguration(VolatilityWeightedFXReturnSeriesFunction.class)); functions.add(functionConfiguration(VolatilityWeightedYieldCurveNodeReturnSeriesFunction.class)); functions.add(functionConfiguration(YieldCurveNodeReturnSeriesFunction.class)); } }