/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame; import java.util.Set; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.core.position.Trade; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.sesame.marketdata.IssuerMulticurveId; import com.opengamma.sesame.marketdata.MarketDataEnvironment; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.result.FailureStatus; import com.opengamma.util.result.Result; /** * Provides issuer multicurve bundles by looking them up in the {@link MarketDataEnvironment}. */ public class LookupIssuerProviderFn implements IssuerProviderFn { /** Specifies which curve should be used for a trade. */ private final CurveSelector _curveSelector; /** * @param curveSelector specifies which curve should be used for a trade */ public LookupIssuerProviderFn(CurveSelector curveSelector) { _curveSelector = ArgumentChecker.notNull(curveSelector, "curveSelectorFn"); } @Override public Result<IssuerProviderBundle> createBundle(Environment env, FinancialSecurity security, FXMatrix fxMatrix) { throw new UnsupportedOperationException("createBundle not implemented"); } @Override public Result<IssuerProviderBundle> createBundle(Environment env, Trade trade, FXMatrix fxMatrix) { return getMulticurveBundle(env, trade); } @Override public Result<IssuerProviderBundle> getMulticurveBundle(Environment env, Trade trade) { Set<String> multicurveNames = _curveSelector.getMulticurveNames(trade); switch (multicurveNames.size()) { case 0: return Result.failure(FailureStatus.CALCULATION_FAILED, "No curves configured for trade {}", trade); case 1: String multicurveName = multicurveNames.iterator().next(); IssuerMulticurveId multicurveId = IssuerMulticurveId.of(multicurveName); return env.getMarketDataBundle().get(multicurveId, IssuerProviderBundle.class); default: return Result.failure(FailureStatus.CALCULATION_FAILED, "Only one issuer curve bundle is supported per trade. Bundle names: {}, trade: {}", multicurveNames, trade); } } }