This is an automated email from the ASF dual-hosted git repository.
tiagobento pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new 2210a32266 [incubator-kie-issues#1648] Fix BusinessCalendarImpl time
calculation when currentCalHour < startHour (#3795)
2210a32266 is described below
commit 2210a32266dc014b98b5d2e309785eb5e77196bd
Author: Martin Weiler <[email protected]>
AuthorDate: Tue Dec 3 08:03:57 2024 -0700
[incubator-kie-issues#1648] Fix BusinessCalendarImpl time calculation when
currentCalHour < startHour (#3795)
* [incubator-kie-issues#1648] Fix BusinessCalendarImpl time calculation
when currentCalHour < startHour
* Test case for BusinessCalendar time calculation when currentCalHour <
endHour
* Use parseToDateWithTimeAndMillis to make sure calculation is exact
* Additional tests to verify correct handling of seconds
---
.../process/core/timer/BusinessCalendarImpl.java | 16 +++--
.../core/timer/BusinessCalendarImplTest.java | 72 ++++++++++++++++++++++
2 files changed, 84 insertions(+), 4 deletions(-)
diff --git
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java
index fbb650e3c3..b22f48cbb3 100755
---
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java
+++
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java
@@ -193,7 +193,9 @@ public class BusinessCalendarImpl implements
BusinessCalendar {
Date calculatedDate = calculateBusinessTimeAsDate(timeExpression);
- return (calculatedDate.getTime() - getCurrentTime());
+ long calculatedDurationInMs = (calculatedDate.getTime() -
getCurrentTime());
+ logger.debug("calculateBusinessTimeAsDuration for expression {}
returns {} seconds", timeExpression, (calculatedDurationInMs / 1000));
+ return calculatedDurationInMs;
}
public Date calculateBusinessTimeAsDate(String timeExpression) {
@@ -251,7 +253,9 @@ public class BusinessCalendarImpl implements
BusinessCalendar {
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
} else if (currentCalHour < startHour) {
- c.add(Calendar.HOUR_OF_DAY, startHour);
+ c.add(Calendar.HOUR_OF_DAY, startHour - currentCalHour);
+ c.set(Calendar.MINUTE, 0);
+ c.set(Calendar.SECOND, 0);
}
// calculate remaining hours
@@ -267,7 +271,9 @@ public class BusinessCalendarImpl implements
BusinessCalendar {
c.set(Calendar.HOUR_OF_DAY, startHour);
c.add(Calendar.HOUR_OF_DAY, currentCalHour - endHour);
} else if (currentCalHour < startHour) {
- c.add(Calendar.HOUR_OF_DAY, startHour);
+ c.add(Calendar.HOUR_OF_DAY, startHour - currentCalHour);
+ c.set(Calendar.MINUTE, 0);
+ c.set(Calendar.SECOND, 0);
}
// calculate minutes
@@ -293,7 +299,9 @@ public class BusinessCalendarImpl implements
BusinessCalendar {
c.set(Calendar.HOUR_OF_DAY, startHour);
c.add(Calendar.HOUR_OF_DAY, currentCalHour - endHour);
} else if (currentCalHour < startHour) {
- c.add(Calendar.HOUR_OF_DAY, startHour);
+ c.add(Calendar.HOUR_OF_DAY, startHour - currentCalHour);
+ c.set(Calendar.MINUTE, 0);
+ c.set(Calendar.SECOND, 0);
}
// take under consideration weekend
handleWeekend(c, false);
diff --git
a/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java
b/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java
index 3d398d753d..40ad261bdd 100755
---
a/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java
+++
b/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java
@@ -368,6 +368,78 @@ public class BusinessCalendarImplTest extends
AbstractBaseTest {
assertThat(formatDate("yyyy-MM-dd HH:mm:ss",
result)).isEqualTo(expectedDate);
}
+ @Test
+ public void testCalculateMinutesBeforeStartHour() {
+ Properties config = new Properties();
+ config.setProperty(BusinessCalendarImpl.HOURS_PER_DAY, "4");
+ config.setProperty(BusinessCalendarImpl.START_HOUR, "14");
+ config.setProperty(BusinessCalendarImpl.END_HOUR, "18");
+ String currentDate = "2024-11-28 10:48:33.000";
+ String duration = "10m";
+ String expectedDate = "2024-11-28 14:10:00";
+
+ SessionPseudoClock clock = new
StaticPseudoClock(parseToDateWithTimeAndMillis(currentDate).getTime());
+ BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config,
clock);
+
+ Date result = businessCal.calculateBusinessTimeAsDate(duration);
+
+ assertThat(formatDate("yyyy-MM-dd HH:mm:ss",
result)).isEqualTo(expectedDate);
+ }
+
+ @Test
+ public void testCalculateSecondsBeforeStartHour() {
+ Properties config = new Properties();
+ config.setProperty(BusinessCalendarImpl.HOURS_PER_DAY, "4");
+ config.setProperty(BusinessCalendarImpl.START_HOUR, "14");
+ config.setProperty(BusinessCalendarImpl.END_HOUR, "18");
+ String currentDate = "2024-11-28 10:48:33.000";
+ String duration = "10s";
+ String expectedDate = "2024-11-28 14:00:10";
+
+ SessionPseudoClock clock = new
StaticPseudoClock(parseToDateWithTimeAndMillis(currentDate).getTime());
+ BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config,
clock);
+
+ Date result = businessCal.calculateBusinessTimeAsDate(duration);
+
+ assertThat(formatDate("yyyy-MM-dd HH:mm:ss",
result)).isEqualTo(expectedDate);
+ }
+
+ @Test
+ public void testCalculateMinutesBeforeEndHour() {
+ Properties config = new Properties();
+ config.setProperty(BusinessCalendarImpl.HOURS_PER_DAY, "4");
+ config.setProperty(BusinessCalendarImpl.START_HOUR, "14");
+ config.setProperty(BusinessCalendarImpl.END_HOUR, "18");
+ String currentDate = "2024-11-28 17:58:33.000";
+ String duration = "10m";
+ String expectedDate = "2024-11-29 14:08:33";
+
+ SessionPseudoClock clock = new
StaticPseudoClock(parseToDateWithTimeAndMillis(currentDate).getTime());
+ BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config,
clock);
+
+ Date result = businessCal.calculateBusinessTimeAsDate(duration);
+
+ assertThat(formatDate("yyyy-MM-dd HH:mm:ss",
result)).isEqualTo(expectedDate);
+ }
+
+ @Test
+ public void testCalculateSecondsBeforeEndHour() {
+ Properties config = new Properties();
+ config.setProperty(BusinessCalendarImpl.HOURS_PER_DAY, "4");
+ config.setProperty(BusinessCalendarImpl.START_HOUR, "14");
+ config.setProperty(BusinessCalendarImpl.END_HOUR, "18");
+ String currentDate = "2024-11-28 17:59:33.000";
+ String duration = "50s";
+ String expectedDate = "2024-11-29 14:00:23";
+
+ SessionPseudoClock clock = new
StaticPseudoClock(parseToDateWithTimeAndMillis(currentDate).getTime());
+ BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config,
clock);
+
+ Date result = businessCal.calculateBusinessTimeAsDate(duration);
+
+ assertThat(formatDate("yyyy-MM-dd HH:mm:ss",
result)).isEqualTo(expectedDate);
+ }
+
private Date parseToDate(String dateString) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]