/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.inflationissuer;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorDelegate;
import com.opengamma.analytics.financial.interestrate.bond.definition.BillTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondCapitalIndexedSecurity;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondCapitalIndexedTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondIborTransaction;
import com.opengamma.analytics.financial.interestrate.bond.provider.BillTransactionDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.bond.provider.BondCapitalIndexedSecurityDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.bond.provider.BondCapitalIndexedTransactionDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.bond.provider.BondTransactionDiscountingMethod;
import com.opengamma.analytics.financial.provider.calculator.inflation.InflationIssuerProviderAdapter;
import com.opengamma.analytics.financial.provider.calculator.inflation.PresentValueDiscountingInflationCalculator;
import com.opengamma.analytics.financial.provider.description.inflation.InflationIssuerProviderInterface;
import com.opengamma.analytics.financial.provider.description.inflation.ParameterInflationIssuerProviderInterface;
import com.opengamma.util.money.MultipleCurrencyAmount;
/**
* Calculates the present value of an inflation instruments by discounting for a given MarketBundle
*/
public final class PresentValueDiscountingInflationIssuerCalculator
extends InstrumentDerivativeVisitorDelegate<ParameterInflationIssuerProviderInterface, MultipleCurrencyAmount> {
/**
* The unique instance of the calculator.
*/
private static final PresentValueDiscountingInflationIssuerCalculator INSTANCE = new PresentValueDiscountingInflationIssuerCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static PresentValueDiscountingInflationIssuerCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private PresentValueDiscountingInflationIssuerCalculator() {
super(new InflationIssuerProviderAdapter<>(PresentValueDiscountingInflationCalculator.getInstance()));
}
/**
* Pricing methods.
*/
private static final BondCapitalIndexedSecurityDiscountingMethod METHOD_BOND_INFL_SEC =
new BondCapitalIndexedSecurityDiscountingMethod();
private static final BondCapitalIndexedTransactionDiscountingMethod METHOD_BOND_INFL_TR =
new BondCapitalIndexedTransactionDiscountingMethod();
private static final BillTransactionDiscountingMethod METHOD_BILL_TR =
BillTransactionDiscountingMethod.getInstance();
private static final BondTransactionDiscountingMethod METHOD_BOND_TR =
BondTransactionDiscountingMethod.getInstance();
@Override
public MultipleCurrencyAmount visitBondCapitalIndexedSecurity(final BondCapitalIndexedSecurity<?> bond,
final ParameterInflationIssuerProviderInterface market) {
if (!(market instanceof InflationIssuerProviderInterface)) {
throw new UnsupportedOperationException(
"visitBondCapitalIndexedSecurity does not support data not a InflationIssuerProviderInterface");
}
InflationIssuerProviderInterface inflationIssuer = (InflationIssuerProviderInterface) market;
return METHOD_BOND_INFL_SEC.presentValue(bond, inflationIssuer);
}
@Override
public MultipleCurrencyAmount visitBondCapitalIndexedTransaction(final BondCapitalIndexedTransaction<?> bond,
final ParameterInflationIssuerProviderInterface market) {
if (!(market instanceof InflationIssuerProviderInterface)) {
throw new UnsupportedOperationException(
"visitBondCapitalIndexedSecurity does not support data not a InflationIssuerProviderInterface");
}
InflationIssuerProviderInterface inflationIssuer = (InflationIssuerProviderInterface) market;
return METHOD_BOND_INFL_TR.presentValue(bond, inflationIssuer);
}
// ----- Bond/Bill -----
@Override
public MultipleCurrencyAmount visitBillTransaction(final BillTransaction bill,
final ParameterInflationIssuerProviderInterface market) {
return METHOD_BILL_TR.presentValue(bill, market.getIssuerProvider());
}
@Override
public MultipleCurrencyAmount visitBondFixedTransaction(final BondFixedTransaction bond,
final ParameterInflationIssuerProviderInterface market) {
return METHOD_BOND_TR.presentValue(bond, market.getIssuerProvider());
}
@Override
public MultipleCurrencyAmount visitBondIborTransaction(final BondIborTransaction bond,
final ParameterInflationIssuerProviderInterface market) {
return METHOD_BOND_TR.presentValue(bond, market.getIssuerProvider());
}
}