/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.bond.provider; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter; import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedSecurity; import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedTransaction; import com.opengamma.analytics.financial.interestrate.bond.definition.BondIborSecurity; import com.opengamma.analytics.financial.interestrate.bond.definition.BondIborTransaction; import com.opengamma.analytics.financial.interestrate.bond.definition.BondSecurity; import com.opengamma.analytics.financial.interestrate.payments.derivative.Coupon; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.provider.description.interestrate.IssuerProviderInterface; /** * Returns the discount factors for each payment of a bond. */ public final class BondDiscountFactorsVisitor extends InstrumentDerivativeVisitorAdapter<IssuerProviderInterface, double[]> { /** A singleton instance */ private static final InstrumentDerivativeVisitor<IssuerProviderInterface, double[]> INSTANCE = new BondDiscountFactorsVisitor(); /** * Gets the singleton instance. * @return The instance */ public static InstrumentDerivativeVisitor<IssuerProviderInterface, double[]> getInstance() { return INSTANCE; } /** * Private constructor. */ private BondDiscountFactorsVisitor() { } @Override public double[] visitBondFixedSecurity(final BondFixedSecurity bond, final IssuerProviderInterface data) { return visitGenericBond(bond, data); } @Override public double[] visitBondFixedTransaction(final BondFixedTransaction bond, final IssuerProviderInterface data) { return visitGenericBond(bond.getBondTransaction(), data); } @Override public double[] visitBondIborSecurity(final BondIborSecurity bond, final IssuerProviderInterface data) { return visitGenericBond(bond, data); } @Override public double[] visitBondIborTransaction(final BondIborTransaction bond, final IssuerProviderInterface data) { return visitGenericBond(bond.getBondTransaction(), data); } /** * Returns the discount factors for a generic bond. * @param bond The bond * @param curves The curves * @return The discount factors. */ private static double[] visitGenericBond(final BondSecurity<? extends Payment, ? extends Coupon> bond, final IssuerProviderInterface curves) { final int n = bond.getCoupon().getNumberOfPayments(); final double[] fractions = new double[n]; for (int i = 0; i < n; i++) { fractions[i] = curves.getDiscountFactor(bond.getIssuerEntity(), bond.getCoupon().getNthPayment(i).getPaymentTime()); } return fractions; } }