/** * 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 org.threeten.bp.Period; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.id.ExternalSchemes; 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.time.Tenor; /** * */ public class BloombergForwardSwapCurveInstrumentProvider extends ForwardSwapCurveInstrumentProvider implements 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_WEAK; private static final String[] MONTHS = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "1A", "1B", "1C", "1D", "1E", "1F", "1G", "1H", "1I", "1J", "1K", "1L" }; private final String _prefix; private final String _postfix; private final String _spotPrefix; private final String _dataFieldName; public BloombergForwardSwapCurveInstrumentProvider(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; } public String getPrefix() { return _prefix; } public String getPostfix() { return _postfix; } public String getSpotPrefix() { return _spotPrefix; } @Override public String getDataFieldName() { return _dataFieldName; } @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 Tenor forwardTenor) { final String swapCode = getTenorCode(tenor.getPeriod(), false); final String forwardCode = getTenorCode(forwardTenor.getPeriod(), true); return ExternalId.of(SCHEME, _prefix + forwardCode + swapCode + " " + _postfix); } @Override public ExternalId getSpotInstrument(final Tenor forwardTenor) { final Period period = forwardTenor.getPeriod(); return ExternalId.of(SCHEME, getSwapCode(period)); } private String getTenorCode(final Period period, final boolean prepadWithZero) { if (period.getYears() != 0) { if (period.getYears() < 10 && prepadWithZero) { return "0" + Integer.toString(period.getYears()); } return Integer.toString(period.getYears()); } if (period.getMonths() != 0) { final int months = period.getMonths(); if (months > 0) { final String result = MONTHS[months - 1]; if (result.length() == 1 && prepadWithZero) { return "0" + result; } return result; } } throw new OpenGammaRuntimeException("Can only handle tenors of months or years; have " + period); } @Override public ExternalId getInstrument(final LocalDate curveDate, final Tenor startTenor, final Tenor futureTenor, final int numFutureFromTenor) { throw new UnsupportedOperationException(); } private String getSwapCode(final Period period) { if (period.getYears() != 0) { final String years = Integer.toString(period.getYears()); return _spotPrefix + years + _postfix; } if (period.getMonths() != 0) { return _spotPrefix + MONTHS[period.getMonths() - 1] + _postfix; } throw new OpenGammaRuntimeException("Can only handle swap tenors of months or years; have " + period); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _dataFieldName.hashCode(); result = prime * result + _postfix.hashCode(); result = prime * result + _prefix.hashCode(); result = prime * result + _spotPrefix.hashCode(); return result; } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (!(obj instanceof BloombergForwardSwapCurveInstrumentProvider)) { return false; } final BloombergForwardSwapCurveInstrumentProvider other = (BloombergForwardSwapCurveInstrumentProvider) obj; return getPrefix().equals(other.getPrefix()) && getPostfix().equals(other.getPostfix()) && getSpotPrefix().equals(other.getSpotPrefix()) && getDataFieldName().equals(other.getDataFieldName()); } }