in jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java [144:247]
public Date calculateBusinessTimeAsDate(String timeExpression) {
logger.trace("timeExpression {}", timeExpression);
timeExpression = adoptISOFormat(timeExpression);
String trimmed = timeExpression.trim();
int weeks = 0;
int days = 0;
int hours = 0;
int min = 0;
int sec = 0;
if (!trimmed.isEmpty()) {
Matcher mat = PatternConstants.SIMPLE_TIME_DATE_MATCHER.matcher(trimmed);
if (mat.matches()) {
weeks = (mat.group(SIM_WEEK) != null) ? Integer.parseInt(mat.group(SIM_WEEK)) : 0;
days = (mat.group(SIM_DAY) != null) ? Integer.parseInt(mat.group(SIM_DAY)) : 0;
hours = (mat.group(SIM_HOU) != null) ? Integer.parseInt(mat.group(SIM_HOU)) : 0;
min = (mat.group(SIM_MIN) != null) ? Integer.parseInt(mat.group(SIM_MIN)) : 0;
sec = (mat.group(SIM_SEC) != null) ? Integer.parseInt(mat.group(SIM_SEC)) : 0;
}
}
logger.trace("weeks: {}", weeks);
logger.trace("days: {}", days);
logger.trace("hours: {}", hours);
logger.trace("min: {}", min);
logger.trace("sec: {}", sec);
int time = 0;
Calendar calendar = getCalendar();
logger.trace("calendar selected for business calendar: {}", calendar.getTime());
if (timezone != null) {
calendar.setTimeZone(TimeZone.getTimeZone(timezone));
}
// calculate number of weeks
int numberOfWeeks = days / daysPerWeek + weeks;
logger.trace("number of weeks: {}", numberOfWeeks);
if (numberOfWeeks > 0) {
calendar.add(Calendar.WEEK_OF_YEAR, numberOfWeeks);
}
logger.trace("calendar WEEK_OF_YEAR: {}", calendar.get(Calendar.WEEK_OF_YEAR));
rollCalendarToNextWorkingDayIfCurrentDayIsNonWorking(calendar, weekendDays, hours > 0 || min > 0);
hours += (days - (numberOfWeeks * daysPerWeek)) * hoursInDay;
// calculate number of days
int numberOfDays = hours / hoursInDay;
logger.trace("numberOfDays: {}", numberOfDays);
if (numberOfDays > 0) {
for (int i = 0; i < numberOfDays; i++) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
boolean resetTime = false;
rollCalendarToNextWorkingDayIfCurrentDayIsNonWorking(calendar, weekendDays, resetTime);
logger.trace("calendar after rolling to next working day: {} when number of days > 0", calendar.getTime());
rollCalendarAfterHolidays(calendar, holidays, weekendDays, hours > 0 || min > 0);
logger.trace("calendar after holidays when number of days > 0: {}", calendar.getTime());
}
}
int currentCalHour = calendar.get(Calendar.HOUR_OF_DAY);
boolean resetMinuteSecond = currentCalHour >= endHour || currentCalHour < startHour;
rollCalendarToWorkingHour(calendar, resetMinuteSecond);
logger.trace("calendar after rolling to working hour: {}", calendar.getTime());
// calculate remaining hours
time = hours - (numberOfDays * hoursInDay);
calendar.add(Calendar.HOUR, time);
logger.trace("calendar after adding time {}: {}", time, calendar.getTime());
boolean resetTime = true;
rollCalendarToNextWorkingDayIfCurrentDayIsNonWorking(calendar, weekendDays, resetTime);
logger.trace("calendar after rolling to next working day: {}", calendar.getTime());
rollCalendarAfterHolidays(calendar, holidays, weekendDays, hours > 0 || min > 0);
logger.trace("calendar after holidays: {}", calendar.getTime());
rollCalendarToWorkingHour(calendar, false);
logger.trace("calendar after rolling to working hour: {}", calendar.getTime());
// calculate minutes
int numberOfHours = min / 60;
if (numberOfHours > 0) {
calendar.add(Calendar.HOUR, numberOfHours);
min = min - (numberOfHours * 60);
}
calendar.add(Calendar.MINUTE, min);
// calculate seconds
int numberOfMinutes = sec / 60;
if (numberOfMinutes > 0) {
calendar.add(Calendar.MINUTE, numberOfMinutes);
sec = sec - (numberOfMinutes * 60);
}
calendar.add(Calendar.SECOND, sec);
logger.trace("calendar after adding {} hour, {} minutes and {} seconds: {}", numberOfHours, numberOfMinutes, sec, calendar.getTime());
rollCalendarToWorkingHour(calendar, false);
logger.trace("calendar after rolling to next working day: {}", calendar.getTime());
// take under consideration weekend
resetTime = false;
rollCalendarToNextWorkingDayIfCurrentDayIsNonWorking(calendar, weekendDays, resetTime);
logger.trace("calendar after rolling to next working day: {}", calendar.getTime());
// take under consideration holidays
rollCalendarAfterHolidays(calendar, holidays, weekendDays, resetTime);
logger.trace("calendar after holidays: {}", calendar.getTime());
return calendar.getTime();
}