private boolean isEnclosedByAHolidayWithRepaymentRule(DateTime date, RepaymentRuleTypes rule) {
   for (Holiday holiday : this.upcomingHolidays) {
     if (holiday.encloses(date.toDate()) && (holiday.getRepaymentRuleType() == rule)) {
       return true;
     }
   }
   return false;
 }
 private boolean isEnclosedByAHoliday(DateTime date) {
   for (Holiday holiday : this.upcomingHolidays) {
     if (holiday.encloses(date.toDate())) {
       return true;
     }
   }
   return false;
 }
 private int countDatesEnclosedByHoliday(List<DateTime> dates, Holiday holiday) {
   int countEnclosedDates = 0;
   for (int i = 0; i < dates.size(); i++) {
     if (holiday.encloses(dates.get(i).toDate())) {
       countEnclosedDates++;
     }
   }
   return countEnclosedDates;
 }
  private Holiday getHolidayEnclosing(DateTime date) {

    assert isEnclosedByAHoliday(date);

    Holiday holidayEnclosingDate = null;
    for (Holiday holiday : upcomingHolidays) {
      if (holiday.encloses(date.toDate())) {
        holidayEnclosingDate = holiday;
      }
    }
    return holidayEnclosingDate;
  }
  /**
   * Given that the first date in the list falls in a non-Moratorium holiday, return the list of
   * dates that fall in the holiday, but shifted out of the holiday using the holiday's repayment
   * rule. TODO keithp: once dates are shifted past all non-moratorium holidays, then check whether
   * any fall in a moratorium period. If they do, push them past the moratorium, but do not push out
   * future dates. TODO keithp: if shifting a date does not change the date (e.g. same day holiday),
   * then we're done with it, so move to the next date.
   */
  private List<DateTime> shiftDatesInNonMoratoriumHoliday(List<DateTime> dates) {

    assert dates != null;
    assert !dates.isEmpty();
    assert isEnclosedByAHoliday(dates.get(0));
    assert !isEnclosedByAHolidayWithRepaymentRule(
        dates.get(0), RepaymentRuleTypes.REPAYMENT_MORATORIUM);

    Holiday enclosingHoliday = getHolidayEnclosing(dates.get(0));
    List<DateTime> shiftedDatesInHoliday = new ArrayList<DateTime>();
    for (int i = 0; i < dates.size(); i++) {
      if (enclosingHoliday.encloses(dates.get(i).toDate())) {
        shiftedDatesInHoliday.add(nonMoratoriumAdjustmentStrategy.adjust(dates.get(i)));
      }
    }
    return shiftedDatesInHoliday;
  }