/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.security;
import com.opengamma.core.security.Security;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexSecurity;
import com.opengamma.financial.security.credit.IndexCDSSecurity;
import com.opengamma.financial.security.equity.EquityVarianceSwapSecurity;
import com.opengamma.financial.security.forward.AgricultureForwardSecurity;
import com.opengamma.financial.security.forward.EnergyForwardSecurity;
import com.opengamma.financial.security.forward.MetalForwardSecurity;
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.financial.security.future.StockFutureSecurity;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.financial.security.option.CommodityFutureOptionSecurity;
import com.opengamma.financial.security.option.CreditDefaultSwapOptionSecurity;
import com.opengamma.financial.security.option.EquityBarrierOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexDividendFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexOptionSecurity;
import com.opengamma.financial.security.option.EquityOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
import com.opengamma.id.ExternalId;
/**
* Visitor to obtain the id of an underlying, null if not applicable
*/
public class UnderlyingVisitor extends FinancialSecurityVisitorSameValueAdapter<ExternalId> {
public UnderlyingVisitor() {
super(null);
}
private static final UnderlyingVisitor INSTANCE = new UnderlyingVisitor();
public static UnderlyingVisitor getInstance() {
return INSTANCE;
}
/**
* Returns the underlying id of a security (e.g. the id of the equity underlying an equity future).
*
* @param security The security, not null
* @return The id of the underlying of a security, where it is possible to identify this, or null
*/
public static ExternalId getUnderlyingId(final Security security) {
if (security instanceof FinancialSecurity) {
final FinancialSecurity finSec = (FinancialSecurity) security;
return finSec.accept(getInstance());
}
return null;
}
@Override
public ExternalId visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEnergyForwardSecurity(final EnergyForwardSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitAgricultureForwardSecurity(final AgricultureForwardSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitMetalForwardSecurity(final MetalForwardSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityIndexDividendFutureSecurity(final EquityIndexDividendFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitStockFutureSecurity(final StockFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityFutureSecurity(final EquityFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEnergyFutureSecurity(final EnergyFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitIndexFutureSecurity(final IndexFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitMetalFutureSecurity(final MetalFutureSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityBarrierOptionSecurity(final EquityBarrierOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityIndexDividendFutureOptionSecurity(final EquityIndexDividendFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityOptionSecurity(final EquityOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitEquityVarianceSwapSecurity(final EquityVarianceSwapSecurity security) {
return security.getSpotUnderlyingId();
}
@Override
public ExternalId visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitCreditDefaultSwapIndexSecurity(final CreditDefaultSwapIndexSecurity security) {
return security.getReferenceEntity();
}
@Override
public ExternalId visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
return security.getUnderlyingId();
}
@Override
public ExternalId visitIndexCDSSecurity(IndexCDSSecurity security) {
return security.getUnderlyingIndex().resolve().getExternalIdBundle().iterator().next();
}
}