You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ke...@apache.org on 2022/01/18 02:44:38 UTC
[dolphinscheduler] branch dev updated: [Bug-8053] Fix CronUtils.getMaxCycle return null (#8086)
This is an automated email from the ASF dual-hosted git repository.
kerwin pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new e0a99dd [Bug-8053] Fix CronUtils.getMaxCycle return null (#8086)
e0a99dd is described below
commit e0a99dd9093dacd161512535b0046699f3cf26af
Author: springmonster <ch...@163.com>
AuthorDate: Tue Jan 18 10:44:30 2022 +0800
[Bug-8053] Fix CronUtils.getMaxCycle return null (#8086)
---
.../service/quartz/cron/AbstractCycle.java | 10 ++++
.../service/quartz/cron/CronUtils.java | 7 +--
.../service/quartz/cron/CycleFactory.java | 57 ++++++++++++++++++++++
.../service/quartz/cron/CronUtilsTest.java | 26 +++++++++-
4 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/AbstractCycle.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/AbstractCycle.java
index 60c8623..b00f147 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/AbstractCycle.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/AbstractCycle.java
@@ -173,6 +173,16 @@ public abstract class AbstractCycle {
FieldExpression dayOfWeekFieldExpression = dayOfWeekField.getExpression();
return (dayOfWeekFieldExpression instanceof Every || dayOfWeekFieldExpression instanceof Always);
}
+
+ /**
+ * whether the year field has a value of every or always
+ *
+ * @return if year field has a value of every or always return true,else return false
+ */
+ protected boolean yearFieldIsEvery() {
+ FieldExpression yearFieldExpression = yearField.getExpression();
+ return (yearFieldExpression instanceof Every || yearFieldExpression instanceof Always);
+ }
/**
* get cycle enum
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
index d784722..49810cd 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
@@ -22,6 +22,7 @@ import static org.apache.dolphinscheduler.service.quartz.cron.CycleFactory.hour;
import static org.apache.dolphinscheduler.service.quartz.cron.CycleFactory.min;
import static org.apache.dolphinscheduler.service.quartz.cron.CycleFactory.month;
import static org.apache.dolphinscheduler.service.quartz.cron.CycleFactory.week;
+import static org.apache.dolphinscheduler.service.quartz.cron.CycleFactory.year;
import static com.cronutils.model.CronType.QUARTZ;
@@ -90,7 +91,7 @@ public class CronUtils {
* @return CycleEnum
*/
public static CycleEnum getMaxCycle(Cron cron) {
- return min(cron).addCycle(hour(cron)).addCycle(day(cron)).addCycle(week(cron)).addCycle(month(cron)).getCycle();
+ return min(cron).addCycle(hour(cron)).addCycle(day(cron)).addCycle(week(cron)).addCycle(month(cron)).addCycle(year(cron)).getCycle();
}
/**
@@ -100,7 +101,7 @@ public class CronUtils {
* @return CycleEnum
*/
public static CycleEnum getMiniCycle(Cron cron) {
- return min(cron).addCycle(hour(cron)).addCycle(day(cron)).addCycle(week(cron)).addCycle(month(cron)).getMiniCycle();
+ return min(cron).addCycle(hour(cron)).addCycle(day(cron)).addCycle(week(cron)).addCycle(month(cron)).addCycle(year(cron)).getMiniCycle();
}
/**
@@ -186,7 +187,7 @@ public class CronUtils {
*/
public static List<Date> getSelfFireDateList(final Date startTime, final Date endTime, final List<Schedule> schedules) {
List<Date> result = new ArrayList<>();
- if(startTime.equals(endTime)){
+ if (startTime.equals(endTime)) {
result.add(startTime);
return result;
}
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CycleFactory.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CycleFactory.java
index 1f807dc..9f931d2 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CycleFactory.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CycleFactory.java
@@ -72,6 +72,15 @@ public class CycleFactory {
public static AbstractCycle month(Cron cron) {
return new MonthCycle(cron);
}
+
+ /**
+ * year
+ * @param cron cron
+ * @return AbstractCycle
+ */
+ public static AbstractCycle year(Cron cron) {
+ return new YearCycle(cron);
+ }
/**
* day cycle
@@ -275,4 +284,52 @@ public class CycleFactory {
return null;
}
}
+
+ /**
+ * year cycle
+ */
+ public static class YearCycle extends AbstractCycle {
+ public YearCycle(Cron cron) {
+ super(cron);
+ }
+
+ /**
+ * get cycle
+ * @return CycleEnum
+ */
+ @Override
+ protected CycleEnum getCycle() {
+ boolean flag = (minFiledIsSetAll()
+ && hourFiledIsSetAll()
+ && dayOfMonthFieldIsSetAll()
+ && dayOfWeekField.getExpression() instanceof QuestionMark
+ && monthFieldIsSetAll())
+ && yearFieldIsEvery() ||
+ (minFiledIsSetAll()
+ && hourFiledIsSetAll()
+ && dayOfMonthField.getExpression() instanceof QuestionMark
+ && dayofWeekFieldIsSetAll()
+ && monthFieldIsSetAll()
+ && yearFieldIsEvery());
+
+ if (flag) {
+ return CycleEnum.YEAR;
+ }
+
+ return null;
+ }
+
+ /**
+ * get mini cycle
+ * @return CycleEnum
+ */
+ @Override
+ protected CycleEnum getMiniCycle() {
+ if (yearFieldIsEvery()) {
+ return CycleEnum.YEAR;
+ }
+
+ return null;
+ }
+ }
}
diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtilsTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtilsTest.java
index 55cc19d..4fbcd8f 100644
--- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtilsTest.java
+++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtilsTest.java
@@ -95,6 +95,20 @@ public class CronUtilsTest {
CycleEnum cycleEnum3 = CronUtils.getMiniCycle(CronUtils.parse2Cron("0 * * * * ? *"));
Assert.assertEquals("MINUTE", cycleEnum3.name());
+
+ CycleEnum cycleEnum4 = CronUtils.getMaxCycle(CronUtils.parse2Cron("0 0 7 * 1 ? *"));
+ Assert.assertEquals("YEAR", cycleEnum4.name());
+ cycleEnum4 = CronUtils.getMiniCycle(CronUtils.parse2Cron("0 0 7 * 1 ? *"));
+ Assert.assertEquals("DAY", cycleEnum4.name());
+
+ CycleEnum cycleEnum5 = CronUtils.getMaxCycle(CronUtils.parse2Cron("0 0 7 * 1/1 ? *"));
+ Assert.assertEquals("MONTH", cycleEnum5.name());
+
+ CycleEnum cycleEnum6 = CronUtils.getMaxCycle(CronUtils.parse2Cron("0 0 7 * 1-2 ? *"));
+ Assert.assertEquals("YEAR", cycleEnum6.name());
+
+ CycleEnum cycleEnum7 = CronUtils.getMaxCycle(CronUtils.parse2Cron("0 0 7 * 1,2 ? *"));
+ Assert.assertEquals("YEAR", cycleEnum7.name());
}
/**
@@ -113,7 +127,7 @@ public class CronUtilsTest {
.instance();
// minute cycle
String[] cronArayy = new String[]{"* * * * * ? *","* 0 * * * ? *",
- "* 5 * * 3/5 ? *","0 0 * * * ? *"};
+ "* 5 * * 3/5 ? *","0 0 * * * ? *", "0 0 7 * 1 ? *", "0 0 7 * 1/1 ? *", "0 0 7 * 1-2 ? *" , "0 0 7 * 1,2 ? *"};
for(String minCrontab:cronArayy){
if (!org.quartz.CronExpression.isValidExpression(minCrontab)) {
throw new RuntimeException(minCrontab+" verify failure, cron expression not valid");
@@ -155,6 +169,14 @@ public class CronUtilsTest {
logger.info("dayOfWeekField instanceof On:"+(dayOfWeekField.getExpression() instanceof On));
logger.info("dayOfWeekField instanceof And:"+(dayOfWeekField.getExpression() instanceof And));
logger.info("dayOfWeekField instanceof QuestionMark:"+(dayOfWeekField.getExpression() instanceof QuestionMark));
+
+ CronField yearField = cron.retrieve(CronFieldName.YEAR);
+ logger.info("yearField instanceof Between:"+(yearField.getExpression() instanceof Between));
+ logger.info("yearField instanceof Always:"+(yearField.getExpression() instanceof Always));
+ logger.info("yearField instanceof Every:"+(yearField.getExpression() instanceof Every));
+ logger.info("yearField instanceof On:"+(yearField.getExpression() instanceof On));
+ logger.info("yearField instanceof And:"+(yearField.getExpression() instanceof And));
+ logger.info("yearField instanceof QuestionMark:"+(yearField.getExpression() instanceof QuestionMark));
CycleEnum cycleEnum = CronUtils.getMaxCycle(minCrontab);
if(cycleEnum !=null){
@@ -204,4 +226,4 @@ public class CronUtilsTest {
expirationTime = CronUtils.getExpirationTime(startTime, CycleEnum.YEAR);
Assert.assertEquals("2020-02-07 18:30:00", DateUtils.dateToString(expirationTime));
}
-}
\ No newline at end of file
+}