This is an automated email from the ASF dual-hosted git repository. kerwin pushed a commit to branch 3.1.6-prepare in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
commit 298091bf3b64dd7a2ab648ca701a256a44e79bc0 Author: 旺阳 <[email protected]> AuthorDate: Sun Apr 9 12:50:42 2023 +0800 cherry-pick [Bug] [Cron] Parse corn expression error#13841 --- .../service/impl/ProcessDefinitionServiceImpl.java | 5 +++-- .../api/service/impl/SchedulerServiceImpl.java | 8 ++++---- .../dolphinscheduler/service/cron/CronUtils.java | 20 +++++++++++++++++++- .../dolphinscheduler/service/cron/CronUtilsTest.java | 6 ++++++ 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java index 26410f9a56..30916f15a5 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java @@ -111,6 +111,7 @@ import org.apache.dolphinscheduler.plugin.task.api.enums.TaskTimeoutStrategy; import org.apache.dolphinscheduler.plugin.task.api.model.Property; import org.apache.dolphinscheduler.plugin.task.api.parameters.ParametersNode; import org.apache.dolphinscheduler.plugin.task.api.parameters.SqlParameters; +import org.apache.dolphinscheduler.service.cron.CronUtils; import org.apache.dolphinscheduler.service.model.TaskNode; import org.apache.dolphinscheduler.service.process.ProcessService; import org.apache.dolphinscheduler.service.task.TaskPluginManager; @@ -2368,8 +2369,8 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME); return result; } - if (!org.quartz.CronExpression.isValidExpression(scheduleObj.getCrontab())) { - logger.error("{} verify failure", scheduleObj.getCrontab()); + if (!CronUtils.isValidExpression(scheduleObj.getCrontab())) { + log.error("CronExpression verify failure, cron:{}.", scheduleObj.getCrontab()); putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, scheduleObj.getCrontab()); return result; } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java index c3eada0bea..1b63c52623 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java @@ -177,9 +177,8 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe scheduleObj.setStartTime(scheduleParam.getStartTime()); scheduleObj.setEndTime(scheduleParam.getEndTime()); - if (!org.quartz.CronExpression.isValidExpression(scheduleParam.getCrontab())) { - logger.error("{} verify failure", scheduleParam.getCrontab()); - + if (!CronUtils.isValidExpression(scheduleParam.getCrontab())) { + logger.error("Schedule crontab verify failure, crontab:{}.", scheduleParam.getCrontab()); putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, scheduleParam.getCrontab()); return result; } @@ -664,7 +663,8 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe schedule.setStartTime(scheduleParam.getStartTime()); schedule.setEndTime(scheduleParam.getEndTime()); - if (!org.quartz.CronExpression.isValidExpression(scheduleParam.getCrontab())) { + if (!CronUtils.isValidExpression(scheduleParam.getCrontab())) { + logger.error("Schedule crontab verify failure, crontab:{}.", scheduleParam.getCrontab()); putMsg(result, Status.SCHEDULE_CRON_CHECK_FAILED, scheduleParam.getCrontab()); return; } diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java index b6c236f24e..11869ea943 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java +++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java @@ -80,11 +80,29 @@ public class CronUtils { public static Cron parse2Cron(String cronExpression) throws CronParseException { try { return QUARTZ_CRON_PARSER.parse(cronExpression); - } catch (Exception ex) { + } catch (IllegalArgumentException ex) { throw new CronParseException(String.format("Parse corn expression: [%s] error", cronExpression), ex); } } + /** + * Indicates whether the specified cron expression can be parsed into a + * valid cron expression + * + * @param cronExpression the expression to evaluate + * @return a boolean indicating whether the given expression is a valid cron + * expression + */ + public static boolean isValidExpression(String cronExpression) { + try { + parse2Cron(cronExpression); + } catch (CronParseException e) { + return false; + } + + return true; + } + /** * get max cycle * diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java index 1e2b2548eb..c94d63983f 100644 --- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java +++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java @@ -237,4 +237,10 @@ public class CronUtilsTest { expirationTime = CronUtils.getExpirationTime(startTime, CycleEnum.YEAR); Assert.assertEquals("2020-02-07 18:30:00", DateUtils.dateToString(expirationTime)); } + + @Test + public void testValid() { + Assertions.assertFalse(CronUtils.isValidExpression("0 0 13/0 * * ? *")); + Assertions.assertTrue(CronUtils.isValidExpression("0 0 13-0 * * ? *")); + } }
