public Date calculateBusinessTimeAsDate()

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();
    }