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
+}