/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.fxforward; import java.math.BigDecimal; import org.threeten.bp.LocalDate; import org.threeten.bp.OffsetTime; import com.opengamma.core.position.Counterparty; import com.opengamma.core.position.Trade; import com.opengamma.core.position.impl.SimpleCounterparty; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.financial.security.fx.FXForwardSecurity; import com.opengamma.id.ExternalId; import com.opengamma.sesame.DiscountingMulticurveCombinerFn; import com.opengamma.sesame.Environment; import com.opengamma.sesame.MulticurveBundle; import com.opengamma.sesame.trade.FXForwardTrade; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.result.Result; public class FXForwardDiscountingCalculatorFn implements FXForwardCalculatorFn { /** * Factory for creating a calculator for FX Forward securities. */ private final FXForwardCalculatorFactory _factory; /** * Generates a combined multicurve bundle suitable for use with a particular security. */ private final DiscountingMulticurveCombinerFn _discountingMulticurveCombinerFn; public FXForwardDiscountingCalculatorFn(FXForwardCalculatorFactory factory, DiscountingMulticurveCombinerFn discountingMulticurveCombinerFn) { _factory = ArgumentChecker.notNull(factory, "factory"); _discountingMulticurveCombinerFn = ArgumentChecker.notNull(discountingMulticurveCombinerFn, "discountingMulticurveCombinerFn"); } @Override public Result<FXForwardCalculator> generateCalculator(Environment env, final FXForwardSecurity security) { Result<MulticurveBundle> bundleResult = createBundle(env, security); if (bundleResult.isSuccess()) { MulticurveBundle value = bundleResult.getValue(); return Result.success(_factory.createCalculator(security, value.getMulticurveProvider(), value.getCurveBuildingBlockBundle())); } else { return Result.failure(bundleResult); } } private Result<MulticurveBundle> createBundle(Environment env, FXForwardSecurity security) { Trade trade = new SimpleTrade(security, BigDecimal.ONE, new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "CPARTY")), LocalDate.now(), OffsetTime.now()); FXForwardTrade tradeWrapper = new FXForwardTrade(trade); return _discountingMulticurveCombinerFn.getMulticurveBundle(env, tradeWrapper); } }