Name

sn_agent.CronExpValidator

Description

No description available

Script

var CronExpValidator = Class.create();
CronExpValidator.prototype = {
  ERROR_MSGES: {
      DAY_OF_WEEK_ERROR_MSG_1: gs.getMessage('Day-of-Week values must be between 1 and 7'),
      DAY_OF_WEEK_ERROR_MSG_2: gs.getMessage('Day-of-Week values must be SUN, MON, TUE, WED, THU, FRI, SAT OR between 1 and 7, - * ? /'),
      DAY_OF_WEEK_ERROR_MSG_3: gs.getMessage('(Day of week) - Unsupported value for field. Possible values are 1-7 or SUN-SAT , - * ? /'),
      DAY_OF_WEEK_ERROR_MSG_4: gs.getMessage('A numeric value between 1 and 5 must follow the # option'),

      DAY_OF_MONTH_ERROR_MSG_1: gs.getMessage('Day of month values must be between 1 and 31'),
      DAY_OF_MONTH_ERROR_MSG_2: gs.getMessage('Offset from last day must be <= 30'),

      MONTH_ERROR_MSG: gs.getMessage('Month values must be between 1 and 12'),
      MONTH_LETTER_ERROR_MSG: gs.getMessage('Month values must be JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC OR between 1 and 12'),

      TIME_ERROR_MSG: gs.getMessage('Minute and Second values must be between 0 and 59 and Hour Values must be between 0 and 23'),

      DAY_OF_MONTH_DAY_OF_WEEK_ERROR_MSG: gs.getMessage('? should be specfied for Day-of-Month -OR- Day-of-Week'),

      UNEXPECTED_ERROR_MSG: gs.getMessage('Unexpected end of expression'),

      LENGTH_ERROR_MSG: gs.getMessage('Expression must have exactly 6 fields: [Second Minute Hour Day-of-Month Month Day-of-Week]'),

      INVALID_CHAR_MSG: gs.getMessage("Backslash char '\\' is not supported"),

      EMPTY_CRON_MSG: gs.getMessage("Expression must not be empty")
  },

  initialize: function() {
      this.MONTH_LIST = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
      this.WEEK_ARRRAY = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
      this.MAX_MIN_SEC_VALUE = 59;
      this.MAX_HOUR_VALUE = 23;
      this.isError = false;
      this.errorMsg = [];
  },

  isValidCronExpression: function(cronExpression) {
      var errorObj = {};
      errorObj.error = true;

      if (gs.nil(cronExpression))
          return {
              isValid: false,
              errorMessage: [this.ERROR_MSGES.EMPTY_CRON_MSG]
          };

      if (!/\s/g.test(cronExpression)) {
          return {
              isValid: false,
              errorMessage: [this.ERROR_MSGES.UNEXPECTED_ERROR_MSG],
          };
      }

      if (cronExpression.contains("\\")) {
          return {
              isValid: false,
              errorMessage: [this.ERROR_MSGES.INVALID_CHAR_MSG],
          };
      }

      var cronArray = cronExpression.split(" ");

      if (parseInt(cronArray.length) !== 6) {
          return {
              isValid: false,
              errorMessage: [this.ERROR_MSGES.LENGTH_ERROR_MSG],
          };
      }

      var seconds = cronArray[0].trim();
      var minutes = cronArray[1].trim();
      var hours = cronArray[2].trim();
      var dayOfMonth = cronArray[3].trim();
      var month = cronArray[4].trim();
      var dayOfWeek = cronArray[5].trim();

      var isValidSeconds = this.isValidTimeValue(seconds, this.MAX_MIN_SEC_VALUE);
      var isValidMinutes = this.isValidTimeValue(minutes, this.MAX_MIN_SEC_VALUE);
      var isValidHour = this.isValidTimeValue(hours, this.MAX_HOUR_VALUE);
      var isValidDayOfMonth = this.isValidDayOfMonthValue(dayOfMonth, dayOfWeek);
      var isValidMonth = this.isValidMonthValue(month);
      var isValidDayOfWeek = this.isValidDayOfWeekValue(dayOfWeek, dayOfMonth);

      var isValidCron = isValidSeconds && isValidMinutes && isValidHour && isValidDayOfMonth && isValidMonth && isValidDayOfWeek;
      if (errorObj && errorObj.error && this.isError && !isValidCron) {
          return {
              isValid: isValidCron,
              errorMessage: this.errorMsg,
          };
      } else {
          return isValidCron;
      }
  },

  isValidDayOfWeekValue: function(dayOfWeek, dayOfMonth) {

      //our go parser is not supporting L/#
      var lowDayOfWeek = dayOfWeek.toLowerCase();
      if (lowDayOfWeek.indexOf('l') > -1 || lowDayOfWeek.indexOf('#') > -1) {
          this.isError = true;
          this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_2);
          return false;
      }

      if ((dayOfWeek === '*' && dayOfMonth !== '*') || (dayOfWeek === '?' && dayOfMonth !== '?')) {
          return true;
      }
      if (dayOfWeek === '*') {
          return dayOfMonth !== '*';
      } else if ((dayOfWeek.indexOf('/') > -1) && dayOfMonth === '?') {
          var startingDayOfWeekOptionArr = dayOfWeek.split('/');
          if (!this.isValidateMonthNo([startingDayOfWeekOptionArr[0]], 1, 7)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_1);
          }
          if (!this.isValidateMonthNo([startingDayOfWeekOptionArr[1]], 0, 7)) {
              this.isError = true;
              this.errorMsg.push(gs.getMessage('Expression {0} is not a valid increment value. Accepted values are 0-7', startingDayOfWeekOptionArr[1]));
          }
          return this.isValidateMonthNo([startingDayOfWeekOptionArr[0]], 1, 7) && this.isValidateMonthNo([startingDayOfWeekOptionArr[1]], 0, 7);
      } else if ((dayOfWeek.indexOf('-') > -1) && dayOfMonth === '?') {
          var dayOfWeekRangeArr = dayOfWeek.split('-');
          if (!isNaN(parseInt(dayOfWeekRangeArr[0])) && !isNaN(parseInt(dayOfWeekRangeArr[1])) && !this.isValidateMonthNo(dayOfWeekRangeArr, 1, 7)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_1);
          }
          if (isNaN(parseInt(dayOfWeekRangeArr[0])) && isNaN(parseInt(dayOfWeekRangeArr[1])) && !this.isValidateMonthStr(dayOfWeekRangeArr, this.WEEK_ARRRAY)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_2);
          }
          return !isNaN(parseInt(dayOfWeekRangeArr[0])) && !isNaN(parseInt(dayOfWeekRangeArr[1])) ?
              this.isValidateMonthNo(dayOfWeekRangeArr, 1, 7) : this.isValidateMonthStr(dayOfWeekRangeArr, this.WEEK_ARRRAY);
      } else if ((dayOfWeek.indexOf(',') > -1) && dayOfMonth === '?') {
          var multiDayOfWeekArr = dayOfWeek.split(',');
          if (!isNaN(parseInt(multiDayOfWeekArr[0])) && !this.isValidateMonthNo(multiDayOfWeekArr, 1, 7)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_1);
          }
          if (isNaN(parseInt(multiDayOfWeekArr[0])) && !this.isValidateMonthStr(multiDayOfWeekArr, this.WEEK_ARRRAY)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_2);
          }
          return !isNaN(parseInt(multiDayOfWeekArr[0])) ?
              this.isValidateMonthNo(multiDayOfWeekArr, 1, 7) : this.isValidateMonthStr(multiDayOfWeekArr, this.WEEK_ARRRAY);
      } else if ((dayOfWeek.indexOf('#') > -1) && dayOfMonth === '?') {
          var weekdayOfMonthArr = dayOfWeek.split('#');
          if (!this.isValidateMonthNo([weekdayOfMonthArr[0]], 1, 7)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_3);
          }
          if (!this.isValidateMonthNo([weekdayOfMonthArr[1]], 1, 5)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_4);
          }
          return this.isValidateMonthNo([weekdayOfMonthArr[0]], 1, 7) && this.isValidateMonthNo([weekdayOfMonthArr[1]], 1, 5);
      } else if (typeof dayOfWeek === 'string' && dayOfMonth === '?') {
          if (!isNaN(parseInt(dayOfWeek)) && !this.isValidateMonthNo([dayOfWeek], 1, 7)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_1);
          }
          if (isNaN(parseInt(dayOfWeek)) && !this.isValidateMonthStr([dayOfWeek], this.WEEK_ARRRAY)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_2);
          }
          return !isNaN(parseInt(dayOfWeek)) ?
              this.isValidateMonthNo([dayOfWeek], 1, 7) : this.isValidateMonthStr([dayOfWeek], this.WEEK_ARRRAY);
      } else {
          this.isError = true;
          if (this.isInvalidValues(dayOfWeek, dayOfMonth) && !this.isHasErrorMsg(this.errorMsg)) {
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_DAY_OF_WEEK_ERROR_MSG);
          } else {
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_WEEK_ERROR_MSG_2);
          }
          return false;
      }
  },

  isInvalidValues: function(dayOfWeek, dayOfMonth) {
      var isAll = dayOfWeek === '*' && dayOfMonth === '*';
      var isAny = dayOfWeek === '?' && dayOfMonth === '?';
      var dayOfWeekAndMonth = dayOfWeek !== "?" && dayOfMonth === '*';
      return isAll || isAny || dayOfWeekAndMonth;
  },

  isHasErrorMsg: function(array) {
      return array.indexOf(this.ERROR_MSGES.DAY_OF_MONTH_DAY_OF_WEEK_ERROR_MSG) > -1;
  },

  isValidDayOfMonthValue: function(dayOfMonth, dayOfWeek) {
      //our go parser is not supporting L W
      var lowDayOfMonth = dayOfMonth.toLowerCase();
      if (lowDayOfMonth.indexOf('l') > -1 || lowDayOfMonth.indexOf('w') > -1) {
          this.isError = true;
          this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          return false;
      }
      var isNotLastDays = !(lowDayOfMonth.indexOf('l') > -1) || !lowDayOfMonth === 'lw';
      if ((dayOfMonth === '*' && dayOfWeek !== '*') || (dayOfMonth === '?' && dayOfWeek !== '?')) {
          return true;
      } else if ((dayOfMonth.indexOf('/') > -1) && dayOfWeek === '?') {
          var startingDayOfMonthOptionArr = dayOfMonth.split('/');
          if (!this.isValidateMonthNo([startingDayOfMonthOptionArr[0]], 1, 31 && !startingDayOfMonthOptionArr[0] === '*')) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          }
          if (!this.isValidateMonthNo([startingDayOfMonthOptionArr[1]], 0, 31)) {
              this.isError = true;
              this.errorMsg.push(gs.getMessage("(Day of month) - Expression {0} is not a valid increment value. Accepted values are 0-31", startingDayOfMonthOptionArr[1]));
          }
          var isValidElements = this.isValidateMonthNo([startingDayOfMonthOptionArr[0]], 1, 31) && this.isValidateMonthNo([startingDayOfMonthOptionArr[1]], 0, 31);
          var isValidFirstElem = startingDayOfMonthOptionArr[0] === '*' && this.isValidateMonthNo([startingDayOfMonthOptionArr[1]], 0, 31);
          return isValidElements || isValidFirstElem;
      } else if ((dayOfMonth.indexOf('-') > -1) && dayOfWeek === '?') {
          var dayOfMonthRangeArr = dayOfMonth.split('-');
          var isLastDayIncludes = dayOfMonthRangeArr[0] === 'L' && this.isValidateMonthNo([dayOfMonthRangeArr[1]], 1, 30);
          if (!isLastDayIncludes) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_2);
          }
          if (!this.isValidateMonthNo(dayOfMonthRangeArr, 1, 31) && dayOfMonthRangeArr[0] !== 'L') {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          }
          return this.isValidateMonthNo(dayOfMonthRangeArr, 1, 31) || isLastDayIncludes;
      } else if ((dayOfMonth.indexOf(',') > -1) && dayOfWeek === '?') {
          var multiDayOfMonthArr = dayOfMonth.split(',');
          if (!this.isValidateMonthNo(multiDayOfMonthArr, 1, 31)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          }
          return this.isValidateMonthNo(multiDayOfMonthArr, 1, 31);
      } else if (typeof dayOfMonth === 'string' && dayOfWeek === '?' && (dayOfMonth.toLowerCase() === 'l' || dayOfMonth.toLowerCase() === 'lw')) {
          return true;
      } else if (typeof dayOfMonth === 'string' && dayOfWeek === '?' && dayOfMonth !== '?' && isNotLastDays) {
          if (parseInt(dayOfMonth) < 1 && parseInt(dayOfMonth) > 31) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          }
          return parseInt(dayOfMonth) >= 1 && parseInt(dayOfMonth) <= 31;
      } else {
          this.isError = true;
          if (this.isInvalidValues(dayOfWeek, dayOfMonth) && !this.isHasErrorMsg(this.errorMsg)) {
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_DAY_OF_WEEK_ERROR_MSG);
          } else {
              this.errorMsg.push(this.ERROR_MSGES.DAY_OF_MONTH_ERROR_MSG_1);
          }
          return false;
      }
  },

  isValidateMonthNo: function(monthArr, val, endVal) {
      return monthArr.every(function(month) {
          return parseInt(month) >= val && parseInt(month) <= endVal;
      });
  },

  isValidateMonthStr: function(monthArr, dataArr) {
      return monthArr.every(function(month) {
          return dataArr.indexOf(month.toLowerCase()) > -1;
      });
  },

  isValidMonthValue: function(month) {

      if (month === '*') {
          return true;
      } else if (month.indexOf('/') > -1) {
          var startingMonthOptionArr = month.split('/');
          if (!this.isValidateMonthNo([startingMonthOptionArr[0]], 1, 12)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_ERROR_MSG);
          }
          if (!this.isValidateMonthNo([startingMonthOptionArr[1]], 0, 12)) {
              this.isError = true;
              this.errorMsg.push(gs.getMessage('(Month) - Expression {0} is not a valid increment value. Accepted values are 0-12', startingMonthOptionArr[1]));
          }
          return this.isValidateMonthNo([startingMonthOptionArr[0]], 1, 12) && this.isValidateMonthNo([startingMonthOptionArr[1]], 0, 12);
      } else if (month.indexOf('-') > -1) {
          var monthRangeArr = month.split('-');
          if (!isNaN(parseInt(monthRangeArr[0])) && !isNaN(parseInt(monthRangeArr[1])) && !this.isValidateMonthNo(monthRangeArr, 1, 12)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_ERROR_MSG);
          }
          if (isNaN(parseInt(monthRangeArr[0])) && isNaN(parseInt(monthRangeArr[1])) && !this.isValidateMonthStr(monthRangeArr, this.MONTH_LIST)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_LETTER_ERROR_MSG);
          }
          return !isNaN(parseInt(monthRangeArr[0])) && !isNaN(parseInt(monthRangeArr[1])) ?
              this.isValidateMonthNo(monthRangeArr, 1, 12) : this.isValidateMonthStr(monthRangeArr, this.MONTH_LIST);
      } else if (month.indexOf(',') > -1) {
          var multiMonthArr = month.split(',');
          if (!isNaN(parseInt(multiMonthArr[0])) && !this.isValidateMonthNo(multiMonthArr, 1, 12)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_ERROR_MSG);
          }
          if (isNaN(parseInt(multiMonthArr[0])) && this.isValidateMonthStr(multiMonthArr, this.MONTH_LIST)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_LETTER_ERROR_MSG);
          }
          return !isNaN(parseInt(multiMonthArr[0])) ?
              this.isValidateMonthNo(multiMonthArr, 1, 12) : this.isValidateMonthStr(multiMonthArr, this.MONTH_LIST);
      } else if (typeof month === 'string') {
          if (!isNaN(parseInt(month)) && !this.isValidateMonthNo([month], 1, 12)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_ERROR_MSG);
          }
          if (isNaN(parseInt(month)) && !this.isValidateMonthStr([month], this.MONTH_LIST)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.MONTH_LETTER_ERROR_MSG);
          }
          return !isNaN(parseInt(month)) ?
              this.isValidateMonthNo([month], 1, 12) : this.isValidateMonthStr([month], this.MONTH_LIST);
      } else {
          this.isError = true;
          this.errorMsg.push(this.ERROR_MSGES.MONTH_LETTER_ERROR_MSG);
          return false;
      }
  },

  isValidTimeValue: function(time, val) {
      if (time === '*' || time === "0") {
          return true;
      } else if (time.indexOf('/') > -1) {
          var startingSecOptionArr = time.split('/');
          var isValidStartingSecOptionArr = this.isValidateTime(startingSecOptionArr, val) || (startingSecOptionArr[0] === '*' && this.isValidateTime([startingSecOptionArr[1]], val));
          if (!isValidStartingSecOptionArr) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.TIME_ERROR_MSG);
          }
          return isValidStartingSecOptionArr;
      } else if (time.indexOf('-') > -1) {
          var secRangeArr = time.split('-');
          if (!this.isValidateTime(secRangeArr, val)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.TIME_ERROR_MSG);
          }
          return this.isValidateTime(secRangeArr, val);
      } else if (time.indexOf(',') > -1) {
          var multiSecArr = time.split(',');
          if (!this.isValidateTime(multiSecArr, val)) {
              this.isError = true;
              this.errorMsg.push(this.ERROR_MSGES.TIME_ERROR_MSG);
          }
          return this.isValidateTime(multiSecArr, val);
      } else if (parseInt(time) >= 0 && parseInt(time) <= val) {
          return true;
      } else {
          this.isError = true;
          this.errorMsg.push(this.ERROR_MSGES.TIME_ERROR_MSG);
          return false;
      }
  },

  isValidateTime: function(dataArray, value) {
      return dataArray.every(function(element) {
          return element >= 0 && element <= value;
      });
  },

  type: 'CronExpValidator'
};

Sys ID

9df9f994b7662010ff78dc55ce11a938

Offical Documentation

Official Docs: