You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2019/07/15 00:46:49 UTC

[logging-log4j2] branch master updated: LOG4J2-2575 - CronExpression.getBeforeTime() would sometimes return incorrect result

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new bf96138  LOG4J2-2575 - CronExpression.getBeforeTime() would sometimes return incorrect result
bf96138 is described below

commit bf961381d2cf5e3e4502bb211af88ee1a7725d6f
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Jul 14 17:46:00 2019 -0700

    LOG4J2-2575 - CronExpression.getBeforeTime() would sometimes return incorrect result
---
 .../logging/log4j/core/util/CronExpression.java      |  9 +++++++--
 .../logging/log4j/core/util/CronExpressionTest.java  | 20 ++++++++++++++++++++
 src/changes/changes.xml                              |  3 +++
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
index 3e8930a..a850672 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
@@ -1572,8 +1572,13 @@ public final class CronExpression {
     protected Date getTimeBefore(final Date targetDate) {
         final Calendar cl = Calendar.getInstance(getTimeZone());
 
+        // CronTrigger does not deal with milliseconds, so truncate target
+        cl.setTime(targetDate);
+        cl.set(Calendar.MILLISECOND, 0);
+        final Date targetDateNoMs = cl.getTime();
+
         // to match this
-        Date start = targetDate;
+        Date start = targetDateNoMs;
         final long minIncrement = findMinIncrement();
         Date prevFireTime;
         do {
@@ -1583,7 +1588,7 @@ public final class CronExpression {
                 return null;
             }
             start = prevCheckDate;
-        } while (prevFireTime.compareTo(targetDate) >= 0);
+        } while (prevFireTime.compareTo(targetDateNoMs) >= 0);
         return prevFireTime;
     }
 
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
index bafdcfa..54bf666 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
@@ -18,6 +18,8 @@ package org.apache.logging.log4j.core.util;
 
 import org.junit.Test;
 
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 
@@ -153,4 +155,22 @@ public class CronExpressionTest {
         assertEquals("Dates not equal.", expected, fireDate);
     }
 
+    /*
+     * Input time with milliseconds will correctly return the next
+     * scheduled time.
+     */
+    @Test
+    public void testTimeBeforeMilliseconds() throws Exception {
+        final CronExpression parser = new CronExpression("0 0 0 * * ?");
+        final GregorianCalendar cal = new GregorianCalendar(2015, 10, 2, 0, 0, 0);
+        cal.set(Calendar.MILLISECOND, 100);
+        final Date date = cal.getTime();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+        System.err.println(sdf.format(date));
+        final Date fireDate = parser.getTimeBefore(date);
+        System.err.println(sdf.format(fireDate));
+        final Date expected = new GregorianCalendar(2015, 10, 1, 0, 0, 0).getTime();
+        assertEquals("Dates not equal.", expected, fireDate);
+    }
+
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f0ad312..2fecddd 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -142,6 +142,9 @@
       </action>
     </release>
     <release version="2.12.1" date="2019-MM-DD" description="GA Release 2.12.1">
+      <action issue="LOG4J2-2575" dev="rgoers" type="fix" due-to="Nathan Friess">
+        CronExpression.getBeforeTime() would sometimes return incorrect result.
+      </action>
       <action issue="LOG4J2-2644" dev="rgoers" type="fix">
         Improve the performance of capturing location information.
       </action>