/**
* 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.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.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 regions for a given trade.
*/
public class RegionExposureFunction implements ExposureFunction {
/**
* The name of the exposure function.
*/
public static final String NAME = "Region";
private final RegionVisitor _visitor;
public RegionExposureFunction(final SecuritySource securitySource) {
ArgumentChecker.notNull(securitySource, "securitySource");
_visitor = new RegionVisitor(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 final class RegionVisitor extends FinancialSecurityVisitorSameValueAdapter<List<ExternalId>> {
private final SecuritySource _securitySource;
public RegionVisitor(SecuritySource securitySource) {
super(null);
_securitySource = ArgumentChecker.notNull(securitySource, "securitySource");
}
@Override
public List<ExternalId> visitCashSecurity(final CashSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
return Arrays.asList(security.getRegion());
}
@Override
public List<ExternalId> visitFRASecurity(final FRASecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitForwardSwapSecurity(final ForwardSwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(payLeg.getRegionId());
}
return Arrays.asList(payLeg.getRegionId(), receiveLeg.getRegionId());
}
@Override
public List<ExternalId> visitSwapSecurity(final SwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(payLeg.getRegionId());
}
return Arrays.asList(payLeg.getRegionId(), receiveLeg.getRegionId());
}
@Override
public List<ExternalId> visitSwaptionSecurity(final SwaptionSecurity security) {
final SwapSecurity underlyingSwap = (SwapSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); //TODO version
final SwapLeg payLeg = underlyingSwap.getPayLeg();
final SwapLeg receiveLeg = underlyingSwap.getReceiveLeg();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(payLeg.getRegionId());
}
return Arrays.asList(payLeg.getRegionId(), receiveLeg.getRegionId());
}
@Override
public List<ExternalId> visitStandardVanillaCDSSecurity(final StandardVanillaCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitStandardFixedRecoveryCDSSecurity(final StandardFixedRecoveryCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitStandardRecoveryLockCDSSecurity(final StandardRecoveryLockCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitLegacyVanillaCDSSecurity(final LegacyVanillaCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitLegacyFixedRecoveryCDSSecurity(final LegacyFixedRecoveryCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitLegacyRecoveryLockCDSSecurity(final LegacyRecoveryLockCDSSecurity security) {
return Arrays.asList(security.getRegionId());
}
@Override
public List<ExternalId> visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
final CreditDefaultSwapSecurity underlyingCDS = (CreditDefaultSwapSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); //TODO version
return Arrays.asList(underlyingCDS.getRegionId());
}
@Override
public List<ExternalId> visitZeroCouponInflationSwapSecurity(final ZeroCouponInflationSwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(payLeg.getRegionId());
}
return Arrays.asList(payLeg.getRegionId(), receiveLeg.getRegionId());
}
@Override
public List<ExternalId> visitYearOnYearInflationSwapSecurity(final YearOnYearInflationSwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
return Arrays.asList(payLeg.getRegionId());
}
return Arrays.asList(payLeg.getRegionId(), receiveLeg.getRegionId());
}
}
}