Details
diff --git a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/messagedialog.vm b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/messagedialog.vm
index 347ab5e..6c73546 100644
--- a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/messagedialog.vm
+++ b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/messagedialog.vm
@@ -14,7 +14,7 @@
* the License.
*#
- <script type="text/javascript" src="${context}/js/azkaban/view/message-dialog.js"></script>
+ <script type="text/javascript" src="${context}/js/azkaban/view/message-dialog.js?version=20161031"></script>
<div class="modal" id="azkaban-message-dialog">
<div class="modal-dialog">
diff --git a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/schedulepanel.vm b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/schedulepanel.vm
index 8a596b0..ab7c0d5 100644
--- a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/schedulepanel.vm
+++ b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/schedulepanel.vm
@@ -14,8 +14,8 @@
* the License.
*#
-<script type="text/javascript" src="${context}/js/azkaban/util/date.js?version=20161003"></script>
-<script type="text/javascript" src="${context}/js/azkaban/view/schedule-panel.js?version=20161003"></script>
+<script type="text/javascript" src="${context}/js/azkaban/util/date.js?version=20161031"></script>
+<script type="text/javascript" src="${context}/js/azkaban/view/schedule-panel.js?version=20161031"></script>
<script type="text/javascript" src="${context}/js/moment.min.js" ></script>
<script type="text/javascript" src="${context}/js/later.min.js"></script>
<script type="text/javascript" src="${context}/js/moment-timezone-with-data-2010-2020.min.js"></script>
diff --git a/azkaban-web-server/src/web/js/azkaban/test/test.js b/azkaban-web-server/src/web/js/azkaban/test/test.js
index eb1f95b..ee006a2 100644
--- a/azkaban-web-server/src/web/js/azkaban/test/test.js
+++ b/azkaban-web-server/src/web/js/azkaban/test/test.js
@@ -50,3 +50,23 @@ describe('CronTransformation', function() {
assert.equal(testStrFromCronToQuartz('0 3 * * 1,3-5 2016'), '0 3 * * 0,2-4 2016');
});
});
+
+//Test the Validity of a Quartz Cron String
+describe('ValidateQuartzStr', function() {
+
+ var validateQuartzStr = dateJs.__get__('validateQuartzStr');
+
+ it('validate Quartz String corretly', function() {
+
+ assert.equal(validateQuartzStr('0 3 * * 5'), 'NUM_FIELDS_ERROR');
+ assert.equal(validateQuartzStr('0 3 * *'), 'NUM_FIELDS_ERROR');
+ assert.equal(validateQuartzStr('0 3 * * 5 23 3 2017'), 'NUM_FIELDS_ERROR');
+ assert.equal(validateQuartzStr('0 3 * * 5 *'), 'DOW_DOM_STAR_ERROR');
+ assert.equal(validateQuartzStr('0 3 * * 5 *'), 'DOW_DOM_STAR_ERROR');
+ assert.equal(validateQuartzStr('0 3 * 5 5 * 2019'), 'DOW_DOM_STAR_ERROR');
+ assert.equal(validateQuartzStr('0 3 * 5 5 ? 2018'), 'VALID');
+ assert.equal(validateQuartzStr('0 3 * ? 5 FRI'), 'VALID');
+ assert.equal(validateQuartzStr('0 3 * ? 5 3-6'), 'VALID');
+
+ });
+});
diff --git a/azkaban-web-server/src/web/js/azkaban/util/date.js b/azkaban-web-server/src/web/js/azkaban/util/date.js
index 0243286..ff199b0 100644
--- a/azkaban-web-server/src/web/js/azkaban/util/date.js
+++ b/azkaban-web-server/src/web/js/azkaban/util/date.js
@@ -94,6 +94,22 @@ var getTwoDigitStr = function(value) {
return value;
}
+// Verify if a cron String meets the requirement of Quartz Cron Expression.
+var validateQuartzStr = function (str){
+ var res = str.split(" "), len=res.length;
+
+ // A valid Quartz Cron Expression should have 6 or 7 fields.
+ if(len<6 || len>=8) return "NUM_FIELDS_ERROR";
+
+ // Quartz currently doesn't support specifying both a day-of-week and a day-of-month value
+ // (you must currently use the ‘?’ character in one of these fields).
+ // http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html#notes
+ if(res[3] != '?' && res[5] != '?') return "DOW_DOM_STAR_ERROR";
+
+ //valid string
+ return "VALID";
+}
+
var modifyStrToUnixCronSyntax = function (str){
return str.replace(/[0-7]/g, function upperToHyphenLower(match) {
return (parseInt(match)+6)%7;
diff --git a/azkaban-web-server/src/web/js/azkaban/view/message-dialog.js b/azkaban-web-server/src/web/js/azkaban/view/message-dialog.js
index d13671f..d4db850 100644
--- a/azkaban-web-server/src/web/js/azkaban/view/message-dialog.js
+++ b/azkaban-web-server/src/web/js/azkaban/view/message-dialog.js
@@ -26,7 +26,7 @@ azkaban.MessageDialogView = Backbone.View.extend({
show: function(title, message, callback) {
$("#azkaban-message-dialog-title").text(title);
- $("#azkaban-message-dialog-text").text(message);
+ $("#azkaban-message-dialog-text").html(message);
this.callback = callback;
$(this.el).on('hidden.bs.modal', function() {
if (callback) {
diff --git a/azkaban-web-server/src/web/js/azkaban/view/schedule-panel.js b/azkaban-web-server/src/web/js/azkaban/view/schedule-panel.js
index a2c28ec..16a7a5e 100644
--- a/azkaban-web-server/src/web/js/azkaban/view/schedule-panel.js
+++ b/azkaban-web-server/src/web/js/azkaban/view/schedule-panel.js
@@ -56,6 +56,16 @@ azkaban.SchedulePanelView = Backbone.View.extend({
console.log("current Time = " + scheduleDate + " " + scheduleTime );
console.log("cronExpression = " + scheduleData.cronExpression);
+ var retSignal = validateQuartzStr(scheduleData.cronExpression);
+
+ if(retSignal == "NUM_FIELDS_ERROR") {
+ messageDialogView.show("Cron Syntax Error", "A valid Quartz Cron Expression should have 6 or 7 fields.");
+ return;
+ } else if (retSignal == "DOW_DOM_STAR_ERROR") {
+ messageDialogView.show("Cron Syntax Error", "Currently Quartz doesn't support specifying both a day-of-week and a day-of-month value"
+ + "(you must use the ‘?’ character in one of these fields). <a href=\"http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html\">Detailed Explanation</a>");
+ return;
+ }
var successHandler = function(data) {
if (data.error) {