/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.security;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.fudgemsg.FudgeMsgEnvelope;
import com.opengamma.core.link.SecurityLink;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.security.bond.BillSecurity;
import com.opengamma.financial.security.bond.CorporateBondSecurity;
import com.opengamma.financial.security.bond.GovernmentBondSecurity;
import com.opengamma.financial.security.bond.InflationBondSecurity;
import com.opengamma.financial.security.bond.MunicipalBondSecurity;
import com.opengamma.financial.security.capfloor.CapFloorCMSSpreadSecurity;
import com.opengamma.financial.security.capfloor.CapFloorSecurity;
import com.opengamma.financial.security.cash.CashBalanceSecurity;
import com.opengamma.financial.security.cash.CashSecurity;
import com.opengamma.financial.security.cashflow.CashFlowSecurity;
import com.opengamma.financial.security.cds.CDSSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexDefinitionSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexSecurity;
import com.opengamma.financial.security.cds.LegacyFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.LegacyRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.LegacyVanillaCDSSecurity;
import com.opengamma.financial.security.cds.StandardFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.StandardRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.StandardVanillaCDSSecurity;
import com.opengamma.financial.security.credit.IndexCDSDefinitionSecurity;
import com.opengamma.financial.security.credit.IndexCDSSecurity;
import com.opengamma.financial.security.credit.LegacyCDSSecurity;
import com.opengamma.financial.security.credit.StandardCDSSecurity;
import com.opengamma.financial.security.deposit.ContinuousZeroDepositSecurity;
import com.opengamma.financial.security.deposit.PeriodicZeroDepositSecurity;
import com.opengamma.financial.security.deposit.SimpleZeroDepositSecurity;
import com.opengamma.financial.security.equity.EquitySecurity;
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.fra.FRASecurity;
import com.opengamma.financial.security.fra.ForwardRateAgreementSecurity;
import com.opengamma.financial.security.future.AgricultureFutureSecurity;
import com.opengamma.financial.security.future.BondFutureSecurity;
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.FXFutureSecurity;
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.fx.FXForwardSecurity;
import com.opengamma.financial.security.fx.FXVolatilitySwapSecurity;
import com.opengamma.financial.security.fx.NonDeliverableFXForwardSecurity;
import com.opengamma.financial.security.irs.InterestRateSwapLeg;
import com.opengamma.financial.security.irs.InterestRateSwapSecurity;
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.FXBarrierOptionSecurity;
import com.opengamma.financial.security.option.FXDigitalOptionSecurity;
import com.opengamma.financial.security.option.FXOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXDigitalOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXOptionSecurity;
import com.opengamma.financial.security.option.SwaptionSecurity;
import com.opengamma.financial.security.swap.BillTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.BondTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.EquityTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.ForwardSwapSecurity;
import com.opengamma.financial.security.swap.InterestRateNotional;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.financial.security.swap.YearOnYearInflationSwapSecurity;
import com.opengamma.financial.security.swap.ZeroCouponInflationSwapSecurity;
import com.opengamma.financial.sensitivities.SecurityEntryData;
import com.opengamma.master.security.RawSecurity;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.money.Currency;
/**
* Get the currencies associated with this security, returns null if not applicable.
*/
public class CurrenciesVisitor extends FinancialSecurityVisitorSameValueAdapter<Collection<Currency>> {
private static final CurrenciesVisitor INSTANCE = new CurrenciesVisitor();
public CurrenciesVisitor() {
super(null);
}
public static CurrenciesVisitor getInstance() {
return INSTANCE;
}
/**
* @param security the security to be examined.
* @param securitySource a security source
* @return a Currency, where it is possible to determine a Currency association, null otherwise.
*/
public static Collection<Currency> getCurrencies(final Security security, final SecuritySource securitySource) {
if (security instanceof FinancialSecurity) {
final FinancialSecurity finSec = (FinancialSecurity) security;
return finSec.accept(INSTANCE);
} else if (security instanceof RawSecurity) {
final RawSecurity rawSecurity = (RawSecurity) security;
if (SecurityEntryData.EXTERNAL_SENSITIVITIES_SECURITY_TYPE.equals(security.getSecurityType())) {
final FudgeMsgEnvelope msg = OpenGammaFudgeContext.getInstance().deserialize(rawSecurity.getRawData());
final SecurityEntryData securityEntryData = OpenGammaFudgeContext.getInstance().fromFudgeMsg(SecurityEntryData.class,
msg.getMessage());
return Collections.singleton(securityEntryData.getCurrency());
}
}
return null;
}
@Override
public Collection<Currency> visitBillSecurity(final BillSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCorporateBondSecurity(final CorporateBondSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitGovernmentBondSecurity(final GovernmentBondSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitMunicipalBondSecurity(final MunicipalBondSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitInflationBondSecurity(final InflationBondSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCashBalanceSecurity(final CashBalanceSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCashSecurity(final CashSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCashFlowSecurity(final CashFlowSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquitySecurity(final EquitySecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFRASecurity(final FRASecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitForwardRateAgreementSecurity(final ForwardRateAgreementSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitSwapSecurity(final SwapSecurity security) {
if (security.getPayLeg().getNotional() instanceof InterestRateNotional && security.getReceiveLeg().getNotional() instanceof InterestRateNotional) {
final InterestRateNotional payLeg = (InterestRateNotional) security.getPayLeg().getNotional();
final InterestRateNotional receiveLeg = (InterestRateNotional) security.getReceiveLeg().getNotional();
if (payLeg.getCurrency().equals(receiveLeg.getCurrency())) {
return Collections.singletonList(payLeg.getCurrency());
}
final Collection<Currency> collection = new ArrayList<>();
collection.add(payLeg.getCurrency());
collection.add(receiveLeg.getCurrency());
return collection;
}
return null;
}
@Override
public Collection<Currency> visitForwardSwapSecurity(final ForwardSwapSecurity security) {
if (security.getPayLeg().getNotional() instanceof InterestRateNotional && security.getReceiveLeg().getNotional() instanceof InterestRateNotional) {
final InterestRateNotional payLeg = (InterestRateNotional) security.getPayLeg().getNotional();
final InterestRateNotional receiveLeg = (InterestRateNotional) security.getReceiveLeg().getNotional();
if (payLeg.getCurrency().equals(receiveLeg.getCurrency())) {
return Collections.singletonList(payLeg.getCurrency());
}
final Collection<Currency> collection = new ArrayList<>();
collection.add(payLeg.getCurrency());
collection.add(receiveLeg.getCurrency());
return collection;
}
return null;
}
@Override
public Collection<Currency> visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityOptionSecurity(final EquityOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityBarrierOptionSecurity(final EquityBarrierOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFXOptionSecurity(final FXOptionSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getCallCurrency());
currencies.add(security.getPutCurrency());
return currencies;
}
@Override
public Collection<Currency> visitNonDeliverableFXOptionSecurity(final NonDeliverableFXOptionSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getCallCurrency());
currencies.add(security.getPutCurrency());
//deliveryCurrency is always already covered
return currencies;
}
@Override
public Collection<Currency> visitSwaptionSecurity(final SwaptionSecurity security) {
// REVIEW: jim 1-Aug-2011 -- should we include the currencies of the underlying?
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity commodityFutureOptionSecurity) {
return Collections.singleton(commodityFutureOptionSecurity.getCurrency());
}
@Override
public Collection<Currency> visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
return Collections.singleton(security.getCurrency());
}
@Override
public Collection<Currency> visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityIndexDividendFutureOptionSecurity(final EquityIndexDividendFutureOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFXBarrierOptionSecurity(final FXBarrierOptionSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getCallCurrency());
currencies.add(security.getPutCurrency());
return currencies;
}
@Override
public Collection<Currency> visitFXForwardSecurity(final FXForwardSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getPayCurrency());
currencies.add(security.getReceiveCurrency());
return currencies;
}
@Override
public Collection<Currency> visitNonDeliverableFXForwardSecurity(final NonDeliverableFXForwardSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getPayCurrency());
currencies.add(security.getReceiveCurrency());
return currencies;
}
@Override
public Collection<Currency> visitCapFloorSecurity(final CapFloorSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCapFloorCMSSpreadSecurity(final CapFloorCMSSpreadSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityVarianceSwapSecurity(final EquityVarianceSwapSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFXDigitalOptionSecurity(final FXDigitalOptionSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getCallCurrency());
currencies.add(security.getPutCurrency());
return currencies;
}
@Override
public Collection<Currency> visitNonDeliverableFXDigitalOptionSecurity(final NonDeliverableFXDigitalOptionSecurity security) {
final Collection<Currency> currencies = new ArrayList<>();
currencies.add(security.getCallCurrency());
currencies.add(security.getPutCurrency());
return currencies;
}
@Override
public Collection<Currency> visitSimpleZeroDepositSecurity(final SimpleZeroDepositSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitPeriodicZeroDepositSecurity(final PeriodicZeroDepositSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitAgricultureFutureSecurity(final AgricultureFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitBondFutureSecurity(final BondFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEnergyFutureSecurity(final EnergyFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityFutureSecurity(final EquityFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityIndexDividendFutureSecurity(final EquityIndexDividendFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFXFutureSecurity(final FXFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitIndexFutureSecurity(final IndexFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitMetalFutureSecurity(final MetalFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitStockFutureSecurity(final StockFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitAgricultureForwardSecurity(final AgricultureForwardSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEnergyForwardSecurity(final EnergyForwardSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitMetalForwardSecurity(final MetalForwardSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCDSSecurity(final CDSSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitStandardVanillaCDSSecurity(final StandardVanillaCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitStandardFixedRecoveryCDSSecurity(final StandardFixedRecoveryCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitStandardRecoveryLockCDSSecurity(final StandardRecoveryLockCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitLegacyVanillaCDSSecurity(final LegacyVanillaCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitLegacyFixedRecoveryCDSSecurity(final LegacyFixedRecoveryCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitLegacyRecoveryLockCDSSecurity(final LegacyRecoveryLockCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitDeliverableSwapFutureSecurity(final DeliverableSwapFutureSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCreditDefaultSwapIndexDefinitionSecurity(final CreditDefaultSwapIndexDefinitionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitCreditDefaultSwapIndexSecurity(final CreditDefaultSwapIndexSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitZeroCouponInflationSwapSecurity(final ZeroCouponInflationSwapSecurity security) {
if (security.getPayLeg().getNotional() instanceof InterestRateNotional && security.getReceiveLeg().getNotional() instanceof InterestRateNotional) {
final InterestRateNotional payLeg = (InterestRateNotional) security.getPayLeg().getNotional();
final InterestRateNotional receiveLeg = (InterestRateNotional) security.getReceiveLeg().getNotional();
if (payLeg.getCurrency().equals(receiveLeg.getCurrency())) {
return Collections.singletonList(payLeg.getCurrency());
}
final Collection<Currency> collection = new ArrayList<>();
collection.add(payLeg.getCurrency());
collection.add(receiveLeg.getCurrency());
return collection;
}
return null;
}
@Override
public Collection<Currency> visitYearOnYearInflationSwapSecurity(final YearOnYearInflationSwapSecurity security) {
if (security.getPayLeg().getNotional() instanceof InterestRateNotional && security.getReceiveLeg().getNotional() instanceof InterestRateNotional) {
final InterestRateNotional payLeg = (InterestRateNotional) security.getPayLeg().getNotional();
final InterestRateNotional receiveLeg = (InterestRateNotional) security.getReceiveLeg().getNotional();
if (payLeg.getCurrency().equals(receiveLeg.getCurrency())) {
return Collections.singletonList(payLeg.getCurrency());
}
final Collection<Currency> collection = new ArrayList<>();
collection.add(payLeg.getCurrency());
collection.add(receiveLeg.getCurrency());
return collection;
}
return null;
}
@Override
public Collection<Currency> visitInterestRateSwapSecurity(final InterestRateSwapSecurity security) {
final Collection<Currency> collection = new HashSet<>();
for (final InterestRateSwapLeg leg : security.getLegs()) {
collection.add(leg.getNotional().getCurrency());
}
return collection;
}
@Override
public Collection<Currency> visitFXVolatilitySwapSecurity(final FXVolatilitySwapSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitEquityTotalReturnSwapSecurity(final EquityTotalReturnSwapSecurity security) {
final Set<Currency> currencies = new HashSet<>();
EquitySecurity equity = SecurityLink.resolvable(security.getAssetId(), EquitySecurity.class).resolve();
currencies.add(equity.getCurrency());
currencies.add(security.getFundingLeg().getNotional().getCurrency());
return currencies;
}
@Override
public Collection<Currency> visitBondTotalReturnSwapSecurity(final BondTotalReturnSwapSecurity security) {
final Set<Currency> currencies = new HashSet<>();
currencies.add(security.getNotionalCurrency());
currencies.add(security.getFundingLeg().getNotional().getCurrency());
return currencies;
}
@Override
public Collection<Currency> visitBillTotalReturnSwapSecurity(final BillTotalReturnSwapSecurity security) {
final Set<Currency> currencies = new HashSet<>();
currencies.add(security.getNotionalCurrency());
currencies.add(security.getFundingLeg().getNotional().getCurrency());
return currencies;
}
@Override
public Collection<Currency> visitIndexCDSDefinitionSecurity(final IndexCDSDefinitionSecurity security) {
return Collections.singletonList(security.getCurrency());
}
@Override
public Collection<Currency> visitStandardCDSSecurity(final StandardCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitLegacyCDSSecurity(final LegacyCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency());
}
@Override
public Collection<Currency> visitIndexCDSSecurity(final IndexCDSSecurity security) {
return Collections.singletonList(security.getNotional().getCurrency()); // should this be read from the underlying index?
}
}