/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.forwardcurve;
import java.io.Serializable;
import org.threeten.bp.LocalDate;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.financial.analytics.ircurve.IndexType;
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.time.Tenor;
/**
*
*/
public class BloombergFXForwardCurveInstrumentProvider implements ForwardCurveInstrumentProvider, Serializable {
private static final String DATA_FIELD = MarketDataRequirementNames.MARKET_VALUE;
private static final DataFieldType FIELD_TYPE = DataFieldType.OUTRIGHT;
private static final ExternalScheme SCHEME = ExternalSchemes.BLOOMBERG_TICKER;
private final String _prefix;
private final String _postfix;
private final String _spotPrefix;
private final String _dataFieldName;
private final String _spotName;
private final ExternalId _spotId;
public BloombergFXForwardCurveInstrumentProvider(final String prefix, final String postfix, final String spotPrefix, final String dataFieldName) {
ArgumentChecker.notNull(prefix, "prefix");
ArgumentChecker.notNull(postfix, "postfix");
ArgumentChecker.notNull(spotPrefix, "spot prefix");
ArgumentChecker.notNull(dataFieldName, "data field name");
_prefix = prefix;
_postfix = postfix;
_spotPrefix = spotPrefix;
_dataFieldName = dataFieldName;
_spotName = spotPrefix + " " + _postfix;
_spotId = ExternalId.of(SCHEME, _spotName);
}
public String getPrefix() {
return _prefix;
}
public String getPostfix() {
return _postfix;
}
public String getSpotPrefix() {
return _spotPrefix;
}
@Override
public String getDataFieldName() {
return _dataFieldName;
}
public String getSpotName() {
return _spotName;
}
@Override
public ExternalId getSpotInstrument() {
return _spotId;
}
@Override
public String getMarketDataField() {
return DATA_FIELD;
}
@Override
public DataFieldType getDataFieldType() {
return FIELD_TYPE;
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor) {
final StringBuffer ticker = new StringBuffer();
ticker.append(_prefix);
if (tenor.getPeriod().getYears() != 0) {
ticker.append(tenor.getPeriod().getYears() + "Y");
} else if (tenor.getPeriod().getMonths() != 0) {
ticker.append(tenor.getPeriod().getMonths() + "M");
} else if (tenor.getPeriod().getDays() != 0 && tenor.getPeriod().getDays() % 7 == 0) {
ticker.append(tenor.getPeriod().getDays() / 7 + "W");
} else {
throw new OpenGammaRuntimeException("Can only handle periods of year, month and week");
}
ticker.append(" ");
ticker.append(_postfix);
return ExternalId.of(SCHEME, ticker.toString());
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final int numQuarterlyFuturesFromTenor) {
throw new UnsupportedOperationException();
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final int periodsPerYear, final boolean isPeriodicZeroDeposit) {
throw new UnsupportedOperationException();
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final Tenor payTenor, final Tenor receiveTenor, final IndexType payIndexType,
final IndexType receiveIndexType) {
throw new UnsupportedOperationException();
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor tenor, final Tenor resetTenor, final IndexType indexType) {
throw new UnsupportedOperationException();
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor startTenor, final Tenor futureTenor, final int numFutureFromTenor) {
throw new UnsupportedOperationException();
}
@Override
public ExternalId getInstrument(final LocalDate curveDate, final Tenor startTenor, final int startIMMPeriods, final int endIMMPeriods) {
throw new UnsupportedOperationException();
}
@Override
public int hashCode() {
return getPrefix().hashCode() + getPostfix().hashCode() + getDataFieldName().hashCode();
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof BloombergFXForwardCurveInstrumentProvider)) {
return false;
}
final BloombergFXForwardCurveInstrumentProvider other = (BloombergFXForwardCurveInstrumentProvider) obj;
return getPrefix().equals(other.getPrefix()) &&
getPostfix().equals(other.getPostfix()) &&
getSpotPrefix().equals(other.getSpotPrefix()) &&
getDataFieldName().equals(other.getDataFieldName());
}
}