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