Package com.opengamma.masterdb.security.hibernate.future

Source Code of com.opengamma.masterdb.security.hibernate.future.FutureSecurityBeanOperation

/**
* 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;
      }
    });
  }

}
TOP

Related Classes of com.opengamma.masterdb.security.hibernate.future.FutureSecurityBeanOperation

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.