/**
* 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.Iterator;
import org.fudgemsg.FudgeMsgEnvelope;
import com.opengamma.core.security.Security;
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.FXVolatilitySwapSecurity;
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.FXOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
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;
/**
* Determine the currency of the security, return null if not applicable.
*/
public class CurrencyVisitor extends FinancialSecurityVisitorSameValueAdapter<Currency> {
private static final CurrencyVisitor INSTANCE = new CurrencyVisitor();
public CurrencyVisitor() {
super(null);
}
public static CurrencyVisitor getInstance() {
return INSTANCE;
}
/**
* @param security the security to be examined.
* @return a Currency, where it is possible to determine a single Currency association, null otherwise.
*/
public static Currency getCurrency(final Security security) {
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 securityEntryData.getCurrency();
}
}
return null;
}
@Override
public Currency visitBillSecurity(final BillSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitGovernmentBondSecurity(final GovernmentBondSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitMunicipalBondSecurity(final MunicipalBondSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitInflationBondSecurity(final InflationBondSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCorporateBondSecurity(final CorporateBondSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCashBalanceSecurity(final CashBalanceSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCashSecurity(final CashSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCashFlowSecurity(final CashFlowSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquitySecurity(final EquitySecurity security) {
return security.getCurrency();
}
@Override
public Currency visitFRASecurity(final FRASecurity security) {
return security.getCurrency();
}
@Override
public Currency visitForwardRateAgreementSecurity(final ForwardRateAgreementSecurity security) {
return security.getCurrency();
}
@Override
public 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 payLeg.getCurrency();
}
}
return null;
}
@Override
public 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 payLeg.getCurrency();
}
}
return null;
}
@Override
public Currency visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityOptionSecurity(final EquityOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityBarrierOptionSecurity(final EquityBarrierOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitFXOptionSecurity(final FXOptionSecurity security) {
throw new UnsupportedOperationException("FX securities do not have a currency");
}
@Override
public Currency visitNonDeliverableFXOptionSecurity(final NonDeliverableFXOptionSecurity security) {
throw new UnsupportedOperationException("FX securities do not have a currency");
}
@Override
public Currency visitSwaptionSecurity(final SwaptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityIndexDividendFutureOptionSecurity(final EquityIndexDividendFutureOptionSecurity equityIndexDividendFutureOptionSecurity) {
return equityIndexDividendFutureOptionSecurity.getCurrency();
}
@Override
public Currency visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity equityIndexFutureOptionSecurity) {
return equityIndexFutureOptionSecurity.getCurrency();
}
@Override
public Currency visitCapFloorSecurity(final CapFloorSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCapFloorCMSSpreadSecurity(final CapFloorCMSSpreadSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityVarianceSwapSecurity(final EquityVarianceSwapSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitSimpleZeroDepositSecurity(final SimpleZeroDepositSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitPeriodicZeroDepositSecurity(final PeriodicZeroDepositSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitAgricultureFutureSecurity(final AgricultureFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitBondFutureSecurity(final BondFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEnergyFutureSecurity(final EnergyFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityFutureSecurity(final EquityFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityIndexDividendFutureSecurity(final EquityIndexDividendFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitFXFutureSecurity(final FXFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitIndexFutureSecurity(final IndexFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitMetalFutureSecurity(final MetalFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitStockFutureSecurity(final StockFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitAgricultureForwardSecurity(final AgricultureForwardSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEnergyForwardSecurity(final EnergyForwardSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitMetalForwardSecurity(final MetalForwardSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCDSSecurity(final CDSSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitStandardVanillaCDSSecurity(final StandardVanillaCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitStandardRecoveryLockCDSSecurity(final StandardRecoveryLockCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitStandardFixedRecoveryCDSSecurity(final StandardFixedRecoveryCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitLegacyVanillaCDSSecurity(final LegacyVanillaCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitLegacyRecoveryLockCDSSecurity(final LegacyRecoveryLockCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitLegacyFixedRecoveryCDSSecurity(final LegacyFixedRecoveryCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitDeliverableSwapFutureSecurity(final DeliverableSwapFutureSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCreditDefaultSwapIndexDefinitionSecurity(final CreditDefaultSwapIndexDefinitionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitCreditDefaultSwapIndexSecurity(final CreditDefaultSwapIndexSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
return security.getCurrency();
}
@Override
public 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 payLeg.getCurrency();
}
}
return null;
}
@Override
public 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 payLeg.getCurrency();
}
}
return null;
}
@Override
public Currency visitInterestRateSwapSecurity(final InterestRateSwapSecurity security) {
final Iterator<InterestRateSwapLeg> iterator = security.getLegs().iterator();
if (iterator.hasNext()) {
final Currency ccy = iterator.next().getNotional().getCurrency();
for (final InterestRateSwapLeg leg = iterator.next(); iterator.hasNext(); iterator.next()) {
if (!leg.getNotional().getCurrency().equals(ccy)) {
return null; // FX swap
}
}
return ccy;
}
return null;
}
@Override
public Currency visitFXVolatilitySwapSecurity(final FXVolatilitySwapSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitEquityTotalReturnSwapSecurity(final EquityTotalReturnSwapSecurity security) {
final Currency notionalCurrency = security.getNotionalCurrency();
final Currency fundingCurrency = security.getFundingLeg().getNotional().getCurrency();
if (notionalCurrency.equals(fundingCurrency)) {
return notionalCurrency;
}
return null;
}
@Override
public Currency visitBondTotalReturnSwapSecurity(final BondTotalReturnSwapSecurity security) {
final Currency notionalCurrency = security.getNotionalCurrency();
final Currency fundingCurrency = security.getFundingLeg().getNotional().getCurrency();
if (notionalCurrency.equals(fundingCurrency)) {
return notionalCurrency;
}
return null;
}
@Override
public Currency visitBillTotalReturnSwapSecurity(final BillTotalReturnSwapSecurity security) {
final Currency notionalCurrency = security.getNotionalCurrency();
final Currency fundingCurrency = security.getFundingLeg().getNotional().getCurrency();
if (notionalCurrency.equals(fundingCurrency)) {
return notionalCurrency;
}
return null;
}
@Override
public Currency visitIndexCDSDefinitionSecurity(final IndexCDSDefinitionSecurity security) {
return security.getCurrency();
}
@Override
public Currency visitStandardCDSSecurity(final StandardCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitLegacyCDSSecurity(final LegacyCDSSecurity security) {
return security.getNotional().getCurrency();
}
@Override
public Currency visitIndexCDSSecurity(final IndexCDSSecurity security) {
return security.getNotional().getCurrency(); // should this be read from the underlying index?
}
}