Ċ package Ġmb . lib . report Ċ Ċ import Ġmb . lib . data . Job DataManager Ċ import Ġmb . lib . model . Hash ID Ċ import Ġmb . lib . model . JobStatus Ċ import Ġmb . lib . report . model . Report Job Ċ import Ġmb . lib . report . model . Report Payload Ċ import Ġmb . lib . report . model . Report Row Ċ import Ġmb . lib . report . model . User Report Row Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util . Optional Ċ Ċ object ĠReport Manager Ġ{ ĊĠ Ġprivate Ġval ĠLog Ġ= ĠLog Manager . getLogger (" Report Manager ") ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġan Ġoptional Ġinput Ġstream Ġover Ġthe Ġspecified Ġfile Ġin Ġthe Ġtarget ĊĠĠ Ġ* Ġreport Ġworkspace . ĊĠĠ Ġ* Ġ< p > ĊĠĠ Ġ* ĠIf Ġthe Ġjob Ġworkspace , Ġreport Ġworkspace , Ġor Ġtarget Ġfile Ġdo Ġnot Ġexist , Ġthis ĊĠĠ Ġ* Ġmethod Ġwill Ġreturn Ġan Ġempty Ġoption . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġrow Ġ ĠReport Ġjob Ġrecord . ĊĠĠ Ġ* Ġ@ param Ġfile ĠTarget Ġfile Ġname . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġan Ġoptional Ġinput Ġstream Ġover Ġthe Ġtarget Ġfile . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Report File ( row : ĠReport Row , Ġfile : ĠString ): ĠFile ? Ġ{ ĊĠĠĠ ĠLog . trace (" :: get Report Files ( row ={ })", Ġrow ) ĊĊĠĠĠ Ġif Ġ(! Job DataManager . workspace Exists ( row . job ID )) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġws Ġ= ĠJob DataManager . job Workspace ( row . job ID ) ĊĊĠĠĠ Ġif Ġ(! ws . report Workspace Exists ( row . report ID )) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġrs Ġ= Ġws . report Workspace ( row . report ID ) ĊĊĠĠĠ Ġif Ġ(! rs . file Exists ( file )) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġrs . get FilePath ( file ). to File () ĊĠ Ġ} ĊĊĠ Ġfun Ġget Updated User Report ( report ID : ĠHash ID , ĠuserID : ĠLong ): ĠOptional < User Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: getUser Report ( report ID ={}, ĠuserID ={ })", Ġreport ID , ĠuserID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ ĊĠĠĠĠĠ Ġval Ġtmp Opt Ġ= Ġit . getUser Report Job ( report ID , ĠuserID ) ĊĊĠĠĠĠĠ Ġif Ġ( tmp Opt . isPresent ) ĊĠĠĠĠĠĠĠ Ġupdate JobStatus ( tmp Opt . get ()) ĊĊĠĠĠĠĠ Ġreturn Ġtmp Opt ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetAll Reports For Job ( job ID : ĠHash ID ): ĠList < Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: getAll Reports For Job ( job ID ={ })", Ġjob ID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ ĊĠĠĠĠĠ Ġval Ġout Ġ= Ġit . get Job Reports ( job ID ) ĊĊĠĠĠĠĠ Ġfor Ġ( rep Ġin Ġout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rep . status Ġ== ĠJob Status . Queued Ġ|| Ġrep . status Ġ== ĠJob Status . InProgress ) ĊĠĠĠĠĠĠĠĠĠ Ġupdate JobStatus ( rep ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetUser Reports For Job ( job ID : ĠHash ID , ĠuserID : ĠLong ): ĠList < User Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: getUser Reports For Job ( job ID ={}, ĠuserID ={ })", Ġjob ID , ĠuserID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ ĊĠĠĠĠĠ Ġval Ġout Ġ= Ġit . getUser Job Reports ( job ID , ĠuserID ) ĊĊĠĠĠĠĠ Ġfor Ġ( rep Ġin Ġout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rep . status Ġ== ĠJob Status . Queued Ġ|| Ġrep . status Ġ== ĠJob Status . InProgress ) ĊĠĠĠĠĠĠĠĠĠ Ġupdate JobStatus ( rep ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetAll Reports ForUser ( userID : ĠLong ): ĠList < User Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: getAll Reports ForUser ( userID ={ })", ĠuserID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ ĊĠĠĠĠĠ Ġval Ġout Ġ= Ġit . getUser Job Reports ( userID ) ĊĊĠĠĠĠĠ Ġfor Ġ( rep Ġin Ġout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rep . status Ġ== ĠJob Status . Queued Ġ|| Ġrep . status Ġ== ĠJob Status . InProgress ) ĊĠĠĠĠĠĠĠĠĠ Ġupdate JobStatus ( rep ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUpdates Ġthe Ġjob Ġstatus Ġfield Ġfor Ġa Ġreport Ġjob Ġmatching Ġthe Ġgiven Ġreport ĊĠĠ Ġ* Ġhash . ĊĠĠ Ġ* Ġ< p > ĊĠĠ Ġ* ĠIf Ġno Ġsuch Ġreport Ġexists , Ġthis Ġmethod Ġupdates Ġnothing Ġand Ġreturns Ġan Ġempty ĊĠĠ Ġ* Ġoption . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġreport ID ĠID Ġof Ġthe Ġreport Ġjob Ġto Ġhave Ġit 's Ġstatus Ġupdated . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠAn Ġoption Ġcontaining Ġthe Ġupdated Ġrow , Ġif Ġsuch Ġa Ġrow Ġexists , Ġor Ġelse ĊĠĠ Ġ* Ġan Ġempty Ġoption Ġif Ġno Ġjob Ġwith Ġthe Ġgiven Ġhash Ġwas Ġfound . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġupdate JobStatus IfExists ( report ID : ĠHash ID ): ĠOptional < Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: update JobStatus IfExists ( report ID ={ })", Ġreport ID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ ĊĠĠĠĠĠ Ġval Ġopt Row Ġ= Ġit . get Report Job ( report ID ) ĊĊĠĠĠĠĠ Ġif Ġ( opt Row . isEmpty ) ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . empty () ĊĊĠĠĠĠĠ Ġrefresh JobStatus ( it , Ġopt Row . get ()) ĊĊĠĠĠĠĠ Ġreturn ĠOptional . of ( opt Row . get ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUpdates Ġthe Ġjob Ġstatus Ġfield Ġfor Ġthe Ġgiven Ġreport Ġjob . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġrow ĠReport Ġjob Ġrow Ġto Ġupdate . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġupdate JobStatus ( row : ĠReport Row ) Ġ{ ĊĠĠĠ ĠLog . trace (" :: update JobStatus ( row ={ })", Ġrow ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ Ġrefresh JobStatus ( it , Ġrow ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Report Files ( row : ĠReport Row ): ĠList < String > Ġ{ ĊĠĠĠ ĠLog . trace (" :: get Report Files ( row ={ })", Ġrow ) ĊĊĠĠĠ Ġif Ġ(! Job DataManager . workspace Exists ( row . job ID )) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠ Ġval Ġws Ġ= ĠJob DataManager . job Workspace ( row . job ID ) ĊĊĠĠĠ Ġif Ġ(! ws . report Workspace Exists ( row . report ID )) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠ Ġval Ġr ws Ġ= Ġws . report Workspace ( row . report ID ) ĊĊĠĠĠ Ġif Ġ(! r ws . report Meta Exists ) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠ Ġreturn Ġr ws . meta . files ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠLooks Ġup Ġa Ġreport Ġby ĠID Ġand Ġlinks Ġthe Ġgiven Ġuser Ġto Ġthe Ġreport Ġif Ġthey Ġwere ĊĠĠ Ġ* Ġnot Ġalready Ġlinked Ġto Ġthe Ġspecified Ġreport Ġjob . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġreport ID ĠID Ġof Ġthe Ġreport Ġjob Ġto Ġlook Ġup . ĊĠĠ Ġ* Ġ@ param ĠuserID ĠĠ ĠID Ġof Ġthe Ġuser Ġto Ġoptionally Ġlink Ġto Ġthe Ġreport . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠAn Ġoption Ġthat Ġwill Ġcontain Ġa Ġuser Ġreport Ġrow Ġfor Ġthe Ġgiven Ġuser Ġid ĊĠĠ Ġ* Ġif Ġsuch Ġa Ġjob Ġexists . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget And Link Report ( report ID : ĠHash ID , ĠuserID : ĠLong ): ĠOptional < User Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: get And Link Report ( report ID ={}, ĠuserID ={ })", Ġreport ID , ĠuserID ) ĊĊĠĠĠ ĠReport DB Manager (). use Ġ{ Ġdb Ġ-> ĊĠĠĠĠĠ Ġval Ġuser Row Ġ= Ġdb . getUser Report Job ( report ID , ĠuserID ) ĊĊĠĠĠĠĠ Ġif Ġ( user Row . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh JobStatus ( db , Ġuser Row . get ()) ĊĠĠĠĠĠĠĠ ĠLog . debug (" Job Ġstatus Ġ= Ġ${ user Row . get (). status }") ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Row ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġhere , Ġthen Ġwe Ġdon 't Ġyet Ġknow Ġif Ġthe Ġreport Ġjob Ġeven Ġexists . ĊĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġthe Ġjob 's Ġexistence . ĊĠĠĠĠĠ Ġval Ġraw Row Ġ= Ġdb . get Report Job ( report ID ) ĊĊĠĠĠĠĠ Ġ// ĠReport Ġdoesn 't Ġexist . ĊĠĠĠĠĠ Ġif Ġ( raw Row . isEmpty ) ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . empty () ĊĊĠĠĠĠĠ Ġ// ĠReport Ġexists , Ġso Ġlets Ġlink Ġthe Ġuser Ġto Ġit . ĊĠĠĠĠĠ Ġdb . link User To Report ( report ID , ĠuserID , Ġnull ) ĊĊĠĠĠĠĠ Ġval Ġraw Ġ= Ġraw Row . get () ĊĊĠĠĠĠĠ Ġrefresh JobStatus ( db , Ġraw ) ĊĠĠĠĠĠ ĠLog . debug (" Job Ġstatus Ġ= Ġ${ raw . status }") ĊĊĠĠĠĠĠ Ġreturn ĠOptional . of ( User Report Row ( ĊĠĠĠĠĠĠĠ Ġreport ID , ĊĠĠĠĠĠĠĠ Ġraw . job ID , ĊĠĠĠĠĠĠĠ Ġraw . status , ĊĠĠĠĠĠĠĠ Ġraw . config , ĊĠĠĠĠĠĠĠ Ġraw . queue ID , ĊĠĠĠĠĠĠĠ Ġraw . created On , ĊĠĠĠĠĠĠĠ ĠuserID , ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġrer un Job ( report ID : ĠHash ID , ĠuserID : ĠLong ): ĠOptional < User Report Row > Ġ{ ĊĠĠĠ ĠLog . trace (" :: rer un Job ( report ID ={}, ĠuserID ={ })", Ġreport ID , ĠuserID ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ Ġdb Ġ-> ĊĠĠĠĠĠ Ġ// ĠSee Ġif Ġthe Ġjob Ġalready Ġexists Ġfor Ġthis Ġuser ĊĠĠĠĠĠ Ġval Ġtry 1 Ġ= Ġdb . getUser Report Job ( report ID , ĠuserID ) ĊĊĠĠĠĠĠ Ġif Ġ( try 1 . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġis Ġalready Ġlinked Ġto Ġthe Ġjob ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġtry 1 . get () ĊĊĠĠĠĠĠĠĠ Ġrefresh JobStatus ( db , Ġjob ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġjob Ġisn 't Ġexpired , Ġthen Ġthere 's Ġnothing Ġto Ġdo . ĊĠĠĠĠĠĠĠ Ġif Ġ( job . status Ġ!= ĠJob Status . Expired ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠSubmit Ġthe Ġjob Ġto Ġbe Ġre - run ĊĠĠĠĠĠĠĠ Ġval Ġqueue ID Ġ= ĠReport Queue Manager . submit New Job ( Report Payload ( ĊĠĠĠĠĠĠĠĠĠ Ġjob . job ID , ĊĠĠĠĠĠĠĠĠĠ Ġjob . report ID , ĊĠĠĠĠĠĠĠĠĠ Ġjob . config ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġan Ġupdated Ġjob Ġrow ĊĠĠĠĠĠĠĠ Ġjob . status Ġ Ġ= ĠJob Status . Queued ĊĠĠĠĠĠĠĠ Ġjob . queue ID Ġ= Ġqueue ID ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe ĠDB ĊĠĠĠĠĠĠĠ Ġdb . update Report Row ( job ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . of ( job ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠJob Ġdoesn 't Ġexist ĠOR Ġuser Ġis Ġnot Ġlinked Ġto Ġjob . ĊĊĠĠĠĠĠ Ġ// ĠTry Ġto Ġload Ġthe Ġjob . ĊĠĠĠĠĠ Ġval Ġtry 2 Ġ= Ġdb . get Report Job ( report ID ) ĊĊĠĠĠĠĠ Ġif Ġ( try 2 . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġtry 2 . get () ĊĊĠĠĠĠĠĠĠ Ġdb . link User To Report ( report ID , ĠuserID , Ġnull ) ĊĠĠĠĠĠĠĠ Ġrefresh JobStatus ( db , Ġraw ) ĊĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠUser Report Row ( raw , ĠuserID , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠJob Ġisn 't Ġexpired , Ġnothing Ġto Ġdo . ĊĠĠĠĠĠĠĠ Ġif Ġ( raw . status Ġ!= ĠJob Status . Expired ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠOptional . of ( job ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRes ub mit Ġthe Ġjob . ĊĠĠĠĠĠĠĠ Ġjob . status Ġ Ġ= ĠJob Status . Queued ĊĠĠĠĠĠĠĠ Ġjob . queue ID Ġ= ĠReport Queue Manager . submit New Job ( Report Payload ( job . job ID , Ġjob . report ID , Ġjob . config )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġjob Ġstatus Ġin Ġthe ĠDB . ĊĠĠĠĠĠĠĠ Ġdb . update Report Row ( job ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . of ( job ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠReport Ġjob Ġdoesn 't Ġexist , Ġreturn Ġempty . ĊĠĠĠĠĠ Ġreturn ĠOptional . empty () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreates Ġa Ġnew Ġreport Ġjob Ġfrom Ġthe Ġgiven Ġinformation . ĊĠĠ Ġ* Ġ< p > ĊĠĠ Ġ* ĠIf Ġa Ġjob Ġmatching Ġthe Ġdigest Ġof Ġthe Ġgiven Ġ{@ link ĠReport Job } Ġalready Ġexists , ĊĠĠ Ġ* Ġa Ġnew Ġjob Ġwill Ġnot Ġbe Ġcreated , Ġinstead Ġthe Ġrequesting Ġuser Ġwill Ġbe Ġlinked ĊĠĠ Ġ* Ġto Ġthe Ġexisting Ġjob . Ġ ĠIf Ġthe Ġmatching Ġjob Ġhas Ġexpired , Ġit Ġwill Ġbe Ġre queued . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġjob ĠConfiguration Ġfrom Ġwhich Ġa Ġreport Ġjob Ġshould Ġbe Ġcreated . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠA Ġrow Ġrepresenting Ġthe Ġnewly Ġcreated Ġreport Ġjob . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġnew Report Job ( job : ĠReport Job ): ĠUser Report Row Ġ{ ĊĠĠĠ ĠLog . trace (" :: new Report Job ( job ={ })", Ġjob ) ĊĠĠĠ ĠReport DB Manager (). use Ġ{ Ġdb Ġ-> ĊĠĠĠĠĠ Ġval Ġreport ID Ġ= Ġjob . get Report ID () ĊĠĠĠĠĠ Ġval Ġopt Old ĠĠ Ġ= Ġdb . get Report Job ( report ID ) ĊĊĠĠĠĠĠ Ġ// ĠSet Ġthe Ġarchive Ġto Ġthe Ġjob Ġid Ġfor Ġhashing . ĊĠĠĠĠĠ Ġ// ĊĠĠĠĠĠ Ġ// ĠWithout Ġthis Ġthere Ġwould Ġbe Ġhash Ġcollisions Ġfor Ġreport Ġjobs Ġacross ĊĠĠĠĠĠ Ġ// Ġdifferent Ġb last Ġjobs . ĊĠĠĠĠĠ Ġjob . config . archive File Ġ= Ġjob . job ID . string ĊĊĠĠĠĠĠ Ġ// ĠIf Ġa Ġreport Ġwith Ġour Ġhash Ġalready Ġexists ĊĠĠĠĠĠ Ġif Ġ( opt Old . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Job Ġ= Ġopt Old . get () ĊĊĠĠĠĠĠĠĠ Ġrefresh JobStatus ( db , Ġold Job ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġjob Ġis Ġexpired , Ġrer un Ġit Ġfor Ġthe Ġnew Ġrequesting Ġuser . ĊĠĠĠĠĠĠĠ Ġif Ġ( old Job . status Ġ== ĠJob Status . Expired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠQueue Ġthe Ġjob ĊĠĠĠĠĠĠĠĠĠ ĠReport Queue Manager . submit New Job ( Report Payload ( job . job ID , Ġjob . get Report ID (), Ġjob . config )) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġstatus Ġin Ġthe ĠDB ĊĠĠĠĠĠĠĠĠĠ Ġold Job . status Ġ= ĠJob Status . Queued ĊĠĠĠĠĠĠĠĠĠ Ġdb . update Report Row ( old Job ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġto Ġsee Ġif Ġthe Ġuser Ġis Ġalready Ġlinked Ġto Ġthe Ġreport Ġjob . ĊĠĠĠĠĠĠĠ Ġval Ġopt Full Ġ= Ġdb . getUser Report Job ( report ID , Ġjob . userID ) ĊĠĠĠĠĠĠĠ Ġif Ġ( opt Full . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfull Ġ= Ġopt Full . get () ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġuser Ġsubmitted Ġthe Ġnew Ġreport Ġjob Ġwith Ġa Ġdifferent ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġdescription Ġthan Ġlast Ġtime , Ġupdate Ġthe Ġdescription . ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( full . description Ġ!= Ġjob . description ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠUser Report Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . report ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . job ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . queue ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . created On , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull . userID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . update Report Description ( out ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġthe Ġdescription Ġhasn 't Ġchanged , Ġwe Ġcan Ġjust Ġreturn Ġthe Ġrow ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġfound . ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġfull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġreport Ġjob Ġexists , Ġbut Ġthe Ġuser Ġis Ġnot Ġlinked Ġto Ġit Ġyet . Ġ ĠLink ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġuser Ġto Ġthe Ġreport Ġjob Ġand Ġreturn Ġa Ġrecord Ġthat Ġhas Ġbeen Ġupdated ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġreflect Ġthe Ġuser Ġbeing Ġlinked . ĊĠĠĠĠĠĠĠ Ġdb . link User To Report ( report ID , Ġjob . userID , Ġjob . description ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠUser Report Row ( old Job , Ġjob . userID , Ġjob . description ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠNo Ġreport Ġwith Ġthat Ġhash Ġexists ĊĊĠĠĠĠĠ Ġval Ġqueue ID Ġ= ĠReport Queue Manager . submit New Job ( Report Payload ( ĊĠĠĠĠĠĠĠ Ġjob . job ID , ĊĠĠĠĠĠĠĠ Ġjob . get Report ID (), ĊĠĠĠĠĠĠĠ Ġjob . config ĊĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠ Ġval Ġrow Ġ= ĠUser Report Row ( ĊĠĠĠĠĠĠĠ Ġreport ID , ĊĠĠĠĠĠĠĠ Ġjob . job ID , ĊĠĠĠĠĠĠĠ ĠJob Status . Queued , ĊĠĠĠĠĠĠĠ Ġjob . config , ĊĠĠĠĠĠĠĠ Ġqueue ID , ĊĠĠĠĠĠĠĠ ĠOffset DateTime . now (), ĊĠĠĠĠĠĠĠ Ġjob . userID , ĊĠĠĠĠĠĠĠ Ġjob . description ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġdb . insert Report Row ( row ) ĊĠĠĠĠĠ Ġdb . link User To Report ( report ID , Ġjob . userID , Ġjob . description ) ĊĊĠĠĠĠĠ Ġreturn Ġrow ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġan Ġinput Ġstream Ġover Ġa Ġb last Ġreport 's Ġz ipped Ġoutput . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġjob ID ĠĠĠ ĠID Ġof Ġthe Ġreport Ġjob 's Ġparent Ġb last Ġjob . ĊĠĠ Ġ* Ġ@ param Ġreport ID ĠID Ġof Ġthe Ġreport Ġjob . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠAn Ġinput Ġstream Ġover Ġa Ġb last Ġreport 's Ġz ipped Ġoutput . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Report Zip ( job ID : ĠHash ID , Ġreport ID : ĠHash ID ): ĠInputStream Ġ{ ĊĠĠĠ ĠLog . trace (" :: get Report Zip ( job ID ={}, Ġreport ID ={ })", Ġjob ID , Ġreport ID ) ĊĠĠĠ Ġreturn ĠJob DataManager . job Workspace ( job ID ). report Workspace ( report ID ). zip Stream ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrefresh JobStatus ( db : ĠReport DB Manager , Ġrow : ĠReport Row ) Ġ{ ĊĠĠĠ ĠLog . trace (" :: update JobStatus ( db ={}, Ġrow ={ })", Ġdb , Ġrow ) ĊĊĠĠĠ Ġvar Ġstatus Ġ= ĠReport Queue Manager . get JobStatus ( row . queue ID ) ĊĊĠĠĠ ĠLog . debug (" Report Ġjob Ġqueue Ġstatus Ġ= Ġ{}", Ġstatus ) ĊĊĠĠĠ Ġif Ġ( status Ġ== ĠJob Status . Completed ) Ġ{ ĊĊĠĠĠĠĠ Ġif Ġ(! Job DataManager . workspace Exists ( row . job ID )) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . debug (" B last Ġjob Ġworkspace Ġdoes Ġnot Ġexist .") ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠJob Status . Expired ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġws Ġ= ĠJob DataManager . job Workspace ( row . job ID ) ĊĊĠĠĠĠĠ Ġif Ġ(! ws . report Workspace Exists ( row . report ID )) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . debug (" Report Ġjob Ġworkspace Ġdoes Ġnot Ġexist . Ġ${ row . report ID }") ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠJob Status . Expired ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( status Ġ!= Ġrow . status ) Ġ{ ĊĠĠĠĠĠ Ġrow . status Ġ= Ġstatus ĊĠĠĠĠĠ Ġdb . update Report Row ( row ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }