/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.tool.portfolio.xml.v1_0.conversion; import org.threeten.bp.ZonedDateTime; import com.opengamma.financial.security.fx.FXForwardSecurity; import com.opengamma.financial.security.fx.NonDeliverableFXForwardSecurity; import com.opengamma.id.ExternalId; import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.FxForwardTrade; import com.opengamma.master.security.ManageableSecurity; import com.opengamma.util.money.Currency; /** * Security extractor for fx forward trades. */ public class FxForwardTradeSecurityExtractor extends TradeSecurityExtractor<FxForwardTrade> { /** * Create a security extractor for the supplied trade. * * @param trade the trade to perform extraction on */ public FxForwardTradeSecurityExtractor(FxForwardTrade trade) { super(trade); } //------------------------------------------------------------------------- @Override public ManageableSecurity[] extractSecurities() { FxForwardTrade trade = getTrade(); ExternalId region = extractRegion(trade.getPaymentCalendars()); boolean nonDeliverable = checkNonDeliverable(trade); Currency payCurrency = trade.getPayCurrency(); double payAmount = trade.getPayAmount().doubleValue(); Currency receiveCurrency = trade.getReceiveCurrency(); double receiveAmount = trade.getReceiveAmount().doubleValue(); ZonedDateTime forwardDate = convertLocalDate(trade.getMaturityDate()); ManageableSecurity security = nonDeliverable ? // todo - expiry should be used in construction of NonDeliverableFXForwardSecurity new NonDeliverableFXForwardSecurity(payCurrency, payAmount, receiveCurrency, receiveAmount, forwardDate, region, trade.getSettlementCurrency().equals(trade.getReceiveCurrency())) : new FXForwardSecurity(payCurrency, payAmount, receiveCurrency, receiveAmount, forwardDate, region); return securityArray(addIdentifier(security)); } private boolean checkNonDeliverable(FxForwardTrade trade) { if (trade.getSettlementCurrency() != null && trade.getFxExpiry() != null) { return true; } else if (trade.getSettlementCurrency() == null && trade.getFxExpiry() == null) { return false; } else { throw new PortfolioParsingException( "Either both settlementCurrency and fxExpiry elements must be present, or neither"); } } }