374. EPMO Open Source Coordination Office Redaction File Detail Report

Produced by Araxis Merge on 12/13/2018 10:35:30 AM Eastern 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.

374.1 Files compared

# Location File Last Modified
1 v12.5_iter_7_build 51.zip\TRM_Upgrade\src\main\java\gov\va\med\fw\scheduling QuartzSchedulingService.java Fri Dec 7 17:36:20 2018 UTC
2 v12.5_iter_7_build 51.zip\TRM_Upgrade\src\main\java\gov\va\med\fw\scheduling QuartzSchedulingService.java Wed Dec 12 19:46:45 2018 UTC

374.2 Comparison summary

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

374.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

374.4 Active regular expressions

No regular expressions were active.

374.5 Comparison detail

  1   /********* ********** ********** ********** ********** ********** ********** ********** **********
  2    * Copyrii ght 2004 V HA. All ri ghts reser ved
  3    ********* ********** ********** ********** ********** ********** ********** ********** *********/
  4   // Package
  5   package go v.va.med.f w.scheduli ng;
  6  
  7   // Java cl asses
  8   import jav a.io.Seria lizable;
  9   import jav a.util.Arr ayList;
  10   import jav a.util.Dat e;
  11   import jav a.util.Lis t;
  12   import jav a.util.Pro perties;
  13   import jav a.util.Set ;
  14  
  15   import org .apache.co mmons.lang .StringUti ls;
  16   import org .apache.co mmons.lang .Validate;
  17   import org .apache.lo g4j.Logger ;
  18   import org .quartz.Cr onSchedule Builder;
  19   import org .quartz.Cr onTrigger;
  20   import org .quartz.Jo bDetail;
  21   import org .quartz.Jo bKey;
  22   import org .quartz.Jo bListener;
  23   import org .quartz.Jo bPersisten ceExceptio n;
  24   import org .quartz.Sc heduler;
  25   import org .quartz.Sc hedulerExc eption;
  26   import org .quartz.Sc hedulerFac tory;
  27   import org .quartz.Si mpleTrigge r;
  28   import org .quartz.Tr igger;
  29   import org .quartz.Tr igger.Trig gerState;
  30   import org .quartz.Tr iggerBuild er;
  31   import org .quartz.Tr iggerKey;
  32   import org .quartz.im pl.StdSche duler;
  33   import org .quartz.im pl.StdSche dulerFacto ry;
  34   import org .quartz.im pl.matcher s.GroupMat cher;
  35   import org .quartz.pl ugins.hist ory.Loggin gJobHistor yPlugin;
  36   import org .springfra mework.bea ns.BeansEx ception;
  37   import org .springfra mework.bea ns.factory .Initializ ingBean;
  38   import org .springfra mework.bea ns.factory .annotatio n.Value;
  39   import org .springfra mework.bea ns.factory .config.Pr opertiesFa ctoryBean;
  40   import org .springfra mework.con text.Appli cationCont ext;
  41   import org .springfra mework.con text.suppo rt.Applica tionObject Support;
  42   import org .springfra mework.ste reotype.Se rvice;
  43  
  44   import edu .emory.mat hcs.backpo rt.java.ut il.Arrays;
  45   import gov .va.med.cc ht.util.ES APIValidat ionType;
  46   import gov .va.med.cc ht.util.ES APIValidat or;
  47   import gov .va.med.fw .service.A bstractCom ponent;
  48   import gov .va.med.fw .service.S erviceExce ption;
  49   import gov .va.med.fw .service.t rigger.Tri ggerEvent;
  50   import gov .va.med.fw .util.Inva lidConfigu rationExce ption;
  51  
  52   /**
  53    * Provide s methods  to schedul e, to unsc hedule, an d to resch edule a jo b. This
  54    * service  delegates  to the un derlying Q uart Sched uling fram ework to d o the
  55    * actual  scheduling  task. Thi s service  is aimed t o encapsul ate the ac tual
  56    * impleme ntation an d ocnfigur ation of a  scheduler  and to pr ovide the  most
  57    * conveni ent method s for sche duling a t ask. For m ore advanc e tasks, c onsider
  58    * using a  scheduler  that can  be obtaine d through  a getSched uler metho d.
  59    * <p/>
  60    * Project : Framewor k</br> Cre ated on: 1 0:52:58 AM  </br>
  61    * 
  62    * @author   DN S
  63    */
  64   @Service
  65   public cla ss QuartzS chedulingS ervice ext ends Appli cationObje ctSupport  implements  Serializa ble,
  66                    Sche dulingServ ice, Initi alizingBea n {
  67           
  68           pr ivate Logg er logger  = Logger.g etLogger(Q uartzSched ulingServi ce.class);
  69  
  70           /* *
  71            *  An instan ce of seri alVersionU ID
  72            * /
  73           pr ivate stat ic final l ong serial VersionUID  = 3171280 9258413795 97L;
  74  
  75           /* *
  76            *  An instan ce of sche duler
  77            * /
  78           pr ivate Sche duler sche duler = nu ll;
  79  
  80           pr ivate Stri ng immedia teTriggerK ey;
  81  
  82           pr ivate Stri ng futureT riggerKey;
  83  
  84           pr ivate bool ean isClus tered = fa lse;
  85           
  86           /* *
  87            *  @see gov. va.med.fw. service.Ab stractComp onent#afte rPropertie sSet()
  88            * /
  89           @O verride
  90           pu blic void  afterPrope rtiesSet()  throws Ex ception {
  91                    
  92                    imme diateTrigg erKey = go v.va.med.f w.scheduli ng.Schedul ingService .IMMEDIATE _TRIGGER_N AME;
  93                    futu reTriggerK ey = gov.v a.med.fw.s cheduling. Scheduling Service.FU TURE_TRIGG ER_NAME;
  94                    
  95                    StdS chedulerFa ctory sche dFact = ne w org.quar tz.impl.St dScheduler Factory();
  96  
  97           Pr operties p rops = new  Propertie s();
  98  
  99           //  General
  100           pr ops.put(St dScheduler Factory.PR OP_SCHED_I NSTANCE_NA ME, "av_sc hed_cluste red");
  101           pr ops.put(St dScheduler Factory.PR OP_SCHED_I NSTANCE_ID , "AUTO");
  102  
  103           //  Thread po oling ?
  104           pr ops.put("o rg.quartz. threadPool .class", o rg.quartz. simpl.Simp leThreadPo ol.class.g etName());
  105           pr ops.put("o rg.quartz. threadPool .threadCou nt", "25") ;
  106           pr ops.put("o rg.quartz. threadPool .threadPri ority", "5 ");
  107  
  108           //  JobStore
  109           pr ops.put("o rg.quartz. jobStore.c lass", "or g.quartz.i mpl.jdbcjo bstore.Job StoreTX");
  110           pr ops.put("o rg.quartz. jobStore.d riverDeleg ateClass",  "org.quar tz.impl.jd bcjobstore .StdJDBCDe legate");
  111           pr ops.put("o rg.quartz. jobStore.u seProperti es", false );
  112           pr ops.put("o rg.quartz. jobStore.d ataSource" , "sched") ;
  113           pr ops.put("o rg.quartz. jobStore.t ablePrefix ", "QRTZ_" );
  114           pr ops.put("o rg.quartz. jobStore.i sClustered ", "true") ;
  115           pr ops.put("o rg.quartz. jobStore.c lusterChec kinInterva l", "20000 ");
  116           pr ops.put("o rg.quartz. jobStore.m isfireThre shold", "6 0000");
  117           pr ops.put("o rg.quartz. jobStore.m axMisfires ToHandleAt ATime", "2 0");
  118  
  119           pr ops.put("o rg.quartz. dataSource .sched.jnd iURL", "jd bc.CchtDat aSourceQua rtz");
  120           pr ops.put("o rg.quartz. dataSource .sched.val idationQue ry", "SELE CT 1");
  121           pr ops.put("o rg.quartz. dataSource .sched.val idateOnChe ckout", tr ue);
  122           
  123  
  124           tr y {
  125                             schedF act.initia lize(props );
  126                             schedu ler = sche dFact.getS cheduler() ;
  127                    } ca tch (Sched ulerExcept ion e) {
  128                             e.prin tStackTrac e();
  129                    }
  130                    
  131           }
  132  
  133           /* *
  134            *  @see gov. va.med.fw. scheduling .Schedulin gService#i sClustered ()
  135            * /
  136           pu blic boole an isClust ered() {
  137                    retu rn this.is Clustered;
  138           }
  139  
  140           /* *
  141            *  @see gov. va.med.fw. scheduling .Schedulin gService#s etIsCluste red(boolea n)
  142            * /
  143           pu blic void  setIsClust ered(boole an flag) {
  144                    this .isCluster ed = flag;
  145           }
  146  
  147           /* *
  148            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etSchedule r()
  149            * /
  150           pu blic Sched uler getSc heduler()  {
  151                    retu rn schedul er;
  152           }
  153  
  154           /* *
  155            *  @see gov. va.med.fw. scheduling .Schedulin gService#s etSchedule r(org.quar tz.Schedul er)
  156            * /
  157           pu blic void  setSchedul er(Schedul er schedul er) {
  158                    this .scheduler  = schedul er;
  159           }
  160  
  161           /* *
  162            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etFutureTr iggerKey()
  163            * /
  164           pu blic Strin g getFutur eTriggerKe y() {
  165                    retu rn futureT riggerKey;
  166           }
  167  
  168           /* *
  169            *  @see gov. va.med.fw. scheduling .Schedulin gService#s etFutureTr iggerKey(j ava.lang.S tring)
  170            * /
  171           pu blic void  setFutureT riggerKey( String fut ureTrigger Key) {
  172                    this .futureTri ggerKey =  futureTrig gerKey;
  173           }
  174  
  175           /* *
  176            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etImmediat eTriggerKe y()
  177            * /
  178           pu blic Strin g getImmed iateTrigge rKey() {
  179                    retu rn immedia teTriggerK ey;
  180           }
  181  
  182           /* *
  183            *  @see gov. va.med.fw. scheduling .Schedulin gService#s etImmediat eTriggerKe y(java.lan g.String)
  184            * /
  185           pu blic void  setImmedia teTriggerK ey(String  immediateT riggerKey)  {
  186                    this .immediate TriggerKey  = immedia teTriggerK ey;
  187           }
  188  
  189           /* *
  190            *  @see gov. va.med.fw. scheduling .Schedulin gService#s chedule(or g.quartz.T rigger)
  191            * /
  192           pu blic Date  schedule(T rigger tri gger) thro ws Schedul erExceptio n {
  193                    retu rn schedul eJob(trigg er);
  194           }
  195  
  196           pr ivate Date  scheduleJ ob(Trigger  trigger)  throws Sch edulerExce ption {
  197                    retu rn schedul eJob(null,  trigger);
  198           }
  199  
  200           /* *
  201            *  @see gov. va.med.fw. scheduling .Schedulin gService#s chedule(or g.quartz.J obDetail,
  202            *       org. quartz.Tri gger)
  203            * /
  204           pu blic Date  schedule(J obDetail j obDetail,  Trigger tr igger) thr ows Schedu lerExcepti on {
  205                    retu rn schedul eJob(jobDe tail, trig ger);
  206           }
  207           
  208           /* *
  209            *  @param jo b
  210            *              the job
  211            *  @param tr igger
  212            *              the trig ger
  213            *  @return t he date sc heduled
  214            *  @throws S chedulerEx ception
  215            *               if a pr oblem was  encountere d
  216            * /
  217           pr ivate Date  scheduleJ ob(JobDeta il job, Tr igger prev iousTrigge r) throws  SchedulerE xception {
  218                    
  219                    // C reate new  trigger to  ensure un ique name
  220                    
  221                    fina l TriggerK ey key = n ew Trigger Key(previo usTrigger. getKey().g etName() +  System.na noTime(),  previousTr igger.getK ey().getNa me());
  222                    
  223                    Trig ger trigge r = Trigge rBuilder
  224                                      .newTrig ger()
  225                                      .forJob( new JobKey (key.getNa me(), key. getGroup() ))
  226                                      .forJob( job)
  227                                      .build() ;
  228                    
  229                    if ( job != nul l) {
  230                             return  getSchedu ler().sche duleJob(jo b, trigger );
  231                    } el se {
  232                             return  getSchedu ler().sche duleJob(tr igger);
  233                    }
  234                    
  235           }
  236  
  237  
  238           /* *
  239            *  @see gov. va.med.fw. scheduling .Schedulin gService#s chedule(or g.quartz.J obDetail,
  240            *       java .util.List , double,  java.lang. String, ja va.lang.St ring)
  241            * /
  242           pu blic Date  schedule(J obDetail j obDetail,  List conte xtDataForT hisTrigger ,
  243                             double  numberOfH oursDelaye d, String  triggerNam e, String  triggerGro up)
  244                             throws  Scheduler Exception  {
  245  
  246                    long  millis =  ((long) Ma th.round(n umberOfHou rsDelayed  * 60)) * 6 0 * 1000;
  247                    
  248                    fina l Date dat e = new Da te(System. currentTim eMillis()  + millis);
  249                    
  250                    Trig ger trigge r = Trigge rBuilder
  251                    .new Trigger()
  252                    .for Job(jobDet ail)
  253                    .sta rtAt(date)
  254                    .bui ld();
  255                    
  256                    if ( contextDat aForThisTr igger != n ull && !co ntextDataF orThisTrig ger.isEmpt y()) {
  257                             trigge r.getJobDa taMap().pu t(Schedule dProcessIn vocationCo ntext.INVO CATION_ARG UMENTS,
  258                                               contextDat aForThisTr igger.toAr ray());
  259                    } el se {
  260                             // to  be safe...
  261                             trigge r.getJobDa taMap().re move(Sched uledProces sInvocatio nContext.I NVOCATION_ ARGUMENTS) ;
  262                    }
  263                    
  264                    retu rn date;
  265           }
  266  
  267  
  268  
  269           /* *
  270            *  @see gov. va.med.fw. scheduling .Schedulin gService#t riggerImme diately(go v.va.med.f w.scheduli ng.Schedul edProcessI nvocationC ontext)
  271            * /
  272           pu blic void  fireJobWit hImmediate Trigger(Sc heduledPro cessInvoca tionContex t invocati onContext)
  273                             throws  Scheduler Exception  {
  274  
  275                    if ( logger.isI nfoEnabled ()) {
  276                             logger .info("Sch eduling jo b[" + invo cationCont ext.getJob Name() + " ]" + " in  group ["
  277                                               + invocati onContext. getJobGrou p() + "] f or immedia te executi on");
  278                    }
  279                    /*
  280                     * t his is not  as flexib le since i t requires  the job t o be known  and
  281                     * r egistered  with sched uler
  282                     * s cheduler.t riggerJob( invocation Context.ge tJobName() ,
  283                     * i nvocationC ontext.get JobGroup() );
  284                     */
  285                    sche dule(getSi mpleTrigge r(immediat eTriggerKe y, invocat ionContext ));
  286           }
  287  
  288           /* *
  289            *  @see gov. va.med.fw. scheduling .Schedulin gService#t riggerImme diately(or g.quartz.J obDetail)
  290            * /
  291           pu blic void  fireJobWit hImmediate Trigger(Jo bDetail jo b) throws  SchedulerE xception {
  292  
  293                    Vali date.notNu ll(job, "A  job must  not be nul l");
  294                    if ( logger.isI nfoEnabled ()) {
  295                             logger .info("Sch eduling jo b[" + job. getKey().g etName() +  "]" + " i n group ["  + job.get Key().getG roup()
  296                                               + "] for i mmediate e xecution") ;
  297                    }
  298                    this .schedule( this.getSi mpleTrigge r(this.imm ediateTrig gerKey, jo b, null, n ull, true) );
  299           }
  300  
  301           /* *
  302            *  @see gov. va.med.fw. scheduling .Schedulin gService#t riggerImme diately(go v.va.med.f w.service. trigger.Tr iggerEvent )
  303            * /
  304           pu blic void  fireJobWit hImmediate Trigger(Tr iggerEvent  event) th rows Sched ulerExcept ion {
  305                    fire JobWithImm ediateTrig ger((Sched uledProces sInvocatio nContext)  event.getP ayload());
  306           }
  307  
  308           /* *
  309            *  @see gov. va.med.fw. scheduling .Schedulin gService#u nschedule( java.lang. String,
  310            *       java .lang.Stri ng)
  311            * /
  312           pu blic boole an unsched ule(String  triggerNa me, String  groupName ) throws S chedulerEx ception {
  313                    Trig ger trigge r = getTri gger(trigg erName, gr oupName);
  314                    retu rn ((trigg er != null ) && (this .getSchedu ler().unsc heduleJob( new Trigge rKey(trigg erName, gr oupName))) );
  315           }
  316  
  317           /* *
  318            *  @see gov. va.med.fw. scheduling .Schedulin gService#r eschedule( java.lang. String,
  319            *       java .lang.Stri ng, org.qu artz.Trigg er)
  320            * /
  321           pu blic Date  reschedule (String tr iggerName,  String gr oupName, T rigger new Trigger)
  322                             throws  Scheduler Exception  {
  323                    retu rn this.ge tScheduler ().resched uleJob(new  TriggerKe y(triggerN ame, group Name), new Trigger);
  324           }
  325  
  326           /* *
  327            *  @see gov. va.med.fw. scheduling .Schedulin gService#i nterrupt(j ava.lang.S tring,
  328            *       java .lang.Stri ng)
  329            * /
  330           pu blic boole an interru pt(String  jobName, S tring grou pName) thr ows Schedu lerExcepti on {
  331                    Vali date.notNu ll(jobName , "JobName  must not  be null.") ;
  332                    if ( logger.isI nfoEnabled ()) {
  333                                                       
  334                              //Fix  Fortify I ssues
  335                             ESAPIV alidator.v alidateStr ingInput(j obName, ES APIValidat ionType.Sc heduledJob _Whitelist );
  336                             ESAPIV alidator.v alidateStr ingInput(g roupName,  ESAPIValid ationType. ScheduledJ ob_Whiteli st);
  337                             
  338                             logger .info("Int errupting  a job[" +  jobName +  "]" + " in  group ["  + groupNam e + "] .") ;
  339                    }
  340                    retu rn schedul er.interru pt(new Job Key(jobNam e, groupNa me));
  341           }
  342  
  343           /* *
  344            *  @see gov. va.med.fw. scheduling .Schedulin gService#i nterrupt(o rg.quartz. JobDetail)
  345            * /
  346           pu blic boole an interru pt(JobDeta il jobDeta il) throws  Scheduler Exception  {
  347                    Vali date.notNu ll(jobDeta il, "JobDe tail must  not be nul l.");
  348                    retu rn interru pt(jobDeta il.getKey( ).getName( ), jobDeta il.getKey( ).getGroup ());
  349           }
  350  
  351           /* *
  352            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etJobGroup Names()
  353            * /
  354           pu blic Strin g[] getJob GroupNames () throws  SchedulerE xception {
  355                    retu rn schedul er.getJobG roupNames( ).toArray( new String [0]);
  356           }
  357  
  358           /* *
  359            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etJobNames (java.lang .String)
  360            * /
  361           pu blic Strin g[] getJob Names(Stri ng groupNa me) throws  Scheduler Exception  {
  362                    
  363                    fina l Set<JobK ey> jobKey s = schedu ler.getJob Keys(Group Matcher.gr oupEquals( groupName) );
  364                    
  365                    fina l List<Str ing> names  = new Arr ayList<Str ing>();
  366                    name s.forEach( name -> {
  367                             names. add(name);
  368                    });
  369                    
  370                    retu rn names.t oArray(new  String[0] );
  371           }
  372  
  373           /* *
  374            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etTriggerG roupNames( )
  375            * /
  376           pu blic Strin g[] getTri ggerGroupN ames() thr ows Schedu lerExcepti on {
  377                    retu rn schedul er.getTrig gerGroupNa mes().toAr ray(new St ring[0]);
  378           }
  379  
  380           /* *
  381            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etTriggerN ames(java. lang.Strin g)
  382            * /
  383           pu blic Strin g[] getTri ggerNames( String gro upName) th rows Sched ulerExcept ion {
  384                    
  385                    fina l Set<Trig gerKey> ke ys = sched uler.getTr iggerKeys( GroupMatch er.groupEq uals(group Name));
  386                    
  387                    fina l List<Str ing> names  = new Arr ayList<Str ing>();
  388                    
  389                    keys .forEach(k ey -> {
  390                             names. add(key.ge tName());
  391                    });
  392                    
  393                    retu rn names.t oArray(new  String[0] );
  394           }
  395  
  396           /* *
  397            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etJobDetai l(java.lan g.String,
  398            *       java .lang.Stri ng)
  399            * /
  400           pu blic JobDe tail getJo bDetail(St ring jobNa me, String  jobGroup)  throws Sc hedulerExc eption {
  401                    retu rn schedul er.getJobD etail(new  JobKey(job Name, jobG roup));
  402           }
  403  
  404           /* *
  405            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etTrigger( java.lang. String,
  406            *       java .lang.Stri ng)
  407            * /
  408           pu blic Trigg er getTrig ger(String  triggerNa me, String  triggerGr oup) throw s Schedule rException  {
  409                    retu rn schedul er.getTrig ger(new Tr iggerKey(t riggerName , triggerG roup));
  410           }
  411  
  412           /* *
  413            *  @see gov. va.med.fw. scheduling .Schedulin gService#g etTriggerS tatus(java .lang.Stri ng,
  414            *       java .lang.Stri ng)
  415            * /
  416           pu blic Trigg erStatus g etTriggerS tatus(Stri ng trigger Name, Stri ng trigger Group)
  417                             throws  Scheduler Exception  {
  418                    Trig ger trigge r = getTri gger(trigg erName, tr iggerGroup );
  419                    Trig gerStatus  status = n ew Trigger Status();
  420                    if ( trigger !=  null) {
  421                             status .setNextFi reTime(tri gger.getFi reTimeAfte r(new Date ()));
  422                             // Tim ezone is s upported o nly in the  cron trig ger
  423                             if (tr igger inst anceof Cro nTrigger)  {
  424                                      CronTrig ger cronTr igger = (C ronTrigger ) trigger;
  425                                      status.s etTimeZone (cronTrigg er.getTime Zone());
  426                             }
  427  
  428                             
  429                             final  TriggerSta te state =  scheduler .getTrigge rState(new  TriggerKe y(triggerN ame, trigg erGroup));
  430                             
  431                             if (st ate == Tri ggerState. NORMAL)
  432                                      status.s etStatus(T riggerStat us.NORMAL_ STATUS);
  433                             else i f (state = = TriggerS tate.ERROR )
  434                                      status.s etStatus(" ERROR");
  435                             else i f (state = = TriggerS tate.COMPL ETE)
  436                                      status.s etStatus(" COMPLETE") ;
  437                             else i f (state = = TriggerS tate.PAUSE D)
  438                                      status.s etStatus(T riggerStat us.PAUSED_ STATUS);
  439                             else i f (state = = TriggerS tate.BLOCK ED)
  440                                      status.s etStatus(" BLOCKED");
  441                             else
  442                                      status.s etStatus(S tringUtils .EMPTY + s tate);
  443                    }
  444                    retu rn status;
  445           }
  446  
  447           pu blic Objec t getCompo nent(Strin g name, Cl ass<?> typ e) throws  ServiceExc eption {
  448  
  449                    Obje ct compone nt = null;
  450                    try  {
  451                             Applic ationConte xt context  = getAppl icationCon text();
  452                             compon ent = cont ext.getBea n(name, ty pe);
  453                    } ca tch (Beans Exception  e) {
  454                             // Fai led to get  a compone nt
  455                             throw  new Servic eException ("Failed t o get a co mponent by  name " +  name + " a nd type "
  456                                               + type, e) ;
  457                    }
  458                    retu rn compone nt;
  459           }
  460  
  461           
  462           /* *
  463            *  Returns a  simple tr igger defi ned in a s pring cont ext by the  specific  key.
  464            *  A trigger  is initia lized with  a job nam e, a group  name, and  a job def ined
  465            *  in a spri ng appplic ation cont ext by a j ob name
  466            *  
  467            *  @param tr iggerKey
  468            *              A key to  look up f or a trigg er in an a pplication  context
  469            *  @param co ntext
  470            *              the sche duled proc ess invoca tion conte xt
  471            *  @return t he simple  trigger
  472            *  @throws S chedulerEx ception
  473            *               if a pr oblem was  encountere d
  474            * /
  475           pr ivate Trig ger getSim pleTrigger (String tr iggerKey,
  476                             Schedu ledProcess Invocation Context co ntext) thr ows Schedu lerExcepti on {
  477                    try  {
  478                             Object  component  = getComp onent(cont ext.getJob DetailBean Name(), Jo bDetail.cl ass);
  479                             JobDet ail job =  component  instanceof  JobDetail  ? (JobDet ail) compo nent : nul l;
  480  
  481                             if(job  != null)
  482                             {
  483                                      Trigger  trigger =  getSimpleT rigger(tri ggerKey, j ob, null,  null, true );
  484  
  485                                      // set d ynamic stu ff on Trig ger (not J ob)...this  allows to  reuse
  486                                      // same
  487                                      // "core " Job for  static and  dynamic u se
  488                                      if (cont ext.getInv ocationArg uments() ! = null) {
  489                                               trigger.ge tJobDataMa p().put(Sc heduledPro cessInvoca tionContex t.INVOCATI ON_ARGUMEN TS,
  490                                                                cont ext.getInv ocationArg uments());
  491                                      } else {
  492                                               // to be s afe...
  493                                               trigger.ge tJobDataMa p().remove (
  494                                                                Sche duledProce ssInvocati onContext. INVOCATION _ARGUMENTS );
  495                                      }
  496  
  497                                      // Sched uledProces sInvocatio nContext.E XECUTION_C ONTEXT sho uld always
  498                                      // be th ere
  499                                      trigger. getJobData Map().put( ScheduledP rocessInvo cationCont ext.EXECUT ION_CONTEX T,
  500                                                       co ntext.getE xecutionCo ntext());
  501  
  502                                      return t rigger;
  503                             }
  504                             else {
  505                                      throw ne w Schedule rException ("Unable t o trigger  task immed iately job  detail is  null");
  506                             }
  507                    } ca tch (Throw able t) {
  508                             Invali dConfigura tionExcept ion e = ne w InvalidC onfigurati onExceptio n(
  509                                               "Unable to  get a Sim pleTrigger  for job",  t);
  510                             throw  new Schedu lerExcepti on("Unable  to trigge r task imm ediately",  e);
  511                    }
  512           }
  513  
  514           /* *
  515            *  Returns a  simple tr igger defi ned in a s pring cont ext by the  specific  key.
  516            *  A trigger  is initia lized with  a job nam e, a group  name, and  the speci fic
  517            *  job
  518            *  
  519            *  @param tr iggerKey
  520            *              the trig ger key
  521            *  @param jo b
  522            *              the job  detail inf ormation
  523            *  @param tr iggerName
  524            *              the trig ger name
  525            *  @param tr iggerGroup
  526            *              the grou p name
  527            *  @return t he simple  trigger
  528            *  @throws S chedulerEx ception
  529            *               if a pr oblem was  encountere d
  530            * /
  531           pr ivate Trig ger getSim pleTrigger (String tr iggerKey,  JobDetail  job, Strin g triggerN ame,
  532                             String  triggerGr oup, boole an addJob)  throws Sc hedulerExc eption {
  533                    try  {
  534                             
  535                             JobKey  key = new  JobKey(tr iggerName  + "-" + Sy stem.curre ntTimeMill is(), trig gerGroup);
  536                             
  537                             Trigge r trigger  = TriggerB uilder
  538                                               .newTrigge r()
  539                                               .forJob(ke y)
  540                                               .forJob(jo b)
  541                                               .build();
  542  
  543                             // for  those job s that are  not alrea dy registe red with S cheduler,  do
  544                             // thi s
  545                             if (ad dJob)
  546                                      schedule r.addJob(j ob, true);
  547                             
  548                             return  trigger;
  549                             
  550                    } ca tch (Excep tion e) {
  551                             Invali dConfigura tionExcept ion e2 = n ew Invalid Configurat ionExcepti on(
  552                                               "Unable to  get a Sim pleTrigger  for job",  e);
  553                             throw  new Schedu lerExcepti on("Unable  to trigge r task imm ediately",  e2);
  554                    }
  555           }
  556  
  557           /* *
  558            *  @see gov. va.med.fw. scheduling .Schedulin gService#p auseJob(ja va.lang.St ring,
  559            *       java .lang.Stri ng)
  560            * /
  561           pu blic void  pauseJob(S tring jobN ame, Strin g jobGroup ) throws S chedulerEx ception {
  562                    sche duler.paus eJob(new J obKey(jobN ame, jobGr oup));
  563           }
  564  
  565           /* *
  566            *  @see gov. va.med.fw. scheduling .Schedulin gService#p auseAllJob s()
  567            * /
  568           pu blic void  pauseAllJo bs() throw s Schedule rException  {
  569                    sche duler.paus eAll();
  570           }
  571  
  572           /* *
  573            *  @see gov. va.med.fw. scheduling .Schedulin gService#r esumeJob(j ava.lang.S tring,
  574            *       java .lang.Stri ng)
  575            * /
  576           pu blic void  resumeJob( String job Name, Stri ng jobGrou p) throws  SchedulerE xception {
  577                    sche duler.resu meJob(new  JobKey(job Name, jobG roup));
  578           }
  579  
  580           /* *
  581            *  @see gov. va.med.fw. scheduling .Schedulin gService#r esumeAllJo bs()
  582            * /
  583           pu blic void  resumeAllJ obs() thro ws Schedul erExceptio n {
  584                    sche duler.resu meAll();
  585           }
  586  
  587           pu blic void  pauseTrigg erGroup(St ring trigg erGroup) t hrows Sche dulerExcep tion {
  588                    sche duler.paus eTriggers( GroupMatch er.groupEq uals(trigg erGroup));
  589           }
  590  
  591           pu blic void  resumeTrig gerGroup(S tring trig gerGroup)  throws Sch edulerExce ption {
  592                    sche duler.resu meTriggers (GroupMatc her.groupE quals(trig gerGroup)) ;
  593           }
  594   }