You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2020/01/06 13:50:21 UTC

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

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

ckozak pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


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

commit 07787ec8459e03cefcb23c48b312d363ce8f6856
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 b31abf1..da580ff 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 e52f435..c00d2f0 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 d4f8973..ec0f846 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -63,6 +63,9 @@
       <action issue="LOG4J2-2754" dev="ckozak" type="fix">
         LoaderUtil.getClassLoaders may discover additional loaders and no longer erroneously returns a result with a null element in some environments.
       </action>
+      <action issue="LOG4J2-2575" dev="rgoers" type="fix" due-to="Nathan Friess">
+        CronExpression.getBeforeTime() would sometimes return incorrect result.
+      </action>
     </release>
     <release version="2.13.0" date="2019-12-11" description="GA Release 2.13.0">
       <action issue="LOG4J2-2058" dev="rgoers" type="fix">