azkaban-aplcache

make later.js outupt compatible with quartz by changing WOD

9/16/2016 3:59:15 PM

Details

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 3f373eb..32a884b 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
@@ -41,31 +41,31 @@
             </div>
             <div class="form-group">
               <div class="col-sm-6">
-                <label class="col-sm-3 control-label" id="min_label">Min</label>
-                <div class="col-sm-9">
+                <label class="col-sm-4 control-label" id="min_label">Min</label>
+                <div class="col-sm-8">
                   <input type="text" id="minute_input" value="0" class="form-control" oninput="updateOutput()">
                 </div>
                 <br/> <br/> <br/>
-                <label class="col-sm-3 control-label" id="hour_label">Hours</label>
-                <div class="col-sm-9">
+                <label class="col-sm-4 control-label" id="hour_label">Hours</label>
+                <div class="col-sm-8">
                   <input type="text" id="hour_input" value="5,7-10" class="form-control"
                          oninput="updateOutput()">
                 </div>
                 <br/> <br/> <br/>
-                <label class="col-sm-3 control-label" id="dom_label">DOM</label>
-                <div class="col-sm-9">
+                <label class="col-sm-4 control-label" id="dom_label" style="margin-top:-8px">Day of Month</label>
+                <div class="col-sm-8">
                   <input type="text" id="dom_input" value="?" class="form-control"
                          oninput="updateOutput()">
                 </div>
                 <br/> <br/> <br/>
-                <label class="col-sm-3 control-label" id="mon_label">Month</label>
-                <div class="col-sm-9">
+                <label class="col-sm-4 control-label" id="mon_label">Month</label>
+                <div class="col-sm-8">
                   <input type="text" id="month_input" value="*" class="form-control"
                          oninput="updateOutput()">
                 </div>
                 <br/> <br/> <br/>
-                <label class="col-sm-3 control-label" id="dow_label">DOW</label>
-                <div class="col-sm-9">
+                <label class="col-sm-4 control-label" id="dow_label" style="margin-top:-8px">Day of Week</label>
+                <div class="col-sm-8">
                   <input type="text" id="dow_input" value="4-6" class="form-control"
                          oninput="updateOutput()">
                 </div>
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 803622d..acbc1fb 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
@@ -186,13 +186,26 @@ var cron_output_id  = "#cron-output";
 var cron_translate_id  = "#cronTranslate";
 var cron_translate_warning_id  = "#translationWarning";
 
-// Cron use 0-6 as Sun--Sat, but Quartz use 1-7. Therefore, a translation is necessary.
-function transformFromCronToQuartz(str){
+// Uni Cron use 0-6 as Sun--Sat, but Quartz use 1-7. Due to later.js only supporting Unix Cron, we have to make this transition.
+// The detailed Unix Cron Syntax: https://en.wikipedia.org/wiki/Cron
+// The input is a 5 field string (without year) or 6 field String (with year).
+function transformFromQuartzToUnixCron(str){
   var res = str.split(" ");
-  res[res.length -1] = res[res.length -1].replace(/[0-7]/g, function upperToHyphenLower(match) {
+
+  // If the cron doesn't include year field
+  if(res.length == 5)
+    res[res.length -1] = modifyStrToUnixCronSyntax(res[res.length - 1]);
+  // If the cron Str does include year field
+  else if(res.length == 6)
+    res[res.length - 2] = modifyStrToUnixCronSyntax(res[res.length - 2]);
+
+  return res.join(" ");
+}
+
+function modifyStrToUnixCronSyntax(str){
+  return str.replace(/[0-7]/g, function upperToHyphenLower(match) {
     return (parseInt(match)+6)%7;
   });
-  return res.join(" ");
 }
 
 function updateOutput() {
@@ -204,9 +217,9 @@ function updateOutput() {
 
 function updateExpression() {
   $('#nextRecurId').html("");
-
-  console.log("cron Input = " + $(cron_output_id).val());
-  var laterCron = later.parse.cron($(cron_output_id).val());
+  var unixCronStr = transformFromQuartzToUnixCron($(cron_output_id).val());
+  console.log("Parsed Unix cron = " + unixCronStr);
+  var laterCron = later.parse.cron(unixCronStr);
 
   //Get the current time given the server timezone.
   var serverTime = moment().tz(timezone);