/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.description.interestrate; import java.util.List; import java.util.Set; import org.apache.commons.lang.ObjectUtils; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.legalentity.LegalEntity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.tuple.DoublesPair; /** * Class describing a multi-curves provider created from a issuer provider where the discounting curve * for one issuer replace (decorate) the discounting curve for one currency. */ public class MulticurveProviderDiscountingDecoratedIssuer implements MulticurveProviderInterface { /** * The underlying Issuer provider on which the multi-curves provider is based. */ private final IssuerProviderInterface _issuerProvider; /** * The currency for which the discounting curve will be replaced (decorated). */ private final Currency _decoratedCurrency; /** * The issuer for which the associated discounting curve will replace the currency discounting curve. */ private final LegalEntity _decoratingIssuer; /** * Constructor. * @param issuerProvider The underlying issuer provider on which the multi-curves provider is based, not null * @param decoratedCurrency The currency for which the discounting curve will be replaced (decorated), not null * @param decoratingIssuer The issuer for which the associated discounting curve will replace the currency discounting curve, not null */ public MulticurveProviderDiscountingDecoratedIssuer(final IssuerProviderInterface issuerProvider, final Currency decoratedCurrency, final LegalEntity decoratingIssuer) { ArgumentChecker.notNull(issuerProvider, "issuerProvider"); ArgumentChecker.notNull(decoratedCurrency, "decoratedCurrency"); ArgumentChecker.notNull(decoratingIssuer, "decoratingIssuer"); _issuerProvider = issuerProvider; _decoratedCurrency = decoratedCurrency; _decoratingIssuer = decoratingIssuer; } @Override public MulticurveProviderInterface getMulticurveProvider() { return this; } @Override public MulticurveProviderInterface copy() { return new MulticurveProviderDiscountingDecoratedIssuer(_issuerProvider.copy(), _decoratedCurrency, _decoratingIssuer); } @Override public double getDiscountFactor(final Currency ccy, final Double time) { if (ccy.equals(_decoratedCurrency)) { return _issuerProvider.getDiscountFactor(_decoratingIssuer, time); } return _issuerProvider.getMulticurveProvider().getDiscountFactor(ccy, time); } @Override public double getInvestmentFactor(final IborIndex index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getInvestmentFactor(index, startTime, endTime, accrualFactor); } @Override public double getSimplyCompoundForwardRate(final IborIndex index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getSimplyCompoundForwardRate(index, startTime, endTime, accrualFactor); } @Override public double getSimplyCompoundForwardRate(final IborIndex index, final double startTime, final double endTime) { return _issuerProvider.getMulticurveProvider().getSimplyCompoundForwardRate(index, startTime, endTime); } @Override public double getAnnuallyCompoundForwardRate(final IborIndex index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getAnnuallyCompoundForwardRate(index, startTime, endTime, accrualFactor); } @Override public double getAnnuallyCompoundForwardRate(final IborIndex index, final double startTime, final double endTime) { return _issuerProvider.getMulticurveProvider().getAnnuallyCompoundForwardRate(index, startTime, endTime); } @Override public double getInvestmentFactor(final IndexON index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getInvestmentFactor(index, startTime, endTime, accrualFactor); } @Override public double getSimplyCompoundForwardRate(final IndexON index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getSimplyCompoundForwardRate(index, startTime, endTime, accrualFactor); } @Override public double getSimplyCompoundForwardRate(final IndexON index, final double startTime, final double endTime) { return _issuerProvider.getMulticurveProvider().getSimplyCompoundForwardRate(index, startTime, endTime); } @Override public double getAnnuallyCompoundForwardRate(final IndexON index, final double startTime, final double endTime, final double accrualFactor) { return _issuerProvider.getMulticurveProvider().getAnnuallyCompoundForwardRate(index, startTime, endTime, accrualFactor); } @Override public double getAnnuallyCompoundForwardRate(final IndexON index, final double startTime, final double endTime) { return _issuerProvider.getMulticurveProvider().getAnnuallyCompoundForwardRate(index, startTime, endTime); } @Override public double getFxRate(final Currency ccy1, final Currency ccy2) { return _issuerProvider.getMulticurveProvider().getFxRate(ccy1, ccy2); } @Override public double[] parameterSensitivity(final String name, final List<DoublesPair> pointSensitivity) { return _issuerProvider.parameterSensitivity(name, pointSensitivity); } @Override public double[] parameterForwardSensitivity(final String name, final List<ForwardSensitivity> pointSensitivity) { return _issuerProvider.parameterForwardSensitivity(name, pointSensitivity); } @Override public Integer getNumberOfParameters(final String name) { return _issuerProvider.getNumberOfParameters(name); } @Override public List<String> getUnderlyingCurvesNames(final String name) { return _issuerProvider.getUnderlyingCurvesNames(name); } @Override public String getName(final Currency ccy) { if (ccy.equals(_decoratedCurrency)) { return _issuerProvider.getName(_decoratingIssuer); } return _issuerProvider.getMulticurveProvider().getName(ccy); } @Override public Set<Currency> getCurrencies() { return _issuerProvider.getMulticurveProvider().getCurrencies(); } @Override public String getName(final IborIndex index) { return _issuerProvider.getMulticurveProvider().getName(index); } @Override public Set<IborIndex> getIndexesIbor() { return _issuerProvider.getMulticurveProvider().getIndexesIbor(); } @Override public String getName(final IndexON index) { return _issuerProvider.getMulticurveProvider().getName(index); } @Override public Set<IndexON> getIndexesON() { return _issuerProvider.getMulticurveProvider().getIndexesON(); } @Override public FXMatrix getFxRates() { return _issuerProvider.getMulticurveProvider().getFxRates(); } @Override public Set<String> getAllNames() { return _issuerProvider.getAllCurveNames(); } @Override public Set<String> getAllCurveNames() { return _issuerProvider.getAllCurveNames(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _decoratedCurrency.hashCode(); result = prime * result + _decoratingIssuer.hashCode(); result = prime * result + _issuerProvider.hashCode(); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof MulticurveProviderDiscountingDecoratedIssuer)) { return false; } final MulticurveProviderDiscountingDecoratedIssuer other = (MulticurveProviderDiscountingDecoratedIssuer) obj; if (!ObjectUtils.equals(_decoratedCurrency, other._decoratedCurrency)) { return false; } if (!ObjectUtils.equals(_decoratingIssuer, other._decoratingIssuer)) { return false; } if (!ObjectUtils.equals(_issuerProvider, other._issuerProvider)) { return false; } return true; } }