/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitor;
import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitorAdapter;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition;
import com.opengamma.analytics.financial.instrument.payment.PaymentDefinition;
import com.opengamma.util.time.Tenor;
/**
* Gets the index tenors for the coupons in an annuity.
*/
public final class AnnuityIndexTenorsVisitor
extends InstrumentDefinitionVisitorAdapter<ZonedDateTime, List<Set<Tenor>>> {
/** The coupon accrual year fraction visitor */
private static final InstrumentDefinitionVisitor<Void, Set<Tenor>> COUPON_VISITOR = CouponTenorVisitor.getInstance();
/** A singleton instance */
private static final InstrumentDefinitionVisitor<ZonedDateTime, List<Set<Tenor>>> INSTANCE =
new AnnuityIndexTenorsVisitor();
/**
* Gets the singleton instance.
* @return The instance
*/
public static InstrumentDefinitionVisitor<ZonedDateTime, List<Set<Tenor>>> getInstance() {
return INSTANCE;
}
/**
* Private constructor.
*/
private AnnuityIndexTenorsVisitor() {
}
@Override
public List<Set<Tenor>> visitAnnuityDefinition(AnnuityDefinition<? extends PaymentDefinition> annuity,
ZonedDateTime date) {
final int n = annuity.getNumberOfPayments();
final List<Set<Tenor>> tenors = new ArrayList<>();
for (int i = 0; i < n; i++) {
final PaymentDefinition payment = annuity.getNthPayment(i);
if (!date.isAfter(payment.getPaymentDate())) {
tenors.add(payment.accept(COUPON_VISITOR));
}
}
return tenors;
}
}