/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.curve;
import java.util.Map;
import org.threeten.bp.LocalDate;
import com.opengamma.financial.analytics.ircurve.CurveInstrumentProvider;
import com.opengamma.financial.analytics.ircurve.StaticCurvePointsInstrumentProvider;
import com.opengamma.financial.analytics.ircurve.strips.BillNode;
import com.opengamma.financial.analytics.ircurve.strips.BondNode;
import com.opengamma.financial.analytics.ircurve.strips.CalendarSwapNode;
import com.opengamma.financial.analytics.ircurve.strips.CashNode;
import com.opengamma.financial.analytics.ircurve.strips.ContinuouslyCompoundedRateNode;
import com.opengamma.financial.analytics.ircurve.strips.CreditSpreadNode;
import com.opengamma.financial.analytics.ircurve.strips.CurveNode;
import com.opengamma.financial.analytics.ircurve.strips.CurveNodeVisitor;
import com.opengamma.financial.analytics.ircurve.strips.CurveNodeWithIdentifier;
import com.opengamma.financial.analytics.ircurve.strips.DataFieldType;
import com.opengamma.financial.analytics.ircurve.strips.DeliverableSwapFutureNode;
import com.opengamma.financial.analytics.ircurve.strips.DiscountFactorNode;
import com.opengamma.financial.analytics.ircurve.strips.FRANode;
import com.opengamma.financial.analytics.ircurve.strips.FXForwardNode;
import com.opengamma.financial.analytics.ircurve.strips.FXSwapNode;
import com.opengamma.financial.analytics.ircurve.strips.PeriodicallyCompoundedRateNode;
import com.opengamma.financial.analytics.ircurve.strips.PointsCurveNodeWithIdentifier;
import com.opengamma.financial.analytics.ircurve.strips.RateFutureNode;
import com.opengamma.financial.analytics.ircurve.strips.RollDateFRANode;
import com.opengamma.financial.analytics.ircurve.strips.RollDateSwapNode;
import com.opengamma.financial.analytics.ircurve.strips.SwapNode;
import com.opengamma.financial.analytics.ircurve.strips.ThreeLegBasisSwapNode;
import com.opengamma.financial.analytics.ircurve.strips.ZeroCouponInflationNode;
import com.opengamma.id.ExternalId;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.time.Tenor;
/**
* Class that constructs a {@link CurveNodeWithIdentifier} given a curve node and node id mapper.
*/
//TODO make every node type work like FXForwardNode
public class CurveNodeWithIdentifierBuilder implements CurveNodeVisitor<CurveNodeWithIdentifier> {
/** The curve construction date */
private final LocalDate _curveDate;
/** The curve node id mapper */
private final CurveNodeIdMapper _nodeIdMapper;
/**
* @param curveDate The curve construction date, not null
* @param nodeIdMapper The curve node id mapper, not null
*/
public CurveNodeWithIdentifierBuilder(final LocalDate curveDate, final CurveNodeIdMapper nodeIdMapper) {
ArgumentChecker.notNull(curveDate, "curve date");
ArgumentChecker.notNull(nodeIdMapper, "node id mapper");
_curveDate = curveDate;
_nodeIdMapper = nodeIdMapper;
}
/**
* Gets the curve date.
* @return The curve date
*/
public LocalDate getCurveDate() {
return _curveDate;
}
/**
* Gets the curve node id mapper.
* @return The curve node id mapper
*/
public CurveNodeIdMapper getCurveNodeIdMapper() {
return _nodeIdMapper;
}
@Override
public CurveNodeWithIdentifier visitBillNode(final BillNode node) {
final Tenor tenor = node.getMaturityTenor();
final ExternalId identifier = _nodeIdMapper.getBillNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getBillNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getBillNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitBondNode(final BondNode node) {
final Tenor tenor = node.getMaturityTenor();
final ExternalId identifier = _nodeIdMapper.getBondNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getBondNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getBondNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitCalendarSwapNode(final CalendarSwapNode node) {
final Tenor startTenor = node.getStartTenor();
final ExternalId identifier = _nodeIdMapper.getCalendarSwapNodeId(_curveDate, startTenor, node.getStartDateNumber(), node.getEndDateNumber());
final String dataField = _nodeIdMapper.getCalendarSwapNodeDataField(startTenor);
final DataFieldType fieldType = _nodeIdMapper.getCalendarSwapNodeDataFieldType(startTenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitCashNode(final CashNode node) {
final Tenor tenor = node.getMaturityTenor();
final ExternalId identifier = _nodeIdMapper.getCashNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getCashNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getCashNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitContinuouslyCompoundedRateNode(final ContinuouslyCompoundedRateNode node) {
final Tenor tenor = node.getTenor();
final ExternalId identifier = _nodeIdMapper.getContinuouslyCompoundedRateNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getContinuouslyCompoundedRateNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getContinuouslyCompoundedRateDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitPeriodicallyCompoundedRateNode(final PeriodicallyCompoundedRateNode node) {
final Tenor tenor = node.getTenor();
final ExternalId identifier = _nodeIdMapper.getPeriodicallyCompoundedRateNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getPeriodicallyCompoundedRateNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getPeriodicallyCompoundedRateDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitCreditSpreadNode(final CreditSpreadNode node) {
final Tenor tenor = node.getTenor();
final ExternalId identifier = _nodeIdMapper.getCreditSpreadNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getCreditSpreadNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getCreditSpreadNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitDeliverableSwapFutureNode(final DeliverableSwapFutureNode node) {
final Tenor startTenor = node.getStartTenor();
final ExternalId identifier = _nodeIdMapper.getDeliverableSwapFutureNodeId(_curveDate,
startTenor,
node.getFutureTenor(),
node.getFutureNumber());
final String dataField = _nodeIdMapper.getDeliverableSwapFutureNodeDataField(startTenor);
final DataFieldType fieldType = _nodeIdMapper.getDeliverableSwapFutureNodeDataFieldType(startTenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitDiscountFactorNode(final DiscountFactorNode node) {
final Tenor tenor = node.getTenor();
final ExternalId identifier = _nodeIdMapper.getDiscountFactorNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getDiscountFactorNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getDiscountFactorNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitFRANode(final FRANode node) {
final Tenor tenor = node.getFixingEnd();
final ExternalId identifier = _nodeIdMapper.getFRANodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getFRANodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getFRANodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitFXForwardNode(final FXForwardNode node) {
final Map<Tenor, CurveInstrumentProvider> ids = _nodeIdMapper.getFXForwardNodeIds();
final Tenor tenor = node.getMaturityTenor();
CurveInstrumentProvider curveInstrumentProvider = ids.get(tenor);
if (curveInstrumentProvider instanceof StaticCurvePointsInstrumentProvider) {
return createCurveNodeWithIdentifier(tenor, node, (StaticCurvePointsInstrumentProvider) curveInstrumentProvider);
} else {
final ExternalId identifier = _nodeIdMapper.getFXForwardNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getFXForwardNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getFXForwardNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
}
@Override
public CurveNodeWithIdentifier visitFXSwapNode(final FXSwapNode node) {
final Map<Tenor, CurveInstrumentProvider> ids = _nodeIdMapper.getFXSwapNodeIds();
final Tenor tenor = node.getMaturityTenor();
CurveInstrumentProvider curveInstrumentProvider = ids.get(tenor);
if (curveInstrumentProvider instanceof StaticCurvePointsInstrumentProvider) {
return createCurveNodeWithIdentifier(tenor, node, (StaticCurvePointsInstrumentProvider) curveInstrumentProvider);
} else {
final ExternalId identifier = _nodeIdMapper.getFXSwapNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getFXSwapNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getFXSwapNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
}
private CurveNodeWithIdentifier createCurveNodeWithIdentifier(Tenor tenor,
CurveNode node,
StaticCurvePointsInstrumentProvider provider) {
ExternalId identifier = provider.getInstrument(_curveDate, tenor);
String dataField = provider.getMarketDataField();
ExternalId underlyingId = provider.getUnderlyingInstrument();
String underlyingField = provider.getUnderlyingMarketDataField();
return new PointsCurveNodeWithIdentifier(
node, identifier, dataField, DataFieldType.POINTS, underlyingId, underlyingField);
}
@Override
public CurveNodeWithIdentifier visitRollDateFRANode(final RollDateFRANode node) {
final Tenor startTenor = node.getStartTenor();
final ExternalId identifier = _nodeIdMapper.getIMMFRANodeId(_curveDate, startTenor, node.getRollDateStartNumber(), node.getRollDateEndNumber());
final String dataField = _nodeIdMapper.getIMMFRANodeDataField(startTenor);
final DataFieldType fieldType = _nodeIdMapper.getIMMFRANodeDataFieldType(startTenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitRollDateSwapNode(final RollDateSwapNode node) {
final Tenor startTenor = node.getStartTenor();
final ExternalId identifier = _nodeIdMapper.getIMMSwapNodeId(_curveDate, startTenor, node.getRollDateStartNumber(), node.getRollDateEndNumber());
final String dataField = _nodeIdMapper.getIMMSwapNodeDataField(startTenor);
final DataFieldType fieldType = _nodeIdMapper.getIMMSwapNodeDataFieldType(startTenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitRateFutureNode(final RateFutureNode node) {
final Tenor startTenor = node.getStartTenor();
final ExternalId identifier = _nodeIdMapper.getRateFutureNodeId(_curveDate, startTenor, node.getFutureTenor(), node.getFutureNumber());
final String dataField = _nodeIdMapper.getRateFutureNodeDataField(startTenor);
final DataFieldType fieldType = _nodeIdMapper.getRateFutureNodeDataFieldType(startTenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitSwapNode(final SwapNode node) {
final Tenor tenor = node.getMaturityTenor();
final ExternalId identifier = _nodeIdMapper.getSwapNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getSwapNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getSwapNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitThreeLegBasisSwapNode(final ThreeLegBasisSwapNode node) {
final Tenor tenor = node.getMaturityTenor();
final ExternalId identifier = _nodeIdMapper.getThreeLegBasisSwapNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getThreeLegBasisSwapNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getThreeLegBasisSwapNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
@Override
public CurveNodeWithIdentifier visitZeroCouponInflationNode(final ZeroCouponInflationNode node) {
final Tenor tenor = node.getTenor();
final ExternalId identifier = _nodeIdMapper.getZeroCouponInflationNodeId(_curveDate, tenor);
final String dataField = _nodeIdMapper.getZeroCouponInflationNodeDataField(tenor);
final DataFieldType fieldType = _nodeIdMapper.getZeroCouponInflationNodeDataFieldType(tenor);
return new CurveNodeWithIdentifier(node, identifier, dataField, fieldType);
}
}