/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.conversion;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.core.position.Trade;
import com.opengamma.core.security.Security;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitor;
import com.opengamma.financial.security.FinancialSecurityVisitorSameValueAdapter;
import com.opengamma.financial.security.future.AgricultureFutureSecurity;
import com.opengamma.financial.security.future.DeliverableSwapFutureSecurity;
import com.opengamma.financial.security.future.EnergyFutureSecurity;
import com.opengamma.financial.security.future.EquityFutureSecurity;
import com.opengamma.financial.security.future.EquityIndexDividendFutureSecurity;
import com.opengamma.financial.security.future.FederalFundsFutureSecurity;
import com.opengamma.financial.security.future.IndexFutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.financial.security.future.MetalFutureSecurity;
import com.opengamma.util.ArgumentChecker;
/**
* Converts {@link Trade} to the appropriate {@link InstrumentDefinition}
*/
public class DefaultTradeConverter implements TradeConverter {
/** Converter for futures excluding Federal funds futures */
private final FutureTradeConverter _futureTradeConverter;
/** Converter for Federal funds futures */
private final FederalFundsFutureTradeConverter _federalFundsFutureTradeConverter;
/** Converter for STIR futures */
private final InterestRateFutureTradeConverter _interestRateFutureTradeConverter;
/** Converter for deliverable swap futures */
private final DeliverableSwapFutureTradeConverter _deliverableSwapFutureTradeConverter;
/** Converter for all other securities */
private final FinancialSecurityVisitor<InstrumentDefinition<?>> _securityConverter;
/**
* Note that this constructor explicitly sets the future trade converter and Federal funds future
* converter to null
* @param securityConverter The security converter, not null
*/
public DefaultTradeConverter(final FinancialSecurityVisitor<InstrumentDefinition<?>> securityConverter) {
ArgumentChecker.notNull(securityConverter, "securityConverter");
_securityConverter = securityConverter;
_futureTradeConverter = null;
_federalFundsFutureTradeConverter = null;
_interestRateFutureTradeConverter = null;
_deliverableSwapFutureTradeConverter = null;
}
/**
* Note that this constructor explicitly sets the Federal funds future converter to null.
* @param futureTradeConverter The futures trade converter, not null
* @param securityConverter The future security converter, not null
*/
public DefaultTradeConverter(final FutureTradeConverter futureTradeConverter, final FinancialSecurityVisitor<InstrumentDefinition<?>> securityConverter) {
ArgumentChecker.notNull(futureTradeConverter, "future trade converter");
ArgumentChecker.notNull(securityConverter, "security converter");
_futureTradeConverter = futureTradeConverter;
_federalFundsFutureTradeConverter = null;
_securityConverter = securityConverter;
_interestRateFutureTradeConverter = null;
_deliverableSwapFutureTradeConverter = null;
}
/**
* @param futureTradeConverter The futures trade converter, not null
* @param federalFundsFutureTradeConverter The Federal funds future trade converter, not null
* @param irFutureTradeConverter TODO
* @param deliverableSwapFutureTradeConverter TODO
* @param securityConverter The security converter, not null
*/
public DefaultTradeConverter(final FutureTradeConverter futureTradeConverter,
final FederalFundsFutureTradeConverter federalFundsFutureTradeConverter,
final InterestRateFutureTradeConverter irFutureTradeConverter,
final DeliverableSwapFutureTradeConverter deliverableSwapFutureTradeConverter,
final FinancialSecurityVisitor<InstrumentDefinition<?>> securityConverter) {
ArgumentChecker.notNull(futureTradeConverter, "future trade converter");
ArgumentChecker.notNull(federalFundsFutureTradeConverter, "Federal funds future trade converter");
ArgumentChecker.notNull(securityConverter, "security converter");
_futureTradeConverter = futureTradeConverter;
_federalFundsFutureTradeConverter = federalFundsFutureTradeConverter;
_interestRateFutureTradeConverter = irFutureTradeConverter;
_deliverableSwapFutureTradeConverter = deliverableSwapFutureTradeConverter;
_securityConverter = securityConverter;
}
/**
* Converts a {@link Trade} to a {@link InstrumentDefinition}
* @param trade The trade, not null
* @return The instrument definition
* @throws IllegalArgumentException if the underlying security is not a {@link FinancialSecurity}
*/
public InstrumentDefinition<?> convert(final Trade trade) {
ArgumentChecker.notNull(trade, "trade");
final Security security = trade.getSecurity();
ArgumentChecker.isTrue(security instanceof FinancialSecurity, "Security must be a FinancialSecurity");
return ((FinancialSecurity) security).accept(new TradeVisitor()).convert(trade);
}
private final class TradeVisitor extends FinancialSecurityVisitorSameValueAdapter<TradeConverter> {
public TradeVisitor() {
super(new TradeConverter() {
@Override
public InstrumentDefinition<?> convert(Trade trade) {
return ((FinancialSecurity) trade.getSecurity()).accept(_securityConverter);
}
});
}
@Override
public TradeConverter visitAgricultureFutureSecurity(AgricultureFutureSecurity security) {
return _futureTradeConverter;
}
@Override
public TradeConverter visitDeliverableSwapFutureSecurity(DeliverableSwapFutureSecurity security) {
return _deliverableSwapFutureTradeConverter;
}
@Override
public TradeConverter visitEnergyFutureSecurity(EnergyFutureSecurity security) {
return _futureTradeConverter;
}
@Override
public TradeConverter visitEquityFutureSecurity(EquityFutureSecurity security) {
return _futureTradeConverter;
}
@Override
public TradeConverter visitEquityIndexDividendFutureSecurity(EquityIndexDividendFutureSecurity security) {
return _futureTradeConverter;
}
@Override
public TradeConverter visitFederalFundsFutureSecurity(FederalFundsFutureSecurity security) {
return _federalFundsFutureTradeConverter;
}
@Override
public TradeConverter visitIndexFutureSecurity(IndexFutureSecurity security) {
return _futureTradeConverter;
}
@Override
public TradeConverter visitInterestRateFutureSecurity(InterestRateFutureSecurity security) {
return _interestRateFutureTradeConverter;
}
@Override
public TradeConverter visitMetalFutureSecurity(MetalFutureSecurity security) {
return _futureTradeConverter;
}
}
}