This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch LOG4J2-2644-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/LOG4J2-2644-2.x by this push:
new dd28ef5 LOG4J2-2575 - CronExpression.getBeforeTime() would sometimes
return incorrect result
dd28ef5 is described below
commit dd28ef5ad473e4228ddb016a083251521c24e523
Author: Ralph Goers <[email protected]>
AuthorDate: Sun Jul 14 17:46:28 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..445d63d 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..c7966cf 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,7 +18,9 @@ package org.apache.logging.log4j.core.util;
import org.junit.Test;
+import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.Calendar;
import java.util.GregorianCalendar;
import static org.junit.Assert.*;
@@ -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 a5af9e5..60d3957 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -30,6 +30,9 @@
- "remove" - Removed
-->
<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>