/**
* 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.ArrayList;
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.bond.BillSecurity;
import com.opengamma.financial.security.bond.CorporateBondSecurity;
import com.opengamma.financial.security.bond.FloatingRateNoteSecurity;
import com.opengamma.financial.security.bond.GovernmentBondSecurity;
import com.opengamma.financial.security.bond.InflationBondSecurity;
import com.opengamma.financial.security.cash.CashSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapSecurity;
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.deposit.ContinuousZeroDepositSecurity;
import com.opengamma.financial.security.equity.EquityVarianceSwapSecurity;
import com.opengamma.financial.security.fra.FRASecurity;
import com.opengamma.financial.security.option.CreditDefaultSwapOptionSecurity;
import com.opengamma.financial.security.option.SwaptionSecurity;
import com.opengamma.financial.security.swap.ForwardSwapSecurity;
import com.opengamma.financial.security.swap.SwapLeg;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.financial.security.swap.YearOnYearInflationSwapSecurity;
import com.opengamma.financial.security.swap.ZeroCouponInflationSwapSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ArgumentChecker;
/**
* Exposure function that returns the security type and region for a given trade.
*/
public class SecurityAndRegionExposureFunction implements ExposureFunction {
/**
* The name of the exposure function.
*/
public static final String NAME = "Security / Region";
private final SecurityAndRegionVisitor _visitor;
public SecurityAndRegionExposureFunction(final SecuritySource securitySource) {
_visitor = new SecurityAndRegionVisitor(ArgumentChecker.notNull(securitySource, "security source"));
}
@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 final class SecurityAndRegionVisitor extends FinancialSecurityVisitorSameValueAdapter<List<ExternalId>> {
private final SecuritySource _securitySource;
public SecurityAndRegionVisitor(SecuritySource securitySource) {
super(null);
_securitySource = ArgumentChecker.notNull(securitySource, "securitySource");
}
@Override
public List<ExternalId> visitCashSecurity(final CashSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
final ExternalId regionId = security.getRegion();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitCorporateBondSecurity(final CorporateBondSecurity security) {
final String region = security.getIssuerDomicile();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + region));
}
@Override
public List<ExternalId> visitEquityVarianceSwapSecurity(final EquityVarianceSwapSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitFRASecurity(final FRASecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitForwardSwapSecurity(final ForwardSwapSecurity security) {
final List<ExternalId> result = new ArrayList<>();
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
final String securityType = security.getSecurityType();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
}
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + receiveLeg.getRegionId().getValue()));
return result;
}
@Override
public List<ExternalId> visitBillSecurity(final BillSecurity security) {
final String region = security.getRegionId().getValue();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + region));
}
@Override
public List<ExternalId> visitGovernmentBondSecurity(final GovernmentBondSecurity security) {
final String region = security.getIssuerDomicile();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + region));
}
@Override
public List<ExternalId> visitInflationBondSecurity(final InflationBondSecurity security) {
final String region = security.getIssuerDomicile();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + region));
}
@Override
public List<ExternalId> visitSwapSecurity(final SwapSecurity security) {
final List<ExternalId> result = new ArrayList<>();
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
final String securityType = security.getSecurityType();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
}
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + receiveLeg.getRegionId().getValue()));
return result;
}
@Override
public List<ExternalId> visitSwaptionSecurity(final SwaptionSecurity security) {
final List<ExternalId> result = new ArrayList<>();
final SwapSecurity underlyingSwap = (SwapSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); //TODO version
final SwapLeg payLeg = underlyingSwap.getPayLeg();
final SwapLeg receiveLeg = underlyingSwap.getReceiveLeg();
final String securityType = security.getSecurityType();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
}
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + receiveLeg.getRegionId().getValue()));
return result;
}
@Override
public List<ExternalId> visitStandardVanillaCDSSecurity(final StandardVanillaCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitStandardFixedRecoveryCDSSecurity(final StandardFixedRecoveryCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitStandardRecoveryLockCDSSecurity(final StandardRecoveryLockCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitLegacyVanillaCDSSecurity(final LegacyVanillaCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitLegacyFixedRecoveryCDSSecurity(final LegacyFixedRecoveryCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitLegacyRecoveryLockCDSSecurity(final LegacyRecoveryLockCDSSecurity security) {
final ExternalId regionId = security.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
final CreditDefaultSwapSecurity underlyingCDS = (CreditDefaultSwapSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); //TODO version
final ExternalId regionId = underlyingCDS.getRegionId();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + regionId.getValue()));
}
@Override
public List<ExternalId> visitZeroCouponInflationSwapSecurity(final ZeroCouponInflationSwapSecurity security) {
final List<ExternalId> result = new ArrayList<>();
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
final String securityType = security.getSecurityType();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
}
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + receiveLeg.getRegionId().getValue()));
return result;
}
@Override
public List<ExternalId> visitYearOnYearInflationSwapSecurity(final YearOnYearInflationSwapSecurity security) {
final List<ExternalId> result = new ArrayList<>();
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
final String securityType = security.getSecurityType();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
}
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + payLeg.getRegionId().getValue()));
result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + receiveLeg.getRegionId().getValue()));
return result;
}
@Override
public List<ExternalId> visitFloatingRateNoteSecurity(final FloatingRateNoteSecurity security) {
final String region = security.getRegionId().getValue();
final String securityType = security.getSecurityType();
return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + region));
}
}
}