74. EPMO Open Source Coordination Office Redaction File Detail Report

Produced by Araxis Merge on 11/14/2017 6:57:21 AM Central Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.

74.1 Files compared

# Location File Last Modified
1 cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\service SchedulingService.java Thu Nov 9 14:19:42 2017 UTC
2 cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\service SchedulingService.java Tue Nov 14 12:27:12 2017 UTC

74.2 Comparison summary

Description Between
Files 1 and 2
Text Blocks Lines
Unchanged 2 1782
Changed 1 2
Inserted 0 0
Removed 0 0

74.3 Comparison options

Whitespace
Character case Differences in character case are significant
Line endings Differences in line endings (CR and LF characters) are ignored
CR/LF characters Not shown in the comparison detail

74.4 Active regular expressions

No regular expressions were active.

74.5 Comparison detail

  1   package go v.va.cpss. service;
  2  
  3   import sta tic gov.va .cpss.ESAP I.EsapiVal idationTyp e.LOG_FORG ING;
  4   import sta tic gov.va .cpss.ESAP I.EsapiVal idator.val idateStrin gInput;
  5  
  6   import jav a.text.Par seExceptio n;
  7   import jav a.util.Arr ayList;
  8   import jav a.util.Cal endar;
  9   import jav a.util.Dat e;
  10   import jav a.util.Lis t;
  11   import jav a.util.Set ;
  12  
  13   import org .apache.lo g4j.Logger ;
  14   import org .quartz.Cr onExpressi on;
  15   import org .quartz.Cr onTrigger;
  16   import org .quartz.Jo b;
  17   import org .quartz.Jo bBuilder;
  18   import org .quartz.Jo bDataMap;
  19   import org .quartz.Jo bDetail;
  20   import org .quartz.Jo bKey;
  21   import org .quartz.Sc heduler;
  22   import org .quartz.Sc hedulerExc eption;
  23   import org .quartz.Si mpleTrigge r;
  24   import org .quartz.Tr igger;
  25   import org .quartz.Tr iggerKey;
  26   import org .quartz.im pl.matcher s.GroupMat cher;
  27   import org .quartz.im pl.trigger s.CronTrig gerImpl;
  28   import org .quartz.im pl.trigger s.SimpleTr iggerImpl;
  29   import org .springfra mework.bat ch.core.la unch.JobLa uncher;
  30   import org .springfra mework.sch eduling.qu artz.Quart zJobBean;
  31   import org .springfra mework.ste reotype.Se rvice;
  32  
  33   import gov .va.cpss.c ron.CronUt ils;
  34   import gov .va.cpss.j ob.Interna lJob;
  35   import gov .va.cpss.m odel.Batch Job;
  36   import gov .va.cpss.m odel.Batch Type;
  37  
  38   /**
  39    * Service  class for  schedulin g activiti es relatin g to batch  jobs.
  40    * 
  41    * @author   DN S      BROWNL
  42    */
  43   @Service
  44   public cla ss Schedul ingService  {
  45  
  46           pr ivate stat ic final L ogger logg er = Logge r.getLogge r(Scheduli ngService. class.getC anonicalNa me());
  47  
  48           /* *
  49            *  The job g roup for Q uartz Jobs .
  50            * /
  51           pr ivate Stri ng jobGrou p;
  52  
  53           /* *
  54            *  The trigg er group f or Quartz  Jobs.
  55            * /
  56           pr ivate Stri ng trigger Group;
  57  
  58           /* *
  59            *  The inter nal job gr oup for Qu artz jobs  that are n ot open to  the UI.
  60            * /
  61           pr ivate List <InternalJ ob> intern alGroup;
  62  
  63           /* *
  64            *  The Quart z schedule r.
  65            * /
  66           pr ivate Sche duler sche duler;
  67  
  68           /* *
  69            *  The servi ce for man aging batc h jobs.
  70            * /
  71           pr ivate Batc hService b atchServic e;
  72  
  73           /* *
  74            *  Spring Ba tch JobLau ncher for  starting F lowJobs
  75            * /
  76           pr ivate JobL auncher jo bLauncher;
  77  
  78           pu blic Sched ulingServi ce() {
  79                    inte rnalGroup  = new Arra yList<Inte rnalJob>() ;
  80           }
  81  
  82           pu blic Strin g getJobGr oup() {
  83                    retu rn jobGrou p;
  84           }
  85  
  86           pu blic void  setJobGrou p(String j obGroup) {
  87                    this .jobGroup  = jobGroup ;
  88           }
  89  
  90           pu blic Strin g getTrigg erGroup()  {
  91                    retu rn trigger Group;
  92           }
  93  
  94           pu blic void  setTrigger Group(Stri ng trigger Group) {
  95                    this .triggerGr oup = trig gerGroup;
  96           }
  97  
  98           pu blic List< InternalJo b> getInte rnalGroup( ) {
  99                    retu rn interna lGroup;
  100           }
  101  
  102           pu blic void  setInterna lGroup(Lis t<Internal Job> inter nalGroup)  {
  103                    this .internalG roup = int ernalGroup ;
  104           }
  105  
  106           pu blic Sched uler getSc heduler()  {
  107                    retu rn schedul er;
  108           }
  109  
  110           pu blic void  setSchedul er(Schedul er schedul er) {
  111                    this .scheduler  = schedul er;
  112           }
  113  
  114           pu blic Batch Service ge tBatchServ ice() {
  115                    retu rn batchSe rvice;
  116           }
  117  
  118           pu blic void  setBatchSe rvice(Batc hService b atchServic e) {
  119                    this .batchServ ice = batc hService;
  120           }
  121  
  122           pu blic JobLa uncher get JobLaunche r() {
  123                    retu rn jobLaun cher;
  124           }
  125  
  126           pu blic void  setJobLaun cher(JobLa uncher job Launcher)  {
  127                    this .jobLaunch er = jobLa uncher;
  128           }
  129  
  130           /* *
  131            *  Build the  trigger n ame for th e batch jo b. The nam e is simpl y the batc h
  132            *  job name  with Trigg er postfix .
  133            *  
  134            *  @param ba tchJob
  135            *              The batc h job for  which to c reate a tr igger name .
  136            *  @return S tring of t he name of  the trigg er.
  137            * /
  138           pr ivate Stri ng buildTr iggerNameF orJob(Batc hJob batch Job) {
  139                    retu rn batchJo b.getName( ) + "Trigg er";
  140           }
  141  
  142           /* *
  143            *  Save the  specified  batch job  to the dat abase and  update the  Quartz
  144            *  Schedule.
  145            *  
  146            *  @param ba tchJob
  147            *              The batc h job to s ave.
  148            * /
  149           pu blic void  saveBatchJ ob(BatchJo b batchJob ) {
  150                    Batc hType bt =  batchServ ice.getBat chTypeForJ ob(batchJo b);
  151  
  152                    // H andle sche duling bas ed on job  type.
  153                    swit ch (bt.get JobType())  {
  154                    case  DAILY: {
  155                             logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING)  + ": "
  156                                               + validate StringInpu t(batchJob .getSchedu le(), LOG_ FORGING) +  " "
  157                                               + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING));
  158                             saveBa tchCron(ba tchJob);
  159                             break;
  160                    }
  161                    case  MANUAL: {
  162                             logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING)  + ": " +  "Manual Ru n" + " "
  163                                               + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING));
  164                             batchJ ob.setSche dule(Batch Type.JobTy pe.MANUAL. getName()) ;
  165                             saveBa tchManual( batchJob);
  166                             break;
  167                    }
  168                    case  SCHEDULED : {
  169                             logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING)  + ": " +  "Scheduled  Run" + "  "
  170                                               + validate StringInpu t(batchJob .getSchedu le(), LOG_ FORGING) +  " "
  171                                               + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING));
  172  
  173                             saveBa tchSchedul ed(batchJo b);
  174                             break;
  175                    }
  176                    case  UNDEFINED : {
  177                             logger .error("Un able to ha ndle sched ule for UN DEFINED jo b type: "  + bt.getNa me());
  178                             break;
  179                    }
  180                    defa ult: {
  181                             logger .error("Un able to ha ndle sched ule for un recognized  job type:  " + bt.ge tName());
  182                             break;
  183                    }
  184                    }
  185  
  186           }
  187  
  188           /* *
  189            *  Save the  batch job  in the dat abase and  update the  Quartz Sc heduler as  a
  190            *  cron trig gered job.
  191            *  
  192            *  @param ba tchJob
  193            *              The batc h job from  which to  update dat abase and  scheduler.
  194            * /
  195           pu blic void  saveBatchC ron(BatchJ ob batchJo b) {
  196  
  197                    // S ave in DB!
  198                    batc hService.u pdateBatch Job(batchJ ob);
  199  
  200                    // S et the sch edule!
  201                    setB atchCron(b atchJob);
  202           }
  203  
  204           /* *
  205            *  Set the s cheduler w ith the up dated batc h cron tri ggered job .
  206            *  
  207            *  @param ba tchJob
  208            *              The batc h job from  which to  update sch eduler.
  209            * /
  210           pu blic void  setBatchCr on(BatchJo b batchJob ) {
  211  
  212                    try  {
  213                             JobKey  jk = new  JobKey(bat chJob.getN ame(), job Group);
  214  
  215                             @Suppr essWarning s("uncheck ed")
  216                             List<T rigger> tL  = (List<T rigger>) s cheduler.g etTriggers OfJob(jk);
  217  
  218                             // If  the trigge r list is  empty then  create a  new cron t rigger for
  219                             // the  job.
  220                             if (tL .isEmpty() ) {
  221  
  222                                      if (!sch eduler.che ckExists(j k)) {
  223                                               // This is  an unreco verable er ror. The j ob key sho uld
  224                                               // always  exist.
  225                                               logger.err or("setBat chCron - j ob key doe s not exis t! - exiti ng");
  226                                               return;
  227                                      }
  228  
  229                                      CronTrig gerImpl tr igger = ne w CronTrig gerImpl();
  230  
  231                                      TriggerK ey tK = ne w TriggerK ey(buildTr iggerNameF orJob(batc hJob), tri ggerGroup) ;
  232  
  233                                      trigger. setKey(tK) ;
  234  
  235                                      try {
  236                                               checkJobSc hedule(bat chJob);
  237  
  238                                               CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le()));
  239  
  240                                               trigger.se tCronExpre ssion(cron Exp);
  241                                               trigger.se tStartTime (new Date( ));
  242  
  243                                               trigger.se tJobKey(jk );
  244                                               trigger.se tJobName(b atchJob.ge tName());
  245  
  246                                               logger.inf o(trigger. toString() );
  247  
  248                                               Date nextF ireDate =  scheduler. scheduleJo b(trigger) ;
  249  
  250                                               if (nextFi reDate ==  null) {
  251                                                       lo gger.error ("Schedule  of job wa s unsucces sful.");
  252                                               }
  253                                      } catch  (ParseExce ption e) {
  254                                               logger.err or("Parse  error with  Cron Expr ession: "  + e.getMes sage());
  255                                      }
  256  
  257                                      return;
  258                             }
  259  
  260                             // The  trigger f or the job  exists.
  261                             Trigge r t = tL.g et(0);
  262  
  263                             // Upd ate the tr igger depe nding on t he type.
  264                             if (t  instanceof  CronTrigg erImpl) {
  265  
  266                                      CronTrig gerImpl tr igger = (C ronTrigger Impl) t;
  267                                      TriggerK ey tK = tr igger.getK ey();
  268  
  269                                      schedule r.pauseTri gger(tK);
  270  
  271                                      try {
  272                                               CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le()));
  273                                               trigger.se tCronExpre ssion(cron Exp);
  274                                               trigger.se tStartTime (new Date( ));
  275  
  276                                               Date srjDa te = sched uler.resch eduleJob(t K, trigger );
  277                                               if (srjDat e == null)  {
  278                                                       lo gger.error ("Problem  scheduling  job: " +  validateSt ringInput( batchJob.g etName(),  LOG_FORGIN G));
  279                                               }
  280                                      } catch  (ParseExce ption e) {
  281                                               logger.err or(
  282                                                                "Par se error w ith Cron E xpression:  " + valid ateStringI nput(e.get Message(),  LOG_FORGI NG));
  283                                      }
  284  
  285                             } else  if (t ins tanceof Si mpleTrigge rImpl) {
  286  
  287                                      SimpleTr iggerImpl  trigger =  (SimpleTri ggerImpl)  t;
  288                                      TriggerK ey tK = tr igger.getK ey();
  289  
  290                                      schedule r.pauseTri gger(tK);
  291  
  292                                      CronTrig gerImpl ne wTrigger =  new CronT riggerImpl ();
  293                                      newTrigg er.setKey( tK);
  294  
  295                                      try {
  296                                               CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le()));
  297  
  298                                               newTrigger .setCronEx pression(c ronExp);
  299                                               newTrigger .setStartT ime(new Da te());
  300  
  301                                               Date srjDa te = sched uler.resch eduleJob(t K, newTrig ger);
  302                                               if (srjDat e == null)  {
  303                                                       lo gger.error ("Problem  scheduling  job: " +  validateSt ringInput( batchJob.g etName(),  LOG_FORGIN G));
  304                                               }
  305                                      } catch  (ParseExce ption e) {
  306                                               logger.err or("Parse  error with  Cron Expr ession: "  + e.getMes sage());
  307                                      }
  308  
  309                             } else  {
  310                                      logger.e rror("Unkn own trigge r type! -  Exiting!") ;
  311                                      return;
  312                             }
  313  
  314                    } ca tch (Sched ulerExcept ion e) {
  315                             logger .error("Ca ught Excep tion: " +  e.getMessa ge());
  316                    }
  317  
  318           }
  319  
  320           pu blic void  setInterna lCron(Inte rnalJob in ternalJob)  {
  321                    try  {
  322                             JobKey  jk = new  JobKey(int ernalJob.g etFlowJob( ).getName( ), jobGrou p);
  323  
  324                             @Suppr essWarning s("uncheck ed")
  325                             List<T rigger> tL  = (List<T rigger>) s cheduler.g etTriggers OfJob(jk);
  326  
  327                             // If  the trigge r list is  empty then  create a  new cron t rigger for
  328                             // the  job.
  329                             if (tL .isEmpty() ) {
  330  
  331                                      if (!sch eduler.che ckExists(j k)) {
  332                                               // This is  an unreco verable er ror. The j ob key sho uld
  333                                               // always  exist.
  334                                               logger.err or("setBat chCron - j ob key doe s not exis t! - exiti ng");
  335                                               return;
  336                                      }
  337  
  338                                      if (inte rnalJob.ge tTrigger()  instanceo f CronTrig ger) {
  339  
  340                                               CronTrigge r oldTrigg er = (Cron Trigger) i nternalJob .getTrigge r();
  341                                               CronTrigge rImpl newT rigger = n ew CronTri ggerImpl() ;
  342                                               TriggerKey  tK = new  TriggerKey (internalJ ob.getFlow Job().getN ame() + "T rigger", t riggerGrou p);
  343  
  344                                               newTrigger .setKey(tK );
  345  
  346                                               try {
  347  
  348                                                       ne wTrigger.s etCronExpr ession(old Trigger.ge tCronExpre ssion());
  349                                                       ne wTrigger.s etStartTim e(new Date ());
  350  
  351                                                       ne wTrigger.s etJobKey(j k);
  352                                                       ne wTrigger.s etJobName( internalJo b.getFlowJ ob().getNa me());
  353                                                       ne wTrigger.s etMisfireI nstruction (CronTrigg erImpl.MIS FIRE_INSTR UCTION_IGN ORE_MISFIR E_POLICY);
  354  
  355                                                       lo gger.info( newTrigger .toString( ));
  356  
  357                                                       Da te nextFir eDate = sc heduler.sc heduleJob( newTrigger );
  358  
  359                                                       if  (nextFire Date == nu ll) {
  360                                                                logg er.error(" Schedule o f job was  unsuccessf ul.");
  361                                                       }
  362                                               } catch (P arseExcept ion e) {
  363                                                       lo gger.error ("Parse er ror with C ron Expres sion: " +  e.getMessa ge());
  364                                               }
  365                                      } else i f (interna lJob.getTr igger() in stanceof S impleTrigg er) {
  366  
  367                                               SimpleTrig ger oldTri gger = (Si mpleTrigge r) interna lJob.getTr igger();
  368                                               SimpleTrig gerImpl ne wTrigger =  new Simpl eTriggerIm pl();
  369                                               TriggerKey  tK = new  TriggerKey (internalJ ob.getFlow Job().getN ame() + "T rigger", t riggerGrou p);
  370  
  371                                               newTrigger .setKey(tK );
  372  
  373                                               try {
  374                                                       ne wTrigger.s etRepeatCo unt(oldTri gger.getRe peatCount( ));
  375                                                       ne wTrigger.s etRepeatIn terval(old Trigger.ge tRepeatInt erval());
  376                                                       ne wTrigger.s etStartTim e(new Date ());
  377  
  378                                                       ne wTrigger.s etJobKey(j k);
  379                                                       ne wTrigger.s etJobName( internalJo b.getFlowJ ob().getNa me());
  380                                                       ne wTrigger.s etMisfireI nstruction (CronTrigg erImpl.MIS FIRE_INSTR UCTION_IGN ORE_MISFIR E_POLICY);
  381  
  382                                                       lo gger.info( newTrigger .toString( ));
  383  
  384                                                       Da te nextFir eDate = sc heduler.sc heduleJob( newTrigger );
  385  
  386                                                       if  (nextFire Date == nu ll) {
  387                                                                logg er.error(" Schedule o f job was  unsuccessf ul.");
  388                                                       }
  389                                               } catch (E xception e ) {
  390                                                       lo gger.error ("Error wi th buildin g Simple T rigger: "  + e.getMes sage());
  391                                               }
  392                                      }
  393  
  394                                      return;
  395                             }
  396  
  397                             // The  trigger f or the job  exists.
  398                             Trigge r t = tL.g et(0);
  399                             if (!( t instance of CronTri ggerImpl)  && !(t ins tanceof Si mpleTrigge rImpl)) {
  400                                      logger.e rror("Unkn own trigge r type! -  Exiting!") ;
  401                                      return;
  402                             }
  403                             // Upd ate to a n ew trigger  type if n ecessary.
  404                             if (in ternalJob. getTrigger () instanc eof Simple TriggerImp l) {
  405                                      SimpleTr igger newT rigger = ( SimpleTrig ger) inter nalJob.get Trigger();
  406                                      // new t rigger mus t have use  property  elements s tored as s tring
  407                                      // as pe r quartz.p roperties
  408                                      newTrigg er.getJobD ataMap().p ut("jobDet ail", newT rigger.get JobDataMap ().get("jo bDetail"). toString() );
  409  
  410                                      TriggerK ey tK = t. getKey();
  411  
  412                                      schedule r.pauseTri gger(tK);
  413  
  414                                      try {
  415                                               Date srjDa te = sched uler.resch eduleJob(t K, newTrig ger);
  416                                               if (srjDat e == null)  {
  417                                                       lo gger.error ("Problem  scheduling  job: "
  418                                                                         + vali dateString Input(inte rnalJob.ge tFlowJob() .getName() , LOG_FORG ING));
  419                                               }
  420                                      } catch  (Scheduler Exception  e) {
  421                                               logger.err or("Schedu ler except ion with j ob: " + e. getMessage ());
  422                                      }
  423                             } else  if (inter nalJob.get Trigger()  instanceof  CronTrigg erImpl) {
  424                                      CronTrig ger newTri gger = (Cr onTrigger)  internalJ ob.getTrig ger();
  425                                      CronTrig gerImpl tr igger = (C ronTrigger Impl) t;
  426                                      TriggerK ey tK = tr igger.getK ey();
  427  
  428                                      schedule r.pauseTri gger(tK);
  429  
  430                                      try {
  431  
  432                                               trigger.se tCronExpre ssion(newT rigger.get CronExpres sion());
  433                                               trigger.se tStartTime (new Date( ));
  434  
  435                                               Date srjDa te = sched uler.resch eduleJob(t K, trigger );
  436  
  437                                               if (srjDat e == null)  {
  438                                                       lo gger.error ("Problem  scheduling  internal  job: "
  439                                                                         + vali dateString Input(inte rnalJob.ge tFlowJob() .getName() , LOG_FORG ING));
  440                                               }
  441                                      } catch  (ParseExce ption e) {
  442                                               logger.err or(
  443                                                                "Par se error w ith Cron E xpression:  " + valid ateStringI nput(e.get Message(),  LOG_FORGI NG));
  444                                      }
  445  
  446                             }
  447                    } ca tch (Sched ulerExcept ion e) {
  448                             logger .error("Ca ught Excep tion: " +  e.getMessa ge());
  449                    }
  450           }
  451  
  452           /* *
  453            *  Save the  batch job  in the dat abase and  update the  Quartz Sc heduler as  a
  454            *  simple tr iggered jo b.
  455            *  
  456            *  @param ba tchJob
  457            *              The batc h job from  which to  update dat abase and  scheduler.
  458            * /
  459           pu blic void  saveBatchS cheduled(B atchJob ba tchJob) {
  460  
  461                    // S ave in DB!
  462                    batc hService.u pdateBatch Job(batchJ ob);
  463  
  464                    // S et the sch edule!
  465                    setB atchSchedu led(batchJ ob);
  466           }
  467  
  468           /* *
  469            *  Set the s cheduler w ith the up dated batc h simple t riggered j ob.
  470            *  
  471            *  @param ba tchJob
  472            *              The batc h job from  which to  update sch eduler.
  473            * /
  474           pu blic void  setBatchSc heduled(Ba tchJob bat chJob) {
  475                    try  {
  476  
  477                             JobKey  jk = new  JobKey(bat chJob.getN ame(), job Group);
  478  
  479                             @Suppr essWarning s("uncheck ed")
  480                             List<T rigger> tL  = (List<T rigger>) s cheduler.g etTriggers OfJob(jk);
  481  
  482                             // If  trigger li st is empt y then we  make a new  trigger.
  483                             if (tL .isEmpty() ) {
  484  
  485                                      if (!sch eduler.che ckExists(j k)) {
  486                                               // This is  an unreco verable er ror. The j ob key sho uld
  487                                               // always  exist.
  488                                               logger.err or("setBat chSchedule d - job ke y does not  exist! -  exiting");
  489                                               return;
  490                                      }
  491  
  492                                      SimpleTr iggerImpl  trigger =  new Simple TriggerImp l();
  493                                      TriggerK ey tK = ne w TriggerK ey(buildTr iggerNameF orJob(batc hJob), tri ggerGroup) ;
  494  
  495                                      checkJob Schedule(b atchJob);
  496  
  497                                      final St ring delim s = ":";
  498                                      String[]  tokens =  batchJob.g etSchedule ().split(d elims);
  499                                      Calendar  calStart  = Calendar .getInstan ce();
  500                                      calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() );
  501                                      calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0]));
  502                                      calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ;
  503                                      calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ;
  504                                      calStart .set(Calen dar.MILLIS ECOND, 0);
  505                                      Date myS tartTime =  calStart. getTime();
  506  
  507                                      Calendar  calEnd =  Calendar.g etInstance ();
  508                                      calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd());
  509                                      calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ]));
  510                                      calEnd.s et(Calenda r.MINUTE,  Integer.pa rseInt(tok ens[1]));
  511                                      calEnd.s et(Calenda r.SECOND,  Integer.pa rseInt(tok ens[2]));
  512                                      calEnd.s et(Calenda r.MILLISEC OND, 0);
  513                                      Date myE ndTime = c alEnd.getT ime();
  514  
  515                                      trigger. setKey(tK) ;
  516                                      trigger. setStartTi me(myStart Time);
  517                                      trigger. setEndTime (myEndTime );
  518                                      trigger. setRepeatC ount(0);
  519                                      trigger. setJobKey( jk);
  520                                      trigger. setJobName (batchJob. getName()) ;
  521  
  522                                      trigger. setMisfire Instructio n(
  523                                                       Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T);
  524  
  525                                      logger.i nfo(trigge r.toString ());
  526  
  527                                      Date nex tFireDate  = schedule r.schedule Job(trigge r);
  528  
  529                                      if (next FireDate = = null) {
  530                                               logger.err or("Proble m scheduli ng job: "  + validate StringInpu t(batchJob .getName() , LOG_FORG ING));
  531                                      }
  532                                      return;
  533                             }
  534  
  535                             Trigge r t = tL.g et(0);
  536                             if (t  instanceof  CronTrigg erImpl) {
  537                                      CronTrig gerImpl tr igger = (C ronTrigger Impl) t;
  538                                      TriggerK ey tK = tr igger.getK ey();
  539  
  540                                      schedule r.pauseTri gger(tK);
  541  
  542                                      final St ring delim s = ":";
  543                                      String[]  tokens =  batchJob.g etSchedule ().split(d elims);
  544                                      Calendar  calStart  = Calendar .getInstan ce();
  545                                      calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() );
  546                                      calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0]));
  547                                      calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ;
  548                                      calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ;
  549                                      calStart .set(Calen dar.MILLIS ECOND, 0);
  550  
  551                                      Date myS tartTime =  calStart. getTime();
  552  
  553                                      Calendar  calEnd =  Calendar.g etInstance ();
  554                                      calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd());
  555                                      calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ]));
  556                                      calEnd.s et(Calenda r.MINUTE,  Integer.pa rseInt(tok ens[1]));
  557                                      calEnd.s et(Calenda r.SECOND,  Integer.pa rseInt(tok ens[2]));
  558                                      calEnd.s et(Calenda r.MILLISEC OND, 0);
  559  
  560                                      Date myE ndTime = c alEnd.getT ime();
  561  
  562                                      SimpleTr iggerImpl  newTrigger  = new Sim pleTrigger Impl();
  563                                      newTrigg er.setKey( tK);
  564                                      newTrigg er.setStar tTime(mySt artTime);
  565                                      newTrigg er.setEndT ime(myEndT ime);
  566                                      newTrigg er.setRepe atCount(0) ;
  567                                      newTrigg er.setMisf ireInstruc tion(
  568                                                       Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T);
  569  
  570                                      Date srj Date = sch eduler.res cheduleJob (tK, newTr igger);
  571                                      if (srjD ate == nul l) {
  572                                               logger.err or("Proble m scheduli ng job: "  + validate StringInpu t(batchJob .getName() , LOG_FORG ING));
  573                                      }
  574  
  575                             } else  if (t ins tanceof Si mpleTrigge rImpl) {
  576                                      SimpleTr iggerImpl  trigger =  (SimpleTri ggerImpl)  t;
  577                                      TriggerK ey tK = tr igger.getK ey();
  578  
  579                                      schedule r.pauseTri gger(tK);
  580  
  581                                      final St ring delim s = ":";
  582                                      String[]  tokens =  batchJob.g etSchedule ().split(d elims);
  583  
  584                                      Calendar  calStart  = Calendar .getInstan ce();
  585                                      calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() );
  586                                      calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0]));
  587                                      calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ;
  588                                      calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ;
  589                                      calStart .set(Calen dar.MILLIS ECOND, 0);
  590  
  591                                      Date myS tartTime =  calStart. getTime();
  592  
  593                                      Calendar  calEnd =  Calendar.g etInstance ();
  594                                      calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd());
  595                                      calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ]));
  596                                      calEnd.s et(Calenda r.MINUTE,  Integer.pa rseInt(tok ens[1]));
  597                                      calEnd.s et(Calenda r.SECOND,  Integer.pa rseInt(tok ens[2]));
  598                                      calEnd.s et(Calenda r.MILLISEC OND, 0);
  599  
  600                                      Date myE ndTime = c alEnd.getT ime();
  601  
  602                                      trigger. setKey(tK) ;
  603                                      trigger. setStartTi me(myStart Time);
  604                                      trigger. setEndTime (myEndTime );
  605                                      trigger. setRepeatC ount(0);
  606  
  607                                      trigger. setMisfire Instructio n(
  608                                                       Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T);
  609  
  610                                      Date srj Date = sch eduler.res cheduleJob (tK, trigg er);
  611                                      if (srjD ate == nul l) {
  612                                               logger.err or("Proble m scheduli ng job: "  + validate StringInpu t(batchJob .getName() , LOG_FORG ING));
  613                                      }
  614  
  615                             } else  {
  616                                      logger.e rror("Unkn own trigge r type! -  Exiting");
  617                                      return;
  618                             }
  619  
  620                    } ca tch (Sched ulerExcept ion e) {
  621                             logger .error("Ca ught Excep tion: " +  e.getMessa ge());
  622                    }
  623  
  624           }
  625  
  626           /* *
  627            *  Save the  batch job  in the dat abase and  update the  Quartz Sc heduler to
  628            *  unschedul e the job  trigger.
  629            *  
  630            *  @param ba tchJob
  631            *              The batc h job from  which to  update dat abase and  scheduler.
  632            * /
  633           pu blic void  saveBatchM anual(Batc hJob batch Job) {
  634  
  635                    // S ave in DB!
  636                    batc hService.u pdateBatch Job(batchJ ob);
  637  
  638                    // S et the sch edule!
  639                    setB atchManual (batchJob) ;
  640           }
  641  
  642           /* *
  643            *  Update th e schedule r to unsch edule the  specified  batch job.
  644            *  
  645            *  @param ba tchJob
  646            *              The batc h job from  which to  update sch eduler.
  647            * /
  648           pu blic void  setBatchMa nual(Batch Job batchJ ob) {
  649  
  650                    try  {
  651                             JobKey  jk = new  JobKey(bat chJob.getN ame(), job Group);
  652  
  653                             @Suppr essWarning s("uncheck ed")
  654                             List<T rigger> tL  = (List<T rigger>) s cheduler.g etTriggers OfJob(jk);
  655  
  656                             if (!t L.isEmpty( )) {
  657  
  658                                      // Turn  off trigge r.
  659                                      Trigger  t = tL.get (0);
  660                                      schedule r.unschedu leJob(t.ge tKey());
  661                             }
  662  
  663                    } ca tch (Sched ulerExcept ion e) {
  664                             logger .error("Ca ught Excep tion: " +  e.getMessa ge());
  665                    }
  666           }
  667  
  668           /* *
  669            *  Check the  job sched ule and sa ve a defau lt value i f invalid.
  670            *  
  671            *  @param ba tchJob
  672            *              The batc h job to c heck.
  673            * /
  674           pr ivate void  checkJobS chedule(Ba tchJob bat chJob) {
  675                    Stri ng schedul e = batchJ ob.getSche dule();
  676                    if ( (schedule  == null) | | schedule .isEmpty() ) {
  677                             schedu le = "23:0 0:00";
  678                             batchJ ob.setSche dule(sched ule);
  679                             logger .warn("Job  '" + batc hJob.getNa me() + "'  schedule w as invalid  so using  default va lue: " + s chedule);
  680                             batchS ervice.upd ateBatchJo b(batchJob );
  681                    }
  682           }
  683  
  684           /* *
  685            *  Forcefull y run the  specified  batch job  by it's ID .
  686            *  
  687            *  @param id
  688            *              The ID o f the batc h job to r un.
  689            * /
  690           pu blic void  runJob(int  id) {
  691  
  692                    // L ook up job  based on  id!
  693                    Batc hJob batch Job = batc hService.g etBatchJob ById(id);
  694  
  695                    if ( batchJob = = null) {
  696                             logger .error("Ba tch job "  + id + " d oes not ex ist.");
  697                    } el se {
  698  
  699                             // For cefully ru n the job  specified  by the id.
  700                             JobKey  jk = new  JobKey(bat chJob.getN ame(), job Group);
  701  
  702                             try {
  703                                      if (sche duler.chec kExists(jk )) {
  704                                               scheduler. triggerJob (jk);
  705                                      } else {
  706                                               logger.err or("Job ke y does not  exist.");
  707                                      }
  708                             } catc h (Schedul erExceptio n e) {
  709                                      logger.e rror("runJ ob excepti on: " + e. getMessage ());
  710                             }
  711                    }
  712           }
  713  
  714           /* *
  715            *  Initializ e the Quar tz Schedul er upon de ployment.
  716            * /
  717           pu blic void  initNotifi cationSche duler() {
  718  
  719                    // C reate jobs  from the  database.
  720                    List <BatchJob>  bjL = bat chService. getBatchJo bList();
  721  
  722                    // S ave a list  of the jo b names to  check if  any old jo bs should  be
  723                    // r emoved.
  724                    List <String> n ameL = new  ArrayList <>();
  725  
  726                    for  (BatchJob  bj : bjL)  {
  727                             try {
  728  
  729                                      // Reset  status fo r job to n ot running  if was fo und to hav e
  730                                      // runni ng state.
  731                                      // This  would indi cate the j ob was une xpected in terrupted  or
  732                                      // ended  in an ear lier run.
  733                                      if (batc hService.s etNotRunni ngById(bj) ) {
  734                                               logger.war n("Last st atus for b atch job ( " + valida teStringIn put(bj.get Name(), LO G_FORGING)
  735                                                                + ")  set to no t running" );
  736                                      }
  737  
  738                                      Class<?>  clazz = C lass.forNa me("gov.va .cpss.job. " + bj.get Name());
  739  
  740                                      if (claz z.newInsta nce() inst anceof Qua rtzJobBean ) {
  741  
  742                                               JobDataMap  map = new  JobDataMa p();
  743                                               map.put("n ame", bj.g etName());
  744  
  745                                               @SuppressW arnings("u nchecked")
  746                                               JobDetail  job = JobB uilder.new Job((Class <? extends  Job>) cla zz).withId entity(bj. getName(),  jobGroup)
  747                                                                .usi ngJobData( map).store Durably(). build();
  748                                               initialize Trigger(bj , job);
  749  
  750                                               nameL.add( bj.getName ());
  751  
  752                                      } else {
  753                                               logger.err or("Invali d Job Clas s: " + val idateStrin gInput(bj. getName(),  LOG_FORGI NG));
  754                                      }
  755  
  756                             } catc h (ClassNo tFoundExce ption e) {
  757                                      logger.e rror("Clas sNotFoundE xception w hen initia lizing job : "
  758                                                       +  validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e());
  759                             } catc h (Instant iationExce ption e) {
  760                                      logger.e rror("Inst antiationE xception w hen initia lizing job : "
  761                                                       +  validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e());
  762                             } catc h (Illegal AccessExce ption e) {
  763                                      logger.e rror("Ille galAccessE xception w hen initia lizing job : "
  764                                                       +  validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e());
  765                             }
  766  
  767                    }
  768  
  769                    for  (InternalJ ob interna lJob : int ernalGroup ) {
  770                             Class< ?> clazz =  internalJ ob.getJobD etail().ge tJobClass( );
  771  
  772                             JobDat aMap map =  new JobDa taMap();
  773                             map.pu t("name",  internalJo b.getFlowJ ob().getNa me());
  774  
  775                             @Suppr essWarning s("uncheck ed")
  776                             JobDet ail job =  JobBuilder .newJob((C lass<? ext ends Job>)  clazz)
  777                                               .withIdent ity(intern alJob.getF lowJob().g etName(),  jobGroup). usingJobDa ta(map).st oreDurably ()
  778                                               .build();
  779                             // Run  the set b atch cron  with some  specific t hing that  does not
  780                             // nee d BatchJob
  781                             if (cr eateJob(jo b)) {
  782                                      setInter nalCron(in ternalJob) ;
  783                             }
  784                             nameL. add(intern alJob.getF lowJob().g etName());
  785                    }
  786  
  787                    if ( !deleteNon existantJo bs(nameL))  {
  788                             logger .warn("Pro blem delet ing nonexi stant jobs ");
  789                    }
  790           }
  791  
  792           /* *
  793            *  Initializ e Quartz J ob Trigger s for the  specified  batch job  and job
  794            *  details.
  795            *  
  796            *  @param bj
  797            *              The batc h job for  which to u pdate the  scheduler.
  798            *  @param jo b
  799            *              The Quar tz job det ails for t he batch j ob.
  800            * /
  801           pr ivate void  initializ eTrigger(B atchJob bj , JobDetai l job) {
  802  
  803                    logg er.info("I nitializin g trigger  for job: "  + job.get Key().getN ame());
  804  
  805                    // H andle trig ger initia lization b ased on ty pe.
  806                    swit ch (bj.get BatchType( ).getJobTy pe()) {
  807                    case  DAILY: {
  808                             logger .info("DAI LY");
  809                             if (cr eateJob(jo b)) {
  810                                      setBatch Cron(bj);
  811                             }
  812                             break;
  813                    }
  814                    case  MANUAL: {
  815                             logger .info("MAN UAL");
  816                             if (cr eateJob(jo b)) {
  817                                      setBatch Manual(bj) ;
  818                             }
  819                             break;
  820                    }
  821                    case  SCHEDULED : {
  822                             logger .info("SCH EDULED");
  823                             if (cr eateJob(jo b)) {
  824                                      setBatch Scheduled( bj);
  825                             }
  826                             break;
  827                    }
  828                    case  UNDEFINED : {
  829                             logger .error("Un able to in itialize t rigger for  UNDEFINED  job type:  "
  830                                               + validate StringInpu t(bj.getBa tchType(). getName(),  LOG_FORGI NG));
  831                             break;
  832                    }
  833                    defa ult: {
  834                             logger .error("Un able to in itialize t rigger for  unrecogni zed job ty pe: "
  835                                               + validate StringInpu t(bj.getBa tchType(). getName(),  LOG_FORGI NG));
  836                             break;
  837                    }
  838                    }
  839  
  840           }
  841  
  842           /* *
  843            *  Create th e Quartz J ob in the  scheduler  if it does  not alrea dy exist.
  844            *  
  845            *  @param jo b
  846            *              The job  to create.
  847            *  @return B oolean fla g that ind icates if  successful ly created  job or if  the
  848            *          j ob already  exists.
  849            * /
  850           pr ivate bool ean create Job(JobDet ail job) {
  851                    bool ean succes s = false;
  852                    try  {
  853                             if (!s cheduler.c heckExists (job.getKe y())) {
  854                                      schedule r.addJob(j ob, false) ;
  855                                      logger.i nfo("Job a dded to sc heduler: "  + job.get Key().getN ame());
  856                             } else  {
  857                                      logger.i nfo("Job e xists in s cheduler:  " + job.ge tKey().get Name());
  858                             }
  859                             succes s = true;
  860                    } ca tch (Sched ulerExcept ion e) {
  861                             logger .error("Un able to ad d job to s cheduler:  " + job.ge tKey().get Name() + " , e: " + e .getMessag e());
  862                    }
  863                    retu rn success ;
  864           }
  865  
  866           /* *
  867            *  Delete an y jobs for  the group  that is n ot in the  cpss batch  job table .
  868            *  
  869            *  @param na meL
  870            *              The list  of batch  jobs in th e cpss bat ch job tab le.
  871            * /
  872           pr ivate bool ean delete Nonexistan tJobs(fina l List<Str ing> nameL ) {
  873                    bool ean result  = false;
  874                    Grou pMatcher<J obKey> mat cher = Gro upMatcher. groupEqual s(jobGroup );
  875                    try  {
  876                             Set<Jo bKey> jobK eyS = sche duler.getJ obKeys(mat cher);
  877                             for (J obKey jobK ey : jobKe yS) {
  878                                      // If jo b not foun d then del ete it.
  879                                      if (!nam eL.contain s(jobKey.g etName()))  {
  880                                               logger.inf o("Deletin g old sche duled job  that was n ot in the  batch job  database t able: "
  881                                                                + jo bKey.getNa me());
  882                                               scheduler. deleteJob( jobKey);
  883                                      }
  884                             }
  885                             result  = true;
  886                    } ca tch (Sched ulerExcept ion e) {
  887                             logger .error("Er ror deleti ng nonexis tant jobs:  " + e.get Message()) ;
  888                    }
  889                    retu rn result;
  890           }
  891  
  892   }