/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.inflation;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.swap.SwapDefinition;
import com.opengamma.analytics.financial.instrument.swap.SwapFixedInflationZeroCouponDefinition;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider;
import com.opengamma.financial.analytics.conversion.InflationSwapSecurityConverter;
import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle;
import com.opengamma.financial.security.irs.InterestRateSwapSecurity;
import com.opengamma.financial.security.swap.ZeroCouponInflationSwapSecurity;
import com.opengamma.sesame.Environment;
import com.opengamma.sesame.FixingsFn;
import com.opengamma.sesame.cache.CacheKey;
import com.opengamma.sesame.cache.FunctionCache;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.result.Result;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Converts an {@link InterestRateSwapSecurity} into an {@link InstrumentDefinition} and {@link InstrumentDerivative}.
*/
public class DefaultInflationSwapConverterFn implements InflationSwapConverterFn {
private static final Logger s_logger = LoggerFactory.getLogger(DefaultInflationSwapConverterFn.class);
private final InflationSwapSecurityConverter _securityConverter;
private final FixedIncomeConverterDataProvider _definitionConverter;
private final FixingsFn _fixingsFn;
private final FunctionCache _cache;
/**
* @param securityConverter converts an {@link ZeroCouponInflationSwapSecurity} to a {@link SwapDefinition}
* @param definitionConverter converts a {@link SwapDefinition} to a {@link InstrumentDerivative}
* @param fixingsFn provides time series of fixings for the security
* @param cache for caching definitions and derivatives
*/
public DefaultInflationSwapConverterFn(InflationSwapSecurityConverter securityConverter,
FixedIncomeConverterDataProvider definitionConverter,
FixingsFn fixingsFn,
FunctionCache cache) {
_cache = ArgumentChecker.notNull(cache, "functionCache");
_securityConverter = ArgumentChecker.notNull(securityConverter, "securityConverter");
_definitionConverter = ArgumentChecker.notNull(definitionConverter, "defnToDerivConverter");
_fixingsFn = ArgumentChecker.notNull(fixingsFn, "htsFn");
}
@Override
public Result<Pair<SwapFixedInflationZeroCouponDefinition, InstrumentDerivative>> convert(final Environment env, final ZeroCouponInflationSwapSecurity security) {
Result<HistoricalTimeSeriesBundle> fixingsResult = _fixingsFn.getFixingsForSecurity(env, security);
if (!fixingsResult.isSuccess()) {
return Result.failure(fixingsResult);
}
final HistoricalTimeSeriesBundle fixings = fixingsResult.getValue();
CacheKey key = CacheKey.of(this, env.getValuationTime(), security);
Pair<SwapFixedInflationZeroCouponDefinition, InstrumentDerivative> pair = _cache.get(
key, new Callable<Pair<SwapFixedInflationZeroCouponDefinition, InstrumentDerivative>>() {
@Override
public Pair<SwapFixedInflationZeroCouponDefinition, InstrumentDerivative> call() throws Exception {
SwapFixedInflationZeroCouponDefinition definition =
(SwapFixedInflationZeroCouponDefinition) security.accept(_securityConverter);
InstrumentDerivative derivative =
_definitionConverter.convert(security, definition, env.getValuationTime(), fixings);
return Pairs.of(definition, derivative);
}
});
s_logger.debug(
"Created definition {} and derivative {} for security {}",
pair.getFirst(),
pair.getSecond(),
security);
return Result.success(pair);
}
}