/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.security.hibernate.swap;
import static com.opengamma.masterdb.security.hibernate.Converters.businessDayConventionBeanToBusinessDayConvention;
import static com.opengamma.masterdb.security.hibernate.Converters.dayCountBeanToDayCount;
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.frequencyBeanToFrequency;
import com.opengamma.financial.convention.frequency.Frequency;
import com.opengamma.financial.security.swap.FixedInflationSwapLeg;
import com.opengamma.financial.security.swap.FixedInterestRateLeg;
import com.opengamma.financial.security.swap.FixedVarianceSwapLeg;
import com.opengamma.financial.security.swap.FloatingGearingIRLeg;
import com.opengamma.financial.security.swap.FloatingInterestRateLeg;
import com.opengamma.financial.security.swap.FloatingSpreadIRLeg;
import com.opengamma.financial.security.swap.FloatingVarianceSwapLeg;
import com.opengamma.financial.security.swap.InflationIndexSwapLeg;
import com.opengamma.financial.security.swap.InterestRateLeg;
import com.opengamma.financial.security.swap.SwapLeg;
import com.opengamma.financial.security.swap.SwapLegVisitor;
import com.opengamma.masterdb.security.hibernate.Converters;
import com.opengamma.masterdb.security.hibernate.HibernateSecurityMasterDao;
/**
* Bean conversion operations.
*/
public final class SwapLegBeanOperation {
private SwapLegBeanOperation() {
}
public static SwapLegBean createBean(final HibernateSecurityMasterDao secMasterSession, final SwapLeg swapLeg) {
Converters.validateBusinessDayConvention(swapLeg.getBusinessDayConvention().getName());
Converters.validateFrequency(swapLeg.getFrequency().getName());
Converters.validateDayCount(swapLeg.getDayCount().getName());
return swapLeg.accept(new SwapLegVisitor<SwapLegBean>() {
private SwapLegBean createSwapLegBean(SwapLeg swapLeg) {
final SwapLegBean bean = new SwapLegBean();
bean.setSwapLegType(SwapLegType.identify(swapLeg));
bean.setBusinessDayConvention(secMasterSession.getOrCreateBusinessDayConventionBean(swapLeg.getBusinessDayConvention().getName()));
bean.setDayCount(secMasterSession.getOrCreateDayCountBean(swapLeg.getDayCount().getName()));
bean.setFrequency(secMasterSession.getOrCreateFrequencyBean(swapLeg.getFrequency().getName()));
bean.setNotional(NotionalBeanOperation.createBean(secMasterSession, swapLeg.getNotional()));
bean.setRegion(externalIdToExternalIdBean(swapLeg.getRegionId()));
bean.setEom(swapLeg.isEom());
return bean;
}
private SwapLegBean createInterestRateLegBean(InterestRateLeg swapLeg) {
return createSwapLegBean(swapLeg);
}
private void setFloatingInterestRateProperties(FloatingInterestRateLeg swapLeg, final SwapLegBean bean) {
if (swapLeg.getInitialFloatingRate() != null) {
bean.setRate(swapLeg.getInitialFloatingRate());
}
bean.setRateIdentifier(externalIdToExternalIdBean(swapLeg.getFloatingReferenceRateId()));
bean.setFloatingRateType(swapLeg.getFloatingRateType());
if (swapLeg.getSettlementDays() != null) {
bean.setSettlementDays(swapLeg.getSettlementDays());
}
if (swapLeg.getOffsetFixing() != null) {
Converters.validateFrequency(swapLeg.getOffsetFixing().getName());
bean.setOffsetFixing(secMasterSession.getOrCreateFrequencyBean(swapLeg.getOffsetFixing().getName()));
}
}
@Override
public SwapLegBean visitFixedInterestRateLeg(FixedInterestRateLeg swapLeg) {
final SwapLegBean bean = createInterestRateLegBean(swapLeg);
bean.setRate(swapLeg.getRate());
return bean;
}
@Override
public SwapLegBean visitFloatingInterestRateLeg(FloatingInterestRateLeg swapLeg) {
final SwapLegBean bean = createInterestRateLegBean(swapLeg);
setFloatingInterestRateProperties(swapLeg, bean);
return bean;
}
@Override
public SwapLegBean visitFloatingSpreadIRLeg(FloatingSpreadIRLeg swapLeg) {
final SwapLegBean bean = createInterestRateLegBean(swapLeg);
setFloatingInterestRateProperties(swapLeg, bean);
bean.setSpread(swapLeg.getSpread());
return bean;
}
@Override
public SwapLegBean visitFloatingGearingIRLeg(FloatingGearingIRLeg swapLeg) {
final SwapLegBean bean = createInterestRateLegBean(swapLeg);
setFloatingInterestRateProperties(swapLeg, bean);
bean.setGearing(swapLeg.getGearing());
return bean;
}
@Override
public SwapLegBean visitFixedVarianceSwapLeg(FixedVarianceSwapLeg swapLeg) {
SwapLegBean bean = createSwapLegBean(swapLeg);
bean.setStrike(swapLeg.getStrike());
bean.setVarianceSwapType(swapLeg.getType());
return bean;
}
@Override
public SwapLegBean visitFloatingVarianceSwapLeg(FloatingVarianceSwapLeg swapLeg) {
SwapLegBean bean = createSwapLegBean(swapLeg);
bean.setUnderlyingId(externalIdToExternalIdBean(swapLeg.getUnderlyingId()));
Frequency monitoringFrequency = swapLeg.getMonitoringFrequency();
if (monitoringFrequency != null) {
Converters.validateFrequency(monitoringFrequency.getName());
bean.setMonitoringFrequency(secMasterSession.getOrCreateFrequencyBean(monitoringFrequency.getName()));
}
bean.setAnnualizationFactor(swapLeg.getAnnualizationFactor());
return bean;
}
@Override
public SwapLegBean visitFixedInflationSwapLeg(FixedInflationSwapLeg swapLeg) {
SwapLegBean bean = createSwapLegBean(swapLeg);
bean.setRate(swapLeg.getRate());
return bean;
}
@Override
public SwapLegBean visitInflationIndexSwapLeg(InflationIndexSwapLeg swapLeg) {
SwapLegBean bean = createSwapLegBean(swapLeg);
bean.setRateIdentifier(externalIdToExternalIdBean(swapLeg.getIndexId()));
bean.setActualIndexationLag(swapLeg.getQuotationIndexationLag());
bean.setConventionalIndexationLag(swapLeg.getConventionalIndexationLag());
bean.setIndexInterpolationMethod(swapLeg.getInterpolationMethod());
return bean;
}
});
}
public static SwapLeg createSwapLeg(final SwapLegBean bean) {
return bean.getSwapLegType().accept(new SwapLegVisitor<SwapLeg>() {
@Override
public SwapLeg visitFixedInterestRateLeg(FixedInterestRateLeg ignore) {
return new FixedInterestRateLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(), bean.getRate());
}
@Override
public SwapLeg visitFloatingInterestRateLeg(FloatingInterestRateLeg ignore) {
FloatingInterestRateLeg floatingInterestRateLeg = new FloatingInterestRateLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
externalIdBeanToExternalId(bean.getRateIdentifier()),
bean.getFloatingRateType());
floatingInterestRateLeg.setInitialFloatingRate(bean.getRate());
floatingInterestRateLeg.setSettlementDays(bean.getSettlementDays());
floatingInterestRateLeg.setOffsetFixing(frequencyBeanToFrequency(bean.getOffsetFixing()));
return floatingInterestRateLeg;
}
@Override
public SwapLeg visitFloatingSpreadIRLeg(FloatingSpreadIRLeg ignore) {
FloatingSpreadIRLeg floatingSpreadIRLeg = new FloatingSpreadIRLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
externalIdBeanToExternalId(bean.getRateIdentifier()),
bean.getFloatingRateType(), bean.getSpread());
floatingSpreadIRLeg.setInitialFloatingRate(bean.getRate());
floatingSpreadIRLeg.setSettlementDays(bean.getSettlementDays());
floatingSpreadIRLeg.setOffsetFixing(frequencyBeanToFrequency(bean.getOffsetFixing()));
return floatingSpreadIRLeg;
}
@Override
public SwapLeg visitFloatingGearingIRLeg(FloatingGearingIRLeg ignore) {
FloatingGearingIRLeg floatingGearingIRLeg = new FloatingGearingIRLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
externalIdBeanToExternalId(bean.getRateIdentifier()),
bean.getFloatingRateType(), bean.getGearing());
floatingGearingIRLeg.setInitialFloatingRate(bean.getRate());
floatingGearingIRLeg.setSettlementDays(bean.getSettlementDays());
floatingGearingIRLeg.setOffsetFixing(frequencyBeanToFrequency(bean.getOffsetFixing()));
return floatingGearingIRLeg;
}
@Override
public SwapLeg visitFixedVarianceSwapLeg(FixedVarianceSwapLeg ignore) {
return new FixedVarianceSwapLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
bean.getStrike(),
bean.getVarianceSwapType());
}
@Override
public SwapLeg visitFloatingVarianceSwapLeg(FloatingVarianceSwapLeg ignore) {
return new FloatingVarianceSwapLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
externalIdBeanToExternalId(bean.getUnderlyingId()),
frequencyBeanToFrequency(bean.getMonitoringFrequency()),
bean.getAnnualizationFactor());
}
@Override
public SwapLeg visitFixedInflationSwapLeg(FixedInflationSwapLeg swapLeg) {
return new FixedInflationSwapLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
bean.getRate());
}
@Override
public SwapLeg visitInflationIndexSwapLeg(InflationIndexSwapLeg swapLeg) {
return new InflationIndexSwapLeg(
dayCountBeanToDayCount(bean.getDayCount()),
frequencyBeanToFrequency(bean.getFrequency()),
externalIdBeanToExternalId(bean.getRegion()),
businessDayConventionBeanToBusinessDayConvention(bean.getBusinessDayConvention()),
NotionalBeanOperation.createNotional(bean.getNotional()),
bean.isEom(),
externalIdBeanToExternalId(bean.getRateIdentifier()),
bean.getActualIndexationLag(),
bean.getConventionalIndexationLag(),
bean.getIndexInterpolationMethod());
}
});
}
}