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">