/** * 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.Collection; 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.CurrenciesVisitor; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.financial.security.FinancialSecurityVisitorSameMethodAdapter; import com.opengamma.financial.security.future.FXFutureSecurity; import com.opengamma.financial.security.option.FxFutureOptionSecurity; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Exposure function that allows the curve lookup by security type and currency of a given trade. */ public class SecurityAndCurrencyExposureFunction implements ExposureFunction { /** * The name of the exposure function. */ public static final String NAME = "Security / Currency"; private final SecurityAndCurrencyVisitor _visitor; /** * Constructor that uses a security source to look up the underlying contract for the security type and currency, if * necessary. * @param securitySource the security source containing the security definitions. */ public SecurityAndCurrencyExposureFunction(final SecuritySource securitySource) { _visitor = new SecurityAndCurrencyVisitor(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 DefaultSecurityAndCurrencyVisitor implements FinancialSecurityVisitorSameMethodAdapter.Visitor<List<ExternalId>> { private final SecuritySource _securitySource; public DefaultSecurityAndCurrencyVisitor(SecuritySource securitySource) { _securitySource = ArgumentChecker.notNull(securitySource, "securitySource"); } @Override public List<ExternalId> visit(FinancialSecurity security) { final Collection<Currency> currencies = CurrenciesVisitor.getCurrencies(security, _securitySource); if (currencies == null || currencies.isEmpty()) { return null; } final List<ExternalId> result = new ArrayList<>(); final String securityType = security.getSecurityType(); for (final Currency currency : currencies) { result.add(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + currency.getCode())); } return result; } } private static final class SecurityAndCurrencyVisitor extends FinancialSecurityVisitorSameMethodAdapter<List<ExternalId>> { private final SecuritySource _securitySource; public SecurityAndCurrencyVisitor(SecuritySource securitySource) { super(new DefaultSecurityAndCurrencyVisitor(ArgumentChecker.notNull(securitySource, "securitySource"))); _securitySource = securitySource; } @Override public List<ExternalId> visitFXFutureSecurity(final FXFutureSecurity security) { final String securityType = security.getSecurityType(); return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + security.getDenominator().getCode()), ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + security.getNumerator().getCode())); } @Override public List<ExternalId> visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) { final FXFutureSecurity fxFuture = (FXFutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); final String securityType = security.getSecurityType(); return Arrays.asList(ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + fxFuture.getDenominator().getCode()), ExternalId.of(SECURITY_IDENTIFIER, securityType + SEPARATOR + fxFuture.getNumerator().getCode())); } } }