/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.security.hibernate.forward;
import static com.opengamma.masterdb.security.hibernate.Converters.currencyBeanToCurrency;
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 java.util.Date;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.forward.AgricultureForwardSecurity;
import com.opengamma.financial.security.forward.CommodityForwardSecurity;
import com.opengamma.financial.security.forward.EnergyForwardSecurity;
import com.opengamma.financial.security.forward.MetalForwardSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.masterdb.security.hibernate.AbstractSecurityBeanOperation;
import com.opengamma.masterdb.security.hibernate.HibernateSecurityMasterDao;
import com.opengamma.masterdb.security.hibernate.OperationContext;
/**
* Hibernate bean for storage.
*/
public final class CommodityForwardSecurityBeanOperation extends
AbstractSecurityBeanOperation<CommodityForwardSecurity, CommodityForwardSecurityBean> {
/**
* Singleton.
* */
public static final CommodityForwardSecurityBeanOperation INSTANCE = new CommodityForwardSecurityBeanOperation();
private CommodityForwardSecurityBeanOperation() {
super(CommodityForwardSecurity.SECURITY_TYPE, CommodityForwardSecurity.class, CommodityForwardSecurityBean.class);
}
@Override
public CommodityForwardSecurity createSecurity(final OperationContext context,
final CommodityForwardSecurityBean bean) {
CommodityForwardSecurity sec = bean.accept(
new CommodityForwardSecurityBean.Visitor<CommodityForwardSecurity>() {
@Override
public CommodityForwardSecurity visitAgricultureForwardType(AgricultureForwardSecurityBean bean) {
final AgricultureForwardSecurity security = new AgricultureForwardSecurity(
bean.getUnitName().getName(),
bean.getUnitNumber(),
expiryBeanToExpiry(bean.getExpiry()),
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 CommodityForwardSecurity visitEnergyForwardType(EnergyForwardSecurityBean bean) {
final EnergyForwardSecurity security = new EnergyForwardSecurity(
bean.getUnitName().getName(),
bean.getUnitNumber(),
expiryBeanToExpiry(bean.getExpiry()),
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 CommodityForwardSecurity visitMetalForwardType(MetalForwardSecurityBean bean) {
final MetalForwardSecurity security = new MetalForwardSecurity(
bean.getUnitName().getName(),
bean.getUnitNumber(),
expiryBeanToExpiry(bean.getExpiry()),
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;
}
});
return sec;
}
@Override
public CommodityForwardSecurityBean resolve(final OperationContext context,
final HibernateSecurityMasterDao secMasterSession, final Date now,
final CommodityForwardSecurityBean bean) {
return bean.accept(
new CommodityForwardSecurityBean.Visitor<CommodityForwardSecurityBean>() {
@Override
public CommodityForwardSecurityBean visitAgricultureForwardType(AgricultureForwardSecurityBean bean) {
return bean;
}
@Override
public CommodityForwardSecurityBean visitEnergyForwardType(EnergyForwardSecurityBean bean) {
return bean;
}
@Override
public CommodityForwardSecurityBean visitMetalForwardType(MetalForwardSecurityBean bean) {
return bean;
}
});
}
@Override
public void postPersistBean(final OperationContext context,
final HibernateSecurityMasterDao secMasterSession, final Date now,
final CommodityForwardSecurityBean bean) {
bean.accept(new CommodityForwardSecurityBean.Visitor<Object>() {
private void postPersistForward() {
// No action
}
private void postPersistCommodityForward() {
postPersistForward();
}
@Override
public Object visitAgricultureForwardType(AgricultureForwardSecurityBean bean) {
postPersistCommodityForward();
return null;
}
@Override
public Object visitEnergyForwardType(EnergyForwardSecurityBean bean) {
postPersistCommodityForward();
return null;
}
@Override
public Object visitMetalForwardType(MetalForwardSecurityBean bean) {
postPersistCommodityForward();
return null;
}
});
}
@Override
public CommodityForwardSecurityBean createBean(final OperationContext context,
final HibernateSecurityMasterDao secMasterSession,
final CommodityForwardSecurity security) {
return security.accept(new FinancialSecurityVisitorAdapter<CommodityForwardSecurityBean>() {
private <F extends CommodityForwardSecurityBean> F createForwardBean(final F bean, final CommodityForwardSecurity security) {
bean.setExpiry(expiryToExpiryBean(security.getExpiry()));
bean.setCurrency(secMasterSession
.getOrCreateCurrencyBean(security.getCurrency()
.getCode()));
bean.setUnitAmount(security.getUnitAmount());
bean.setCategory(secMasterSession.getOrCreateContractCategoryBean(security.getContractCategory()));
return bean;
}
private <F extends CommodityForwardSecurityBean> F createCommodityForwardSecurityBean(
final F commodityForwardSecurityBean, final CommodityForwardSecurity security) {
final F bean = createForwardBean(commodityForwardSecurityBean, security);
if (security.getUnitName() != null) {
bean.setUnitName(secMasterSession
.getOrCreateUnitNameBean(security.getUnitName()));
}
if (security.getUnitNumber() != null) {
bean.setUnitNumber(security.getUnitNumber());
}
return bean;
}
@Override
public AgricultureForwardSecurityBean visitAgricultureForwardSecurity(
AgricultureForwardSecurity security) {
return createCommodityForwardSecurityBean(new AgricultureForwardSecurityBean(), security);
}
@Override
public EnergyForwardSecurityBean visitEnergyForwardSecurity(
EnergyForwardSecurity security) {
final EnergyForwardSecurityBean bean = createCommodityForwardSecurityBean(new EnergyForwardSecurityBean(), security);
ExternalId underlying = security.getUnderlyingId();
if (underlying != null) {
bean.setUnderlying(externalIdToExternalIdBean(underlying));
}
return bean;
}
@Override
public MetalForwardSecurityBean visitMetalForwardSecurity(
MetalForwardSecurity security) {
final MetalForwardSecurityBean bean = createCommodityForwardSecurityBean(new MetalForwardSecurityBean(), security);
ExternalId underlying = security.getUnderlyingId();
if (underlying != null) {
bean.setUnderlying(externalIdToExternalIdBean(security.getUnderlyingId()));
}
return bean;
}
});
}
}