/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.curve.exposure;
import java.util.Arrays;
import java.util.List;
import com.opengamma.core.position.Trade;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitorSameValueAdapter;
import com.opengamma.financial.security.forward.AgricultureForwardSecurity;
import com.opengamma.financial.security.forward.CommodityForwardSecurity;
import com.opengamma.financial.security.forward.EnergyForwardSecurity;
import com.opengamma.financial.security.forward.MetalForwardSecurity;
import com.opengamma.financial.security.future.AgricultureFutureSecurity;
import com.opengamma.financial.security.future.BondFutureSecurity;
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.FXFutureSecurity;
import com.opengamma.financial.security.future.FederalFundsFutureSecurity;
import com.opengamma.financial.security.future.FutureSecurity;
import com.opengamma.financial.security.future.IndexFutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.financial.security.future.MetalFutureSecurity;
import com.opengamma.financial.security.future.StockFutureSecurity;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.financial.security.option.CommodityFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexDividendFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexFutureOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ArgumentChecker;
/**
* Exposure function that returns the contract type as an {@link ExternalId} for a given trade.
*/
public class ContractCategoryExposureFunction implements ExposureFunction {
/**
* The name of the exposure function.
*/
public static final String NAME = "Contract Category";
/** Contract identifier */
public static final String CONTRACT_IDENTIFIER = "ContractType";
private final ContractTypeVisitor _visitor;
/**
* Default constructor for ContractCategoryExposureFunction.
* @param securitySource the security source used to look up the underlying.
*/
public ContractCategoryExposureFunction(final SecuritySource securitySource) {
_visitor = new ContractTypeVisitor(ArgumentChecker.notNull(securitySource, "securitySource"));
}
@Override
public String getName() {
return NAME;
}
@Override
public List<ExternalId> getIds(Trade trade) {
Security security = trade.getSecurity();
if (security instanceof FinancialSecurity) {
return ((FinancialSecurity) security).accept(_visitor);
}
return null;
}
private static List<ExternalId> getContractType(final FutureSecurity security) {
return Arrays.asList(ExternalId.of(ContractCategoryExposureFunction.CONTRACT_IDENTIFIER, security.getContractCategory()));
}
private static List<ExternalId> getContractType(final CommodityForwardSecurity security) {
return Arrays.asList(ExternalId.of(ContractCategoryExposureFunction.CONTRACT_IDENTIFIER, security.getContractCategory()));
}
/**
* Implementation of the FinancialSecurityVisitor that returns the contract type for a security. If the security does
* not have a contract type, then null is returned.
*/
private static final class ContractTypeVisitor extends FinancialSecurityVisitorSameValueAdapter<List<ExternalId>> {
private final SecuritySource _securitySource;
/**
* Default constructor that initialises the default returned value to null.
*/
public ContractTypeVisitor(SecuritySource securitySource) {
super(null);
_securitySource = ArgumentChecker.notNull(securitySource, "securitySource");
}
@Override
public List<ExternalId> visitAgricultureFutureSecurity(final AgricultureFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitBondFutureSecurity(final BondFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitEquityIndexDividendFutureSecurity(final EquityIndexDividendFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitFXFutureSecurity(final FXFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitStockFutureSecurity(final StockFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitEquityFutureSecurity(final EquityFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitEnergyFutureSecurity(final EnergyFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitIndexFutureSecurity(final IndexFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitMetalFutureSecurity(final MetalFutureSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitEquityIndexDividendFutureOptionSecurity(final EquityIndexDividendFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
final FutureSecurity underlyingSecurity = (FutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId()));
return getContractType(underlyingSecurity);
}
@Override
public List<ExternalId> visitEnergyForwardSecurity(final EnergyForwardSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitAgricultureForwardSecurity(final AgricultureForwardSecurity security) {
return getContractType(security);
}
@Override
public List<ExternalId> visitMetalForwardSecurity(final MetalForwardSecurity security) {
return getContractType(security);
}
}
}