/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAt Large ĠResearch Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . opend c . trace . sw f Ċ Ċ import Ġorg . opend c . trace .* Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Table Reader ] Ġimplementation Ġfor Ġthe ĠSW F Ġformat . Ċ Ġ*/ Ċ internal Ġclass ĠSw f Task Table Reader ( private Ġval Ġreader : ĠBufferedReader ) Ġ: ĠTable Reader Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġrow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġfields Ġ= Ġempty List < String >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Regex ] Ġobject Ġto Ġmatch Ġwhitespace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġwhitespace Ġ= Ġ"\\ s +". to Regex () ĊĊĠĠĠ Ġoverride Ġfun Ġnext Row (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ĊĠĠĠĠĠĠĠ Ġvar Ġnum Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġreader . readLine () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġempty Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line . startsWith ("; ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġcomments Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfields Ġ= Ġline . trim (). split ( whitespace ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fields . size Ġ< Ġ 1 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġformat Ġat Ġline Ġ$ line ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve ( column : ĠTable Column < *> ): ĠInt Ġ= Ġcolumns [ column ] Ġ?: Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġis Null ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġin Ġcolumns . values ) Ġ{ Ġ" Invalid Ġcolumn Ġindex " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ JOB _ ID Ġ-> Ġfields [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ SUBMIT _ TIME Ġ-> ĠInstant . of Epoch Second ( fields [ index ]. to Long ( 1 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ WAIT _ TIME , ĠCOL _ RUN _ TIME Ġ-> ĠDuration . of Seconds ( fields [ index ]. to Long ( 1 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ REQ _ N CP US , ĠCOL _ ALLOC _ N CP US , ĠCOL _ STATUS , ĠCOL _ GROUP _ ID , ĠCOL _ USER _ ID Ġ-> Ġget Int ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ PARENT _ JOB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġfields [ index ]. to Long ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ< Ġ 0 ) Ġempty Set () Ġelse Ġset Of ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġcolumn ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Boolean ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġcolumn ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Int ( index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOL _ REQ _ N CP US , ĠCOL _ ALLOC _ N CP US , ĠCOL _ STATUS , ĠCOL _ GROUP _ ID , ĠCOL _ USER _ ID Ġ-> Ġfields [ index ]. toInt ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġcolumn ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Long ( index : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġcolumn ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Double ( index : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġcolumn ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġcolumn Ġindices Ġfor Ġthe ĠSW F Ġformat . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠCOL _ JOB _ ID Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval ĠCOL _ SUBMIT _ TIME Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġval ĠCOL _ WAIT _ TIME Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġval ĠCOL _ RUN _ TIME Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġval ĠCOL _ ALLOC _ N CP US Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġval ĠCOL _ AVG _ CPU _ TIME Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġval ĠCOL _ USED _ MEM Ġ= Ġ 6 ĊĠĠĠ Ġprivate Ġval ĠCOL _ REQ _ N CP US Ġ= Ġ 7 ĊĠĠĠ Ġprivate Ġval ĠCOL _ REQ _ TIME Ġ= Ġ 8 ĊĠĠĠ Ġprivate Ġval ĠCOL _ REQ _ MEM Ġ= Ġ 9 ĊĠĠĠ Ġprivate Ġval ĠCOL _ STATUS Ġ= Ġ 1 0 ĊĠĠĠ Ġprivate Ġval ĠCOL _ USER _ ID Ġ= Ġ 1 1 ĊĠĠĠ Ġprivate Ġval ĠCOL _ GROUP _ ID Ġ= Ġ 1 2 ĊĠĠĠ Ġprivate Ġval ĠCOL _ EXEC _ NUM Ġ= Ġ 1 3 ĊĠĠĠ Ġprivate Ġval ĠCOL _ QUEUE _ NUM Ġ= Ġ 1 4 ĊĠĠĠ Ġprivate Ġval ĠCOL _ PART _ NUM Ġ= Ġ 1 5 ĊĠĠĠ Ġprivate Ġval ĠCOL _ PARENT _ JOB Ġ= Ġ 1 6 ĊĠĠĠ Ġprivate Ġval ĠCOL _ PARENT _ TH INK _ TIME Ġ= Ġ 1 7 ĊĊĠĠĠ Ġprivate Ġval Ġcolumns Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠTASK _ ID Ġto ĠCOL _ JOB _ ID , ĊĠĠĠĠĠĠĠ ĠTASK _ SUBMIT _ TIME Ġto ĠCOL _ SUBMIT _ TIME , ĊĠĠĠĠĠĠĠ ĠTASK _ WAIT _ TIME Ġto ĠCOL _ WAIT _ TIME , ĊĠĠĠĠĠĠĠ ĠTASK _ RUNTIME Ġto ĠCOL _ RUN _ TIME , ĊĠĠĠĠĠĠĠ ĠTASK _ ALLOC _ N CP US Ġto ĠCOL _ ALLOC _ N CP US , ĊĠĠĠĠĠĠĠ ĠTASK _ REQ _ N CP US Ġto ĠCOL _ REQ _ N CP US , ĊĠĠĠĠĠĠĠ ĠTASK _ STATUS Ġto ĠCOL _ STATUS , ĊĠĠĠĠĠĠĠ ĠTASK _ USER _ ID Ġto ĠCOL _ USER _ ID , ĊĠĠĠĠĠĠĠ ĠTASK _ GROUP _ ID Ġto ĠCOL _ GROUP _ ID , ĊĠĠĠĠĠĠĠ ĠTASK _ PARENT S Ġto ĠCOL _ PARENT _ JOB ĊĠĠĠ Ġ) Ċ } Ċ