/**
* 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 static java.lang.String.format;
import java.math.BigDecimal;
import java.util.List;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.businessday.BusinessDayConventionFactory;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.daycount.DayCountFactory;
import com.opengamma.financial.convention.frequency.Frequency;
import com.opengamma.financial.convention.frequency.SimpleFrequencyFactory;
import com.opengamma.financial.security.swap.FixedInterestRateLeg;
import com.opengamma.financial.security.swap.FloatingInterestRateLeg;
import com.opengamma.financial.security.swap.FloatingRateType;
import com.opengamma.financial.security.swap.InterestRateNotional;
import com.opengamma.financial.security.swap.Notional;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.FixedLeg;
import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.FixingIndex;
import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.FloatingLeg;
import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.SwapLeg;
import com.opengamma.integration.tool.portfolio.xml.v1_0.jaxb.SwapTrade;
import com.opengamma.master.security.ManageableSecurity;
/**
* Security extractor for swap trades.
*/
public class SwapTradeSecurityExtractor extends TradeSecurityExtractor<SwapTrade> {
/**
* Create a security extractor for the supplied trade.
*
* @param trade the trade to perform extraction on
*/
public SwapTradeSecurityExtractor(SwapTrade trade) {
super(trade);
}
//-------------------------------------------------------------------------
@Override
public ManageableSecurity[] extractSecurities() {
SwapTrade trade = getTrade();
List<SwapLeg> payLegs = Lists.newArrayList(trade.getPayLegs());
List<SwapLeg> recLegs = Lists.newArrayList(trade.getReceiveLegs());
Preconditions.checkState(payLegs.size() == 1, format("Swaps must have one (and only one) pay leg. Found %d", payLegs.size()));
Preconditions.checkState(recLegs.size() == 1, format("Swaps must have one (and only one) receive leg. Found %d", recLegs.size()));
ManageableSecurity security = new SwapSecurity(
convertLocalDate(trade.getTradeDate()),
convertLocalDate(trade.getEffectiveDate()),
convertLocalDate(trade.getMaturityDate()),
trade.getCounterparty().getExternalId().getId(),
convertLeg(payLegs.get(0)),
convertLeg(recLegs.get(0)));
return securityArray(addIdentifier(security));
}
/**
* Converts the given leg to the appropriate type of leg in security lib.
* @param leg the leg to convert
* @return the converted leg.
* @throws PortfolioParsingException if the leg is not of type {@link FixedLeg} or {@link FloatingLeg}.
*/
private com.opengamma.financial.security.swap.SwapLeg convertLeg(SwapLeg leg) {
if (leg instanceof FixedLeg) {
return convertFixedLeg((FixedLeg) leg);
} else if (leg instanceof FloatingLeg) {
return convertFloatingLeg((FloatingLeg) leg);
} else {
throw new PortfolioParsingException(format("Unknown leg type detected: %s", leg.getClass().getName()));
}
}
private com.opengamma.financial.security.swap.SwapLeg convertFixedLeg(FixedLeg fixedLeg) {
Notional notional = extractNotional(fixedLeg);
DayCount dayCount = DayCountFactory.of(fixedLeg.getDayCount());
Frequency frequency = SimpleFrequencyFactory.of(fixedLeg.getFrequency());
ExternalId region = extractRegion(fixedLeg);
BusinessDayConvention businessDayConvention = BusinessDayConventionFactory.of(fixedLeg.getBusinessDayConvention());
boolean isEndOfMonth = fixedLeg.isEndOfMonth();
return new FixedInterestRateLeg(dayCount, frequency, region, businessDayConvention, notional, isEndOfMonth,
convertRate(fixedLeg.getRate()));
}
private com.opengamma.financial.security.swap.SwapLeg convertFloatingLeg(FloatingLeg floatingLeg) {
Notional notional = extractNotional(floatingLeg);
ExternalId region = extractRegion(floatingLeg);
DayCount dayCount = DayCountFactory.of(floatingLeg.getDayCount());
Frequency frequency = SimpleFrequencyFactory.of(floatingLeg.getFrequency());
BusinessDayConvention businessDayConvention = BusinessDayConventionFactory.of(floatingLeg.getBusinessDayConvention());
boolean isEndOfMonth = floatingLeg.isEndOfMonth();
FixingIndex fixingIndex = floatingLeg.getFixingIndex();
ExternalId referenceRate = fixingIndex.getIndex().toExternalId();
FloatingRateType rateType = FloatingRateType.valueOf(fixingIndex.getRateType().toString());
return new FloatingInterestRateLeg(dayCount, frequency, region, businessDayConvention, notional, isEndOfMonth,
referenceRate, rateType);
}
private Notional extractNotional(SwapLeg floatingLeg) {
return new InterestRateNotional(floatingLeg.getCurrency(), floatingLeg.getNotional().doubleValue());
}
private ExternalId extractRegion(SwapLeg floatingLeg) {
return extractRegion(floatingLeg.getPaymentCalendars());
}
private double convertRate(BigDecimal rate) {
return rate.divide(new BigDecimal(100)).doubleValue();
}
}