/*
* jFin, open source derivatives trade processing
*
* Copyright (C) 2005-2011 Morgan Brown Consultancy Ltd.
*
* This file is part of jFin.
*
* jFin is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* jFin is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with jFin; if not, write to the Free Software Foundation, Inc., 51 Franklin
* St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.mbc.jfin.holiday.impl;
import com.mbc.jfin.holiday.BusinessDayConvention;
import com.mbc.jfin.holiday.DateAdjustmentService;
import com.mbc.jfin.holiday.HolidayCalendar;
import com.mbc.jfin.util.DateUtils;
import org.joda.time.Days;
import org.joda.time.LocalDate;
/**
* Created by IntelliJ IDEA.
* User: dmb
* Date: 06/05/2011
* Time: 18:44
*/
public class DefaultDateAdjustmentServiceImpl implements DateAdjustmentService {
public LocalDate adjust(LocalDate calendar, BusinessDayConvention businessDayConvention, HolidayCalendar holidayCalendar) {
switch (businessDayConvention) {
case UNADJUSTED:
return calendar;
case FOLLOWING:
return following(calendar,holidayCalendar);
case MODIFIED_FOLLOWING:
return modFollowing(calendar,holidayCalendar);
case PRECEDING:
return preceding(calendar,holidayCalendar);
case MODIFIED_PRECEDING:
return modPreceding(calendar,holidayCalendar);
case MONTH_END_REFERENCE:
return monthEndReference(calendar,holidayCalendar);
default:
throw new UnsupportedBusinessDayConventionException(businessDayConvention);
}
}
private LocalDate monthEndReference(LocalDate calendar, HolidayCalendar holidayCalendar) {
LocalDate d1 = new LocalDate(calendar.getYear(), calendar.getMonthOfYear(), DateUtils.getDaysInMonth(calendar));
return preceding(d1, holidayCalendar);
}
public LocalDate following(LocalDate calendar, HolidayCalendar holidayCalendar) {
LocalDate d1 = calendar;
while (holidayCalendar.isHoliday(d1) || holidayCalendar.isWeekend(d1))
{
d1 = d1.plus(Days.ONE);
}
return d1;
}
public LocalDate modFollowing(LocalDate calendar, HolidayCalendar holidayCalendar) {
LocalDate d1 = calendar;
while (holidayCalendar.isHoliday(d1) || holidayCalendar.isWeekend(d1))
{
d1 = d1.plus(Days.ONE);
}
if (d1.getMonthOfYear() != calendar.getMonthOfYear())
{
return preceding(calendar, holidayCalendar);
}
return d1;
}
public LocalDate preceding(LocalDate calendar, HolidayCalendar holidayCalendar) {
LocalDate d1 = calendar;
while (holidayCalendar.isHoliday(d1) || holidayCalendar.isWeekend(d1))
{
d1 = d1.minus(Days.ONE);
}
return d1;
}
public LocalDate modPreceding(LocalDate calendar, HolidayCalendar holidayCalendar) {
LocalDate d1 = calendar;
while (holidayCalendar.isHoliday(d1) || holidayCalendar.isWeekend(d1))
{
d1 = d1.minus(Days.ONE);
}
if (d1.getMonthOfYear() != calendar.getMonthOfYear())
{
return following(calendar, holidayCalendar);
}
return d1;
}
private class UnsupportedBusinessDayConventionException extends RuntimeException {
public UnsupportedBusinessDayConventionException(BusinessDayConvention businessDayConvention) {
super("Unsupported business day convention: "+businessDayConvention);
}
}
}
Ads help maintain this website.