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]

Reply via email to