/** * 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.ArrayList; import java.util.List; import java.util.Set; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.analytics.financial.provider.description.interestrate.ProviderUtils; import com.opengamma.sesame.marketdata.MarketDataBundle; import com.opengamma.sesame.marketdata.MulticurveId; import com.opengamma.sesame.trade.TradeWrapper; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.result.Result; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * Uses a curve selector to find the curve names for a trade and looks up the named curve bundles * in a {@link MarketDataBundle}. */ public class CurveSelectorMulticurveBundleFn implements DiscountingMulticurveCombinerFn { private final CurveSelector _curveSelector; public CurveSelectorMulticurveBundleFn(CurveSelector curveSelector) { _curveSelector = ArgumentChecker.notNull(curveSelector, "curveSelectorFn"); } @Override public Result<Pair<MulticurveProviderDiscount, CurveBuildingBlockBundle>> createMergedMulticurveBundle( Environment env, TradeWrapper trade, FXMatrix fxMatrix) { Result<MulticurveBundle> result = getMulticurveBundle(env, trade); if (!result.isSuccess()) { return Result.failure(result); } MulticurveBundle bundle = result.getValue(); return Result.success(Pairs.of(bundle.getMulticurveProvider(), bundle.getCurveBuildingBlockBundle())); } @Override public Result<MulticurveBundle> getMulticurveBundle(Environment env, TradeWrapper<?> trade) { Set<String> multicurveNames = _curveSelector.getMulticurveNames(trade.getTrade()); List<MulticurveBundle> bundleResults = new ArrayList<>(); List<Result<MulticurveBundle>> failures = new ArrayList<>(); for (String multicurveName : multicurveNames) { Result<MulticurveBundle> result = env.getMarketDataBundle().get(MulticurveId.of(multicurveName), MulticurveBundle.class); if (!result.isSuccess()) { failures.add(result); } else { bundleResults.add(result.getValue()); } } if (!failures.isEmpty()) { return Result.failure(failures); } return Result.success(mergeBundles(bundleResults)); } // TODO move to a helper class private static MulticurveBundle mergeBundles(List<MulticurveBundle> bundles) { if (bundles.size() == 1) { return bundles.get(0); } CurveBuildingBlockBundle mergedBlockBundle = new CurveBuildingBlockBundle(); List<MulticurveProviderDiscount> multicurves = new ArrayList<>(); for (MulticurveBundle bundle : bundles) { mergedBlockBundle.addAll(bundle.getCurveBuildingBlockBundle()); multicurves.add(bundle.getMulticurveProvider()); } MulticurveProviderDiscount mergedProvider = ProviderUtils.mergeDiscountingProviders(multicurves); return new MulticurveBundle(mergedProvider, mergedBlockBundle); } }