/* Ċ Ġ* ĠCopyright Ġ 2 0 1 2 - 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ ĉ http :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġorg . nex ial . core . logs Ċ Ċ import Ġorg . apache . commons . collections 4 . Collection Utils Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . nex ial . commons . utils . File Util Ċ import Ġorg . nex ial . commons . utils . Regex Utils Ċ import Ġorg . nex ial . core . N ex ial Const . DEF _ FILE _ ENCODING Ċ import Ġorg . nex ial . core . N ex ial Const . NL Ċ import Ġorg . nex ial . core . utils . Console Utils Ċ import Ġjava . io . File Ċ Ċ data Ġclass ĠStep Error ( val ĠdateTime : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscenario : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Type : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreenshot : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetail Log : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage : ĠString ) Ġ{ ĊĊĠĠĠ Ġfun Ġappend Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . message Ġ+= Ġ( if Ġ( message . isNotBlank ()) ĠNL Ġelse Ġ"") Ġ+ Ġmessage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Step Error ( dateTime ='$ dateTime '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t script ='$ script '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t scenario ='$ scenario '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t activity ='$ activity '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t step ='$ step '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t command Type ='$ command Type '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t command Name ='$ command Name '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t screenshot ='$ screenshot '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t detail Log ='$ detail Log '," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t message =' ${ message . replace ("\ n ", Ġ"( eol )") }') " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠStep Errors ( val Ġlog File : ĠFile ) Ġ{ ĊĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < Step Error >() ĊĠĠĠ Ġprivate Ġval Ġregex Log Format Ġ= Ġ"^ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġlog Ġdate / time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġscript ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġscenario ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġcommand Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġerror Ġscreenshot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ [( .+ ?) \\ ]" Ġ+ Ġ Ġ// Ġdetailed Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ :? \\ s *( .* )" Ġ+ Ġ// Ġlog Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ " ĊĠĠĠ Ġprivate Ġval Ġregex Runtime File Pattern Ġ= Ġ"\\ .\\ d { 8 }_ \\ d { 6 }\\ .[ 0 - 9 ~ ]+ ( \\. xlsx | \\. X LS X )$ " ĊĠĠĠ Ġval Ġhtml Table Class Ġ= Ġ" execution - errors " ĊĠĠĠ Ġval Ġhtml Table Columns Ġ= ĠlistOf (" date / time ", Ġ" script ", Ġ" scenario ", Ġ" activity ", Ġ" step ", Ġ" command ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" screenshot ", Ġ" details ", Ġ" message ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( File Util . isFile Readable ( log File , Ġ 3 2 )) Ġparse ( FileUtils . read Lines ( log File , ĠDEF _ FILE _ ENCODING )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse ( logs : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Error : ĠStep Error ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlogs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . isBlank ( line )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Parts Ġ= ĠRegex Utils . collect Groups ( line , Ġregex Log Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Collection Utils . size ( log Parts ) Ġ!= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġfitting Ġto Ġthe Ġexpected Ġlog Ġformat : Ġwe 'd Ġassume Ġthis Ġline Ġis Ġthe Ġble ed - over Ġfrom Ġprevious Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error . append Message ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġh mm ... Ġthis Ġmeans Ġwe Ġhave Ġa Ġd angling Ġmessage Ġas Ġfirst Ġline ?! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsole Utils . error (" Unable Ġto Ġparse / handle Ġerror Ġlog : Ġ$ line ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error Ġ= ĠStep Error ( dateTime Ġ= Ġlog Parts [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ= Ġextract Script Name ( log Parts [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenario Ġ= Ġlog Parts [ 2 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ= Ġlog Parts [ 3 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġlog Parts [ 4 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Type Ġ= Ġlog Parts [ 5 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Name Ġ= Ġlog Parts [ 6 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreenshot Ġ= ĠStringUtils . trim ( log Parts [ 7 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Log Ġ= ĠStringUtils . trim ( log Parts [ 8 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠStringUtils . remove Start ( log Parts [ 9 ], Ġ": Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( last Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate HTML ( header : ĠString , Ġfooter : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhtml Ġ= ĠStringBuilder ( header ) ĊĠĠĠĠĠĠĠ Ġhtml . append ("< table Ġwidth =\" 1 0 0 % \" Ġclass =\" $ html Table Class \" Ġcellspacing =\" 0 \"> ") ĊĠĠĠĠĠĠĠ Ġhtml . append ("< thead >< tr >${ html Table Columns . join ToString ("") Ġ{ Ġ"< th Ġnowrap >$ it </ th >" Ġ}}</ tr ></ thead >") ĊĠĠĠĠĠĠĠ Ġhtml . append ("< tbody >") ĊĠĠĠĠĠĠĠ Ġhtml . append ( errors . join ToString ("") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< tr >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . dateTime }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . script }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . scenario }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . activity }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . step }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġnowrap >${ it . command Type } Ġ& raquo ; Ġ${ it . command Name }</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td >${ to Html Anchor (" screenshot ", Ġit . screenshot )}</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td >${ to Html Anchor (" details ", Ġit . detail Log )}</ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< td Ġwidth =\" 1 0 0 %\ ">< pre >${ StringUtils . trim ( it . message )}</ pre ></ td >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"</ tr >" ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġhtml . append ("</ tbody ></ table >") ĊĠĠĠĠĠĠĠ Ġhtml . append ( footer ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhtml . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Script Name ( script FileName : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStringUtils . trim ( Regex Utils . replace ( script FileName , Ġregex Runtime File Pattern , Ġ"")) ĊĊĠĠĠ Ġprivate Ġfun Ġto Html Anchor ( label : ĠString , Ġlink : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . isBlank () Ġ|| Ġlink Ġ== Ġ"- ") Ġ"& nbsp ;" Ġelse Ġ"< a Ġhref =\" $ link \"> $ label </ a >" Ċ }