/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.security.hibernate.index;
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.indexWeightingTypeBeanToIndexWeightingType;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.financial.security.index.EquityIndex;
import com.opengamma.financial.security.index.EquityIndexComponent;
import com.opengamma.financial.security.index.IndexWeightingType;
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.IndexWeightingTypeBean;
import com.opengamma.masterdb.security.hibernate.OperationContext;
/**
* Hibernate bean/security conversion operations.
*/
public final class EquityIndexBeanOperation extends AbstractSecurityBeanOperation<EquityIndex, EquityIndexBean> {
/**
* Singleton instance.
*/
public static final EquityIndexBeanOperation INSTANCE = new EquityIndexBeanOperation();
private EquityIndexBeanOperation() {
super(EquityIndex.INDEX_TYPE, EquityIndex.class, EquityIndexBean.class);
}
@Override
public EquityIndexBean createBean(final OperationContext context, HibernateSecurityMasterDao secMasterSession, EquityIndex index) {
final EquityIndexBean bean = new EquityIndexBean();
bean.setDescription(index.getDescription());
List<EquityIndexComponent> equityComponents = index.getEquityComponents();
List<EquityIndexComponentBean> equityComponentBeans = new ArrayList<>();
long i = 0;
for (EquityIndexComponent equityComponent : equityComponents) {
EquityIndexComponentBean equityComponentBean = new EquityIndexComponentBean();
equityComponentBean.setWeight(equityComponent.getWeight());
Set<ExternalIdBean> idBundle = new HashSet<>();
for (ExternalId id : equityComponent.getEquityIdentifier().getExternalIds()) {
idBundle.add(externalIdToExternalIdBean(id));
}
equityComponentBean.setIdentifiers(idBundle);
equityComponentBean.setPosition(i);
i++;
equityComponentBeans.add(equityComponentBean);
}
bean.setEquityComponents(equityComponentBeans);
IndexWeightingTypeBean indexWeightingTypeBean = secMasterSession.getOrCreateIndexWeightingTypeBean(index.getWeightingType().name());
bean.setWeightingType(indexWeightingTypeBean);
if (index.getIndexFamilyId() != null) {
bean.setIndexFamilyId(externalIdToExternalIdBean(index.getIndexFamilyId()));
}
return bean;
}
@Override
public EquityIndexBean resolve(final OperationContext context,
final HibernateSecurityMasterDao secMasterSession, final Date now,
final EquityIndexBean bean) {
final List<EquityIndexComponentBean> indexComponents = secMasterSession.getEquityIndexComponentBeans(bean);
bean.setEquityComponents(new ArrayList<EquityIndexComponentBean>(indexComponents));
return bean;
}
@Override
public void postPersistBean(final OperationContext context,
final HibernateSecurityMasterDao secMasterSession, final Date now,
final EquityIndexBean bean) {
secMasterSession.persistEquityIndexComponentBeans(bean);
}
@Override
public EquityIndex createSecurity(final OperationContext context, EquityIndexBean bean) {
String description = bean.getDescription();
IndexWeightingType weightingType = indexWeightingTypeBeanToIndexWeightingType(bean.getWeightingType());
List<EquityIndexComponentBean> equityComponents = bean.getEquityComponents();
if (equityComponents == null) {
throw new OpenGammaRuntimeException("null returned by getEquityComponents, which breaks contract.");
}
List<EquityIndexComponent> components = new ArrayList<>();
for (EquityIndexComponentBean component : equityComponents) {
Set<ExternalIdBean> identifiers = component.getIdentifiers();
List<ExternalId> ids = new ArrayList<>();
for (ExternalIdBean idBean : identifiers) {
ExternalId externalId = externalIdBeanToExternalId(idBean);
ids.add(externalId);
}
ExternalIdBundle externalIdBundle = ExternalIdBundle.of(ids);
BigDecimal weight = component.getWeight().stripTrailingZeros();
EquityIndexComponent equityIndexComponent = new EquityIndexComponent(externalIdBundle, weight);
components.add(equityIndexComponent);
}
EquityIndex equityIndex = new EquityIndex("", description, components, weightingType);
if (bean.getIndexFamilyId() != null) {
equityIndex.setIndexFamilyId(externalIdBeanToExternalId(bean.getIndexFamilyId()));
}
return equityIndex;
}
}