package com.opengamma.sesame.fxrates; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import com.opengamma.core.security.Security; import com.opengamma.financial.currency.CurrencyPair; import com.opengamma.financial.security.CurrenciesVisitor; import com.opengamma.sesame.Environment; import com.opengamma.sesame.marketdata.FxRateId; import com.opengamma.sesame.trade.TradeWrapper; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.result.Result; /** * Default implementation to obtain fx rates for a given Security against a base currency. */ public class DefaultFxRatesFn implements FxRatesFn { private final Currency _baseCurrency; /** * Create the function. * * @param baseCurrency base currency, not null */ public DefaultFxRatesFn(Currency baseCurrency) { _baseCurrency = ArgumentChecker.notNull(baseCurrency, "baseCurrency"); } @Override public Result<Map<Currency, Double>> getFxRates(Environment env, Security security) { Collection<Currency> currencies = CurrenciesVisitor.getCurrencies(security, null); Map<Currency, Double> rates = new HashMap<>(); List<Result<?>> failures = new ArrayList<>(); for (Currency currency : currencies) { if (currency == _baseCurrency) { rates.put(currency, 1.0); continue; } CurrencyPair currencyPair = CurrencyPair.of(_baseCurrency, currency); Result<Double> fxRateResult = env.getMarketDataBundle().get(FxRateId.of(currencyPair), Double.class); if (fxRateResult.isSuccess()) { rates.put(currency, fxRateResult.getValue()); } else { failures.add(fxRateResult); } } if (failures.isEmpty()) { return Result.success(rates); } else { return Result.failure(failures); } } @Override public Result<Map<Currency, Double>> getFxRates(Environment env, TradeWrapper trade) { return getFxRates(env, trade.getSecurity()); } }