/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.ircurve;
import org.threeten.bp.LocalDate;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.financial.analytics.ircurve.strips.DataFieldType;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalScheme;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.time.Tenor;
/**
* This should be pulled from the configuration.
*/
public class SyntheticIdentifierCurveInstrumentProvider implements CurveInstrumentProvider {
private final Currency _ccy;
private final StripInstrumentType _type;
private StripInstrumentType _idType;
private final ExternalScheme _scheme;
private final String _dataField;
private final DataFieldType _fieldType;
public SyntheticIdentifierCurveInstrumentProvider(final Currency ccy, final StripInstrumentType type, final ExternalScheme scheme) {
this(ccy, type, scheme, MarketDataRequirementNames.MARKET_VALUE, DataFieldType.OUTRIGHT);
}
public SyntheticIdentifierCurveInstrumentProvider(final Currency ccy, final StripInstrumentType type, final ExternalScheme scheme,
final String dataField, final DataFieldType fieldType) {
ArgumentChecker.notNull(ccy, "currency");
ArgumentChecker.notNull(type, "instrument type");
ArgumentChecker.notNull(scheme, "generated identifier scheme");
ArgumentChecker.notNull(dataField, "data field");
ArgumentChecker.notNull(fieldType, "field type");
_ccy = ccy;
_type = type;
_scheme = scheme;
_dataField = dataField;
_fieldType = fieldType;
switch (type) {
case SWAP_3M:
case SWAP_6M:
case SWAP_12M:
_idType = StripInstrumentType.SWAP;
break;
case FRA_3M:
case FRA_6M:
_idType = StripInstrumentType.FRA;
break;
default:
_idType = type;
break;
}
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + tenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final int numQuarterlyFuturesFromTenor) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + tenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor startTenor, final Tenor futureTenor, final int numQuarterlyFuturesFromTenor) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + startTenor.getPeriod().toString() + futureTenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final int periodsPerYear, final boolean isPeriodicZeroDeposit) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + Integer.toString(periodsPerYear) + tenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final Tenor payTenor, final Tenor receiveTenor, final IndexType payIndexType,
final IndexType receiveIndexType) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + "_" + payIndexType.name() + payTenor.getPeriod().toString() + receiveIndexType.name()
+ receiveTenor.getPeriod().toString() + "_" + tenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final Tenor resetTenor, final IndexType indexType) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + "_" + indexType + resetTenor.getPeriod().toString() + "_" + tenor.getPeriod().toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor startTenor, final int startIMMPeriods, final int endIMMPeriods) {
return ExternalId.of(_scheme, _ccy.getCode() + _idType.name() + startTenor.getPeriod().toString() + "_" + startIMMPeriods + "_" + endIMMPeriods);
}
public Currency getCurrency() {
return _ccy;
}
public StripInstrumentType getType() {
return _type;
}
public ExternalScheme getScheme() {
return _scheme;
}
@Override
public String getMarketDataField() {
return _dataField;
}
@Override
public DataFieldType getDataFieldType() {
return _fieldType;
}
@Override
public boolean equals(final Object o) {
if (o == null) {
return false;
}
if (!(o instanceof SyntheticIdentifierCurveInstrumentProvider)) {
return false;
}
final SyntheticIdentifierCurveInstrumentProvider other = (SyntheticIdentifierCurveInstrumentProvider) o;
return _ccy.equals(other._ccy) &&
_type.equals(other._type) &&
_scheme.equals(other._scheme) &&
_dataField.equals(other._dataField) &&
_fieldType.equals(other._fieldType);
}
@Override
public int hashCode() {
return _ccy.hashCode() ^ (_type.hashCode() * 64);
}
}