/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.commodity.multicurvecommodity.annuity;
import java.util.ArrayList;
import java.util.List;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.definition.CouponCommodityPhysicalSettleDefinition;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Coupon;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.util.ArgumentChecker;
/**
*A wrapper class for an annuity containing AnnuityCouponCommodityPhysicalSettleDefinition.
*/
public class AnnuityCouponCommodityPhysicalSettleDefinition extends AnnuityCouponCommodityDefinition<CouponCommodityPhysicalSettleDefinition> {
/**
* Constructor from a list of overnight arithmetic average coupons with spread.
* @param payments The coupons.
* @param calendar The holiday calendar
*/
public AnnuityCouponCommodityPhysicalSettleDefinition(final CouponCommodityPhysicalSettleDefinition[] payments, final Calendar calendar) {
super(payments, calendar);
}
@Override
public Annuity<? extends Payment> toDerivative(final ZonedDateTime valZdt) {
ArgumentChecker.notNull(valZdt, "date");
final List<Payment> resultList = new ArrayList<>();
final CouponCommodityPhysicalSettleDefinition[] payments = getPayments();
final ZonedDateTime valZdtInPaymentZone = valZdt.withZoneSameInstant(payments[0].getPaymentDate().getZone());
final LocalDate valDate = valZdtInPaymentZone.toLocalDate();
for (int loopcoupon = 0; loopcoupon < payments.length; loopcoupon++) {
if (!valDate.isAfter(payments[loopcoupon].getPaymentDate().toLocalDate())) {
resultList.add(payments[loopcoupon].toDerivative(valZdt));
}
}
return new Annuity<>(resultList.toArray(new Coupon[resultList.size()]));
}
}