/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.volatility.cube;
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.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;
import com.opengamma.util.ArgumentChecker;
/**
* Function repository configuration source for the functions contained in this package.
*/
public class VolatilityCubeFunctions 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 VolatilityCubeFunctions().getObjectCreating();
}
/**
* Returns a configuration source populated with volatility cube definition and specification
* functions that listen to changes.
* @param configMaster The config master
* @return A 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(final ChangeEvent event) {
return Providers.isMonitoredType(event.getObjectId().getValue());
}
};
}
/**
* Function repository configuration source for curve functions based on the items defined in a {@link ConfigMaster}.
*/
public static class Providers extends VersionedFunctionConfigurationBean {
/** The configuration master */
private ConfigMaster _configMaster;
/**
* Sets the config master.
*
* @param configMaster The config master, not null
*/
public void setConfigMaster(final ConfigMaster configMaster) {
ArgumentChecker.notNull(configMaster, "config master");
_configMaster = configMaster;
}
/**
* Gets the config master.
*
* @return The config master
*/
public ConfigMaster getConfigMaster() {
return _configMaster;
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
final ConfigSearchRequest<VolatilityCubeDefinition<?, ?, ?>> searchRequest = new ConfigSearchRequest<>();
searchRequest.setVersionCorrection(getVersionCorrection());
searchRequest.setType(VolatilityCubeDefinition.class);
for (final ConfigDocument configDocument : ConfigSearchIterator.iterable(getConfigMaster(), searchRequest)) {
final VolatilityCubeDefinition<?, ?, ?> config = ((ConfigItem<VolatilityCubeDefinition<?, ?, ?>>) configDocument.getConfig()).getValue();
functions.add(functionConfiguration(VolatilityCubeDefinitionFunction.class, config.getName()));
}
searchRequest.setType(VolatilityCubeSpecification.class);
for (final ConfigDocument configDocument : ConfigSearchIterator.iterable(getConfigMaster(), searchRequest)) {
final VolatilityCubeSpecification config = ((ConfigItem<VolatilityCubeSpecification>) configDocument.getConfig()).getValue();
functions.add(functionConfiguration(VolatilityCubeSpecificationFunction.class, config.getName()));
}
}
/**
* Returns true if the type is {@link VolatilityCubeDefinition} or {@link VolatilityCubeSpecification}.
* @param type
* @return
*/
/* package */ static boolean isMonitoredType(final String type) {
return VolatilityCubeDefinition.class.getName().equals(type) || VolatilityCubeSpecification.class.getName().equals(type);
}
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(RawVolatilityCubeDataFunction.class));
functions.add(functionConfiguration(RelativeStrikeLognormalVolatilityCubeConverterFunction.class));
functions.add(functionConfiguration(MoneynessLognormalVolatilityCubeConverterFunction.class));
}
}