/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.masterdb.security.hibernate.future; import static com.opengamma.masterdb.security.hibernate.Converters.currencyBeanToCurrency; import static com.opengamma.masterdb.security.hibernate.Converters.dateTimeWithZoneToZonedDateTimeBean; import static com.opengamma.masterdb.security.hibernate.Converters.expiryBeanToExpiry; import static com.opengamma.masterdb.security.hibernate.Converters.expiryToExpiryBean; import static com.opengamma.masterdb.security.hibernate.Converters.externalIdBeanToExternalId; import static com.opengamma.masterdb.security.hibernate.Converters.externalIdToExternalIdBean; import static com.opengamma.masterdb.security.hibernate.Converters.zonedDateTimeBeanToDateTimeWithZone; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import com.opengamma.financial.security.FinancialSecurityVisitorAdapter; import com.opengamma.financial.security.future.AgricultureFutureSecurity; import com.opengamma.financial.security.future.BondFutureDeliverable; import com.opengamma.financial.security.future.BondFutureSecurity; import com.opengamma.financial.security.future.CommodityFutureSecurity; 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.FutureSecurity; 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.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.masterdb.security.hibernate.AbstractSecurityBeanOperation; import com.opengamma.masterdb.security.hibernate.ExternalIdBean; import com.opengamma.masterdb.security.hibernate.HibernateSecurityMasterDao; import com.opengamma.masterdb.security.hibernate.OperationContext; /** * A Hibernate bean for storage. */ public final class FutureSecurityBeanOperation extends AbstractSecurityBeanOperation<FutureSecurity, FutureSecurityBean> { /** * Singleton. * */ public static final FutureSecurityBeanOperation INSTANCE = new FutureSecurityBeanOperation(); private FutureSecurityBeanOperation() { super(FutureSecurity.SECURITY_TYPE, FutureSecurity.class, FutureSecurityBean.class); } private static BondFutureDeliverable futureBundleBeanToBondFutureDeliverable( final FutureBundleBean futureBundleBean) { final Set<ExternalIdBean> identifierBeans = futureBundleBean .getIdentifiers(); final Set<ExternalId> identifiers = new HashSet<ExternalId>( identifierBeans.size()); for (ExternalIdBean identifierBean : identifierBeans) { identifiers.add(externalIdBeanToExternalId(identifierBean)); } return new BondFutureDeliverable(ExternalIdBundle.of(identifiers), futureBundleBean.getConversionFactor()); } @Override public FutureSecurity createSecurity(final OperationContext context, final FutureSecurityBean bean) { FutureSecurity sec = bean.accept( new FutureSecurityBean.Visitor<FutureSecurity>() { @Override public FutureSecurity visitBondFutureType(BondFutureBean bean) { final Set<FutureBundleBean> basketBeans = bean .getBasket(); final Set<BondFutureDeliverable> basket = new HashSet<BondFutureDeliverable>( basketBeans.size()); for (FutureBundleBean basketBean : basketBeans) { basket.add(futureBundleBeanToBondFutureDeliverable(basketBean)); } return new BondFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), basket, zonedDateTimeBeanToDateTimeWithZone(bean.getFirstDeliveryDate()), zonedDateTimeBeanToDateTimeWithZone(bean.getLastDeliveryDate()), bean.getCategory().getName() ); } @Override public FutureSecurity visitFXFutureType(ForeignExchangeFutureBean bean) { final FXFutureSecurity security = new FXFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean .getTradingExchange().getName(), bean .getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), currencyBeanToCurrency(bean.getNumerator()), currencyBeanToCurrency(bean.getDenominator()), bean.getCategory().getName()); security.setMultiplicationFactor(bean.getUnitNumber()); return security; } @Override public FutureSecurity visitInterestRateFutureType(InterestRateFutureBean bean) { return new InterestRateFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), externalIdBeanToExternalId(bean.getUnderlying()), bean.getCategory().getName()); } @Override public FutureSecurity visitAgricultureFutureType(AgricultureFutureBean bean) { final AgricultureFutureSecurity security = new AgricultureFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), bean.getCategory().getName()); security.setUnitNumber(bean.getUnitNumber()); if (bean.getUnitName() != null) { security.setUnitName(bean.getUnitName().getName()); } return security; } @Override public FutureSecurity visitEnergyFutureType(EnergyFutureBean bean) { final EnergyFutureSecurity security = new EnergyFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), bean.getCategory().getName()); security.setUnitNumber(bean.getUnitNumber()); if (bean.getUnitName() != null) { security.setUnitName(bean.getUnitName().getName()); } security.setUnderlyingId(externalIdBeanToExternalId(bean .getUnderlying())); return security; } @Override public FutureSecurity visitMetalFutureType(MetalFutureBean bean) { final MetalFutureSecurity security = new MetalFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), bean.getCategory().getName()); security.setUnitNumber(bean.getUnitNumber()); if (bean.getUnitName() != null) { security.setUnitName(bean.getUnitName().getName()); } security.setUnderlyingId(externalIdBeanToExternalId(bean .getUnderlying())); return security; } @Override public FutureSecurity visitIndexFutureType(IndexFutureBean bean) { final IndexFutureSecurity security = new IndexFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), bean.getCategory().getName()); security.setUnderlyingId(externalIdBeanToExternalId(bean .getUnderlying())); return security; } @Override public FutureSecurity visitStockFutureType(StockFutureBean bean) { final StockFutureSecurity security = new StockFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), bean.getCategory().getName()); security.setUnderlyingId(externalIdBeanToExternalId(bean .getUnderlying())); return security; } @Override public FutureSecurity visitEquityFutureType(EquityFutureBean bean) { final EquityFutureSecurity security = new EquityFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), expiryBeanToExpiry(bean.getExpiry()).getExpiry(), // TODO: this is a temporary hack as settlementDate isn't being stored in database externalIdBeanToExternalId(bean.getUnderlying()), bean.getCategory().getName()); return security; } @Override public FutureSecurity visitEquityIndexDividendFutureType(EquityIndexDividendFutureBean bean) { final EquityIndexDividendFutureSecurity security = new EquityIndexDividendFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), expiryBeanToExpiry(bean.getExpiry()).getExpiry(), // TODO: this is a temporary hack as settlementDate isn't being stored in database externalIdBeanToExternalId(bean.getUnderlying()), bean.getCategory().getName()); return security; } @Override public FutureSecurity visitFederalFundsFutureType(FederalFundsFutureBean bean) { final FederalFundsFutureSecurity security = new FederalFundsFutureSecurity( expiryBeanToExpiry(bean.getExpiry()), bean.getTradingExchange().getName(), bean.getSettlementExchange().getName(), currencyBeanToCurrency(bean.getCurrency()), bean.getUnitAmount(), externalIdBeanToExternalId(bean.getUnderlying()), bean.getCategory().getName()); return security; } }); return sec; } @Override public FutureSecurityBean resolve(final OperationContext context, final HibernateSecurityMasterDao secMasterSession, final Date now, final FutureSecurityBean bean) { return bean.accept( new FutureSecurityBean.Visitor<FutureSecurityBean>() { @Override public FutureSecurityBean visitAgricultureFutureType(AgricultureFutureBean bean) { return bean; } @Override public FutureSecurityBean visitBondFutureType(BondFutureBean bean) { final List<FutureBundleBean> basket = secMasterSession.getFutureBundleBeans(now, bean); bean.setBasket(new HashSet<FutureBundleBean>(basket)); return bean; } @Override public FutureSecurityBean visitEnergyFutureType(EnergyFutureBean bean) { return bean; } @Override public FutureSecurityBean visitFXFutureType(ForeignExchangeFutureBean bean) { return bean; } @Override public FutureSecurityBean visitIndexFutureType(IndexFutureBean bean) { return bean; } @Override public FutureSecurityBean visitInterestRateFutureType(InterestRateFutureBean bean) { return bean; } @Override public FutureSecurityBean visitMetalFutureType(MetalFutureBean bean) { return bean; } @Override public FutureSecurityBean visitStockFutureType(StockFutureBean bean) { return bean; } @Override public FutureSecurityBean visitEquityFutureType(EquityFutureBean bean) { return bean; } @Override public FutureSecurityBean visitEquityIndexDividendFutureType(EquityIndexDividendFutureBean bean) { return bean; } @Override public FutureSecurityBean visitFederalFundsFutureType(FederalFundsFutureBean bean) { return bean; } }); } @Override public void postPersistBean(final OperationContext context, final HibernateSecurityMasterDao secMasterSession, final Date now, final FutureSecurityBean bean) { bean.accept(new FutureSecurityBean.Visitor<Object>() { private void postPersistFuture() { // No action } private void postPersistCommodityFuture() { postPersistFuture(); } @Override public Object visitAgricultureFutureType(AgricultureFutureBean bean) { postPersistCommodityFuture(); return null; } @Override public Object visitBondFutureType(BondFutureBean bean) { postPersistFuture(); secMasterSession.persistFutureBundleBeans(now, bean); return null; } @Override public Object visitEnergyFutureType(EnergyFutureBean bean) { postPersistCommodityFuture(); return null; } @Override public Object visitEquityFutureType(EquityFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitEquityIndexDividendFutureType(EquityIndexDividendFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitFXFutureType(ForeignExchangeFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitIndexFutureType(IndexFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitInterestRateFutureType(InterestRateFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitMetalFutureType(MetalFutureBean bean) { postPersistCommodityFuture(); return null; } @Override public Object visitStockFutureType(StockFutureBean bean) { postPersistFuture(); return null; } @Override public Object visitFederalFundsFutureType(FederalFundsFutureBean bean) { postPersistFuture(); return null; } }); } @Override public FutureSecurityBean createBean(final OperationContext context, final HibernateSecurityMasterDao secMasterSession, final FutureSecurity security) { return security.accept(new FinancialSecurityVisitorAdapter<FutureSecurityBean>() { private <F extends FutureSecurityBean> F createFutureBean(final F bean, final FutureSecurity security) { bean.setExpiry(expiryToExpiryBean(security.getExpiry())); bean.setTradingExchange(secMasterSession .getOrCreateExchangeBean(security.getTradingExchange(), null)); bean.setSettlementExchange(secMasterSession .getOrCreateExchangeBean( security.getSettlementExchange(), null)); bean.setCurrency(secMasterSession .getOrCreateCurrencyBean(security.getCurrency() .getCode())); bean.setUnitAmount(security.getUnitAmount()); bean.setCategory(secMasterSession.getOrCreateContractCategoryBean(security.getContractCategory())); return bean; } private <F extends CommodityFutureBean> F createCommodityFutureBean( final F futureSecurityBean, final CommodityFutureSecurity security) { final F bean = createFutureBean(futureSecurityBean, security); if (security.getUnitName() != null) { bean.setUnitName(secMasterSession .getOrCreateUnitNameBean(security.getUnitName())); } if (security.getUnitNumber() != null) { bean.setUnitNumber(security.getUnitNumber()); } return bean; } @Override public AgricultureFutureBean visitAgricultureFutureSecurity( AgricultureFutureSecurity security) { return createCommodityFutureBean(new AgricultureFutureBean(), security); } @Override public BondFutureBean visitBondFutureSecurity( BondFutureSecurity security) { final BondFutureBean bean = createFutureBean(new BondFutureBean(), security); bean.setFirstDeliveryDate(dateTimeWithZoneToZonedDateTimeBean(security .getFirstDeliveryDate())); bean.setLastDeliveryDate(dateTimeWithZoneToZonedDateTimeBean(security .getLastDeliveryDate())); final Collection<BondFutureDeliverable> basket = security .getBasket(); final Set<FutureBundleBean> basketBeans = new HashSet<FutureBundleBean>( basket.size()); for (BondFutureDeliverable deliverable : basket) { final FutureBundleBean deliverableBean = new FutureBundleBean(); deliverableBean.setFuture(bean); deliverableBean.setConversionFactor(deliverable .getConversionFactor()); final Set<ExternalId> identifiers = deliverable .getIdentifiers().getExternalIds(); final Set<ExternalIdBean> identifierBeans = new HashSet<ExternalIdBean>(); for (ExternalId identifier : identifiers) { identifierBeans .add(externalIdToExternalIdBean(identifier)); } deliverableBean.setIdentifiers(identifierBeans); basketBeans.add(deliverableBean); } bean.setBasket(basketBeans); return bean; } @Override public EnergyFutureBean visitEnergyFutureSecurity( EnergyFutureSecurity security) { final EnergyFutureBean bean = createCommodityFutureBean(new EnergyFutureBean(), security); ExternalId underlying = security.getUnderlyingId(); if (underlying != null) { bean.setUnderlying(externalIdToExternalIdBean(underlying)); } return bean; } @Override public ForeignExchangeFutureBean visitFXFutureSecurity( FXFutureSecurity security) { final ForeignExchangeFutureBean bean = createFutureBean(new ForeignExchangeFutureBean(), security); bean.setNumerator(secMasterSession .getOrCreateCurrencyBean(security.getNumerator() .getCode())); bean.setDenominator(secMasterSession .getOrCreateCurrencyBean(security.getDenominator() .getCode())); bean.setUnitNumber(security.getMultiplicationFactor()); return bean; } @Override public InterestRateFutureBean visitInterestRateFutureSecurity( InterestRateFutureSecurity security) { final InterestRateFutureBean bean = createFutureBean(new InterestRateFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security.getUnderlyingId())); return bean; } @Override public MetalFutureBean visitMetalFutureSecurity( MetalFutureSecurity security) { final MetalFutureBean bean = createCommodityFutureBean(new MetalFutureBean(), security); ExternalId underlying = security.getUnderlyingId(); if (underlying != null) { bean.setUnderlying(externalIdToExternalIdBean(security.getUnderlyingId())); } return bean; } @Override public IndexFutureBean visitIndexFutureSecurity( IndexFutureSecurity security) { final IndexFutureBean bean = createFutureBean(new IndexFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security .getUnderlyingId())); return bean; } @Override public StockFutureBean visitStockFutureSecurity( StockFutureSecurity security) { final StockFutureBean bean = createFutureBean(new StockFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security .getUnderlyingId())); return bean; } @Override public EquityFutureBean visitEquityFutureSecurity( EquityFutureSecurity security) { // TODO Case: Confirm this add is correct final EquityFutureBean bean = createFutureBean(new EquityFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security .getUnderlyingId())); return bean; } @Override public EquityIndexDividendFutureBean visitEquityIndexDividendFutureSecurity( EquityIndexDividendFutureSecurity security) { // TODO Case: Confirm this add is correct final EquityIndexDividendFutureBean bean = createFutureBean(new EquityIndexDividendFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security .getUnderlyingId())); return bean; } @Override public FutureSecurityBean visitFederalFundsFutureSecurity(FederalFundsFutureSecurity security) { final FederalFundsFutureBean bean = createFutureBean(new FederalFundsFutureBean(), security); bean.setUnderlying(externalIdToExternalIdBean(security .getUnderlyingId())); return bean; } }); } }