/**
* 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 org.threeten.bp.LocalDate;
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.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Gets the fixing period start and end dates for annuity from a particular date.
*/
public final class AnnuityFixingDatesVisitor extends InstrumentDefinitionVisitorAdapter<ZonedDateTime, Pair<LocalDate[], LocalDate[]>> {
/** The visitor for coupon types */
private static final InstrumentDefinitionVisitor<Void, Pair<LocalDate, LocalDate>> COUPON_VISITOR = new CouponFixingDatesVisitor();
/** A singleton instance */
private static final InstrumentDefinitionVisitor<ZonedDateTime, Pair<LocalDate[], LocalDate[]>> INSTANCE = new AnnuityFixingDatesVisitor();
/**
* Gets the single instance of this class.
* @return The instance
*/
public static InstrumentDefinitionVisitor<ZonedDateTime, Pair<LocalDate[], LocalDate[]>> getInstance() {
return INSTANCE;
}
/**
* Private constructor.
*/
private AnnuityFixingDatesVisitor() {
}
@Override
public Pair<LocalDate[], LocalDate[]> visitAnnuityDefinition(final AnnuityDefinition<? extends PaymentDefinition> annuity, final ZonedDateTime date) {
final int n = annuity.getNumberOfPayments();
final List<LocalDate> startDates = new ArrayList<>();
final List<LocalDate> endDates = new ArrayList<>();
int count = 0;
for (int i = 0; i < n; i++) {
final PaymentDefinition payment = annuity.getNthPayment(i);
if (!date.isAfter(payment.getPaymentDate())) {
try {
final Pair<LocalDate, LocalDate> dates = annuity.getNthPayment(i).accept(COUPON_VISITOR);
startDates.add(dates.getFirst());
endDates.add(dates.getSecond());
} catch (UnsupportedOperationException ex) {
startDates.add(null);
endDates.add(null);
}
count++;
}
}
return Pairs.of(startDates.toArray(new LocalDate[count]), endDates.toArray(new LocalDate[count]));
}
}