/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.security; import com.opengamma.core.security.Security; import com.opengamma.financial.security.option.BondFutureOptionSecurity; import com.opengamma.financial.security.option.CommodityFutureOptionSecurity; 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.IRFutureOptionSecurity; import com.opengamma.financial.security.option.OptionType; import com.opengamma.util.time.Expiry; /** * Utility class containing a number of visitors that get fields typical of option securities. */ public class OptionSecurityVisitors { /** Strike visitor */ private static FinancialSecurityVisitorAdapter<Double> s_strikeVisitor = new StrikeVisitor(); /** Expiry visitor */ private static FinancialSecurityVisitorAdapter<Expiry> s_expiryVisitor = new ExpiryVisitor(); /** Exchange visitor */ private static FinancialSecurityVisitorAdapter<String> s_exchangeVisitor = new ExchangeVisitor(); /** Option type visitor */ private static FinancialSecurityVisitorAdapter<OptionType> s_optionTypeVisitor = new OptionTypeVisitor(); /** * Gets a visitor that provides the strike of options. * @return Instance of {@link FinancialSecurityVisitorAdapter} that provides the strike of option securities */ public static FinancialSecurityVisitorAdapter<Double> getStrikeVisitor() { return s_strikeVisitor; } /** * Gets the strike of a security, if applicable. * @param security The security * @return The strike * @throws UnsupportedOperationException if the security is null or is not one of the types handled. */ public static Double getStrike(final Security security) { if (security instanceof FinancialSecurity) { return ((FinancialSecurity) security).accept(s_strikeVisitor); } throw new UnsupportedOperationException("Cannot get strike for security " + security); } /** * Gets a visitor that provides the expiry of an option. * @return Instance of {@link FinancialSecurityVisitorAdapter} that provides the expiry of option securities */ public static FinancialSecurityVisitorAdapter<Expiry> getExpiryVisitor() { return s_expiryVisitor; } /** * Gets the expiry of a security, if applicable. * @param security The security * @return The expiry * @throws UnsupportedOperationException if the security is null or is not one of the types handled. */ public static Expiry getExpiry(final Security security) { if (security instanceof FinancialSecurity) { return ((FinancialSecurity) security).accept(s_expiryVisitor); } throw new UnsupportedOperationException("Cannot get expiry for security " + security); } /** * Gets a visitor that provides the exchange code for an option. * @return Instance of {@link FinancialSecurityVisitorAdapter} that provides exchange code of option securities */ public static FinancialSecurityVisitorAdapter<String> getExchangeVisitor() { return s_exchangeVisitor; } /** * Gets the exchange of a security, if applicable. If both settlement and trading exchanges are available, * returns the settlement exchange. * @param security The security * @return The strike * @throws UnsupportedOperationException if the security is null or is not one of the types handled. */ public static String getExchange(final Security security) { if (security instanceof FinancialSecurity) { return ((FinancialSecurity) security).accept(s_exchangeVisitor); } throw new UnsupportedOperationException("Cannot get exchange for security " + security); } /** * Gets a visitor that provides the option type. * @return Instance of FinancialSecurityVisitorAdapter that provides {@link OptionType} of option securities */ public static FinancialSecurityVisitorAdapter<OptionType> getOptionTypeVisitor() { return s_optionTypeVisitor; } /** * Gets the option type of a security, if applicable. * @param security The security * @return The option type * @throws UnsupportedOperationException if the security is null or is not one of the types handled. */ public static OptionType getOptionType(final Security security) { if (security instanceof FinancialSecurity) { return ((FinancialSecurity) security).accept(s_optionTypeVisitor); } throw new UnsupportedOperationException("Cannot get option type for security " + security); } /** * Gets the strike for a security. */ public static class StrikeVisitor extends FinancialSecurityVisitorAdapter<Double> { @Override public Double visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) { return Double.valueOf(security.getStrike()); } @Override public Double visitEquityOptionSecurity(final EquityOptionSecurity security) { return Double.valueOf(security.getStrike()); } @Override public Double visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) { return Double.valueOf(security.getStrike()); } @Override public Double visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) { return Double.valueOf(security.getStrike()); } @Override public Double visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) { return Double.valueOf(security.getStrike()); } @Override public Double visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) { return Double.valueOf(security.getStrike()); } } /** * Get the expiry for a security. */ public static class ExpiryVisitor extends FinancialSecurityVisitorAdapter<Expiry> { @Override public Expiry visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) { return security.getExpiry(); } @Override public Expiry visitEquityOptionSecurity(final EquityOptionSecurity security) { return security.getExpiry(); } @Override public Expiry visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) { return security.getExpiry(); } @Override public Expiry visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) { return security.getExpiry(); } @Override public Expiry visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) { return security.getExpiry(); } @Override public Expiry visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) { return security.getExpiry(); } } /** * Get Exchange for security. <p> * Note: This defaults to Settlement Exchange when both Settlement and Trading Exchanges are available for the SecurityType. */ public static class ExchangeVisitor extends FinancialSecurityVisitorAdapter<String> { @Override public String visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) { return security.getExchange(); } @Override public String visitEquityOptionSecurity(final EquityOptionSecurity security) { return security.getExchange(); } @Override public String visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) { return security.getExchange(); } @Override public String visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) { return security.getSettlementExchange(); } @Override public String visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) { return security.getSettlementExchange(); } @Override public String visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) { return security.getExchange(); } } /** * Get {@link OptionType}, CALL or PUT, for security. */ public static class OptionTypeVisitor extends FinancialSecurityVisitorAdapter<OptionType> { @Override public OptionType visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) { return security.getOptionType(); } @Override public OptionType visitEquityOptionSecurity(final EquityOptionSecurity security) { return security.getOptionType(); } @Override public OptionType visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity security) { return security.getOptionType(); } @Override public OptionType visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) { return security.getOptionType(); } @Override public OptionType visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) { return security.getOptionType(); } @Override public OptionType visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) { return security.getOptionType(); } } }