/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.volatility.surface;
import com.opengamma.core.config.ConfigSource;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.FunctionDefinition;
import com.opengamma.financial.analytics.model.InstrumentTypeProperties;
import com.opengamma.financial.config.ConfigSourceQuery;
import com.opengamma.id.VersionCorrection;
/**
* A source of yield curve definitions based on configuration.
* <p>
* This supplies curve definitions from a {@link ConfigSource}.
*/
public class ConfigDBVolatilitySurfaceSpecificationSource implements VolatilitySurfaceSpecificationSource {
/**
* The config source for the data.
*/
private final ConfigSourceQuery<VolatilitySurfaceSpecification> _query;
/**
* Creates an instance backed by a config source.
*
* @param configSource the source, not null
* @deprecated Use {@link #ConfigDBVolatilitySurfaceSpecificationSource(ConfigSource, VersionCorrection)} or {@link #init} instead
*/
@Deprecated
public ConfigDBVolatilitySurfaceSpecificationSource(final ConfigSource configSource) {
this(configSource, VersionCorrection.LATEST);
}
public ConfigDBVolatilitySurfaceSpecificationSource(final ConfigSource configSource, final VersionCorrection versionCorrection) {
this(new ConfigSourceQuery<>(configSource, VolatilitySurfaceSpecification.class, versionCorrection));
}
private ConfigDBVolatilitySurfaceSpecificationSource(final ConfigSourceQuery<VolatilitySurfaceSpecification> query) {
_query = query;
}
public static ConfigDBVolatilitySurfaceSpecificationSource init(final FunctionCompilationContext context, final FunctionDefinition function) {
return new ConfigDBVolatilitySurfaceSpecificationSource(ConfigSourceQuery.init(context, function, VolatilitySurfaceSpecification.class));
}
/**
* Gets the config source.
*
* @return the config source, not null
*/
protected ConfigSource getConfigSource() {
return _query.getConfigSource();
}
//-------------------------------------------------------------------------
@Override
public VolatilitySurfaceSpecification getSpecification(final String name, final String instrumentType) {
return getSpecification(name, instrumentType, _query.getVersionCorrection());
}
@Override
public VolatilitySurfaceSpecification getSpecification(final String name, final String instrumentType, final VersionCorrection versionCorrection) {
final VolatilitySurfaceSpecification specification = _query.get(name + "_" + instrumentType, versionCorrection);
if (specification == null && InstrumentTypeProperties.FOREX.equals(instrumentType)) {
final String[] substrings = name.split("_");
if (substrings.length == 2 && substrings[1].length() == 6) {
final String firstCcy = substrings[1].substring(0, 3);
final String secondCcy = substrings[1].substring(3, 6);
final String reversedCcys = secondCcy + firstCcy;
return _query.get(substrings[0] + "_" + reversedCcys + "_" + instrumentType, versionCorrection);
}
}
return specification;
}
}