package Ġru . f om enk ov . rx dis posable watcher . report Ċ Ċ import Ġru . f om enk ov . rx dis posable watcher . Probe Entry Ċ import Ġru . f om enk ov . rx dis posable watcher . Source Type Ċ Ċ class ĠHtml Report Builder ( ĊĠĠĠ Ġprivate Ġval Ġprobe : ĠList < Probe Entry >, ĊĠĠĠ Ġprivate Ġval Ġreduced BlockSize : ĠInt Ġ= ĠDEFAULT _ RED UC ED _ BLOCK _ SIZE Ċ ) Ġ: ĠReport Builder < String > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtemplate : ĠTemplate ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtemplate Ġ= ĠTemplate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġjava Class . getResource ( TEMPLATE _ LINE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Text (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġjava Class . getResource ( TEMPLATE _ BLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Text (). lines (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ= Ġjava Class . getResource ( TEMPLATE _ REPORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Text (). lines () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġprobe . sum By Ġ{ Ġit . entries Ġ} ĊĊĠĠĠĠĠĠĠ Ġprobe . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġget Color ( item . source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetails Ġ= Ġget Details ( item . source , Ġitem . entries ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . stack Trace . elements (). forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines Ġ+= Ġcreate Line ("${ element . className }.${ element . method }:${ element . line }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocks Ġ+= Ġcreate Block ( lines , Ġreduced BlockSize , Ġcolor , Ġdetails ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Report ( blocks , Ġtotal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Details ( source Type : ĠSource Type , Ġentries : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ source Type . className }, Ġ$ entries Ġsubscription ( s ) Ġalive " ĊĊĠĠĠ Ġprivate Ġfun Ġget Color ( source Type : ĠSource Type ) Ġ= Ġwhen Ġ( source Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSource Type . OB SERV ABLE Ġ-> Ġ"# ffff 0 0 " ĊĠĠĠĠĠĠĠ ĠSource Type . SINGLE Ġ-> Ġ"# 3 3 ee 3 3 " ĊĠĠĠĠĠĠĠ ĠSource Type . COMP LE TABLE Ġ-> Ġ"# ffffff " ĊĠĠĠĠĠĠĠ ĠSource Type . MAYBE Ġ-> Ġ"# 5 5 5 5 ff " ĊĠĠĠĠĠĠĠ ĠSource Type . FLOW ABLE Ġ-> Ġ"# ff 0 0 0 0 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Report ( blocks : ĠList < String >, Ġtotal : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġitems Placeholder Index Ġ= Ġtemplate . report . indexOf First Ġ{ Ġit . contains ( PLACE HOLDER _ VALUE _ ITEMS ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck ( items Placeholder Index Ġ!= Ġ- 1 ) Ġ{ Ġ" Placeholder Ġ$ PLACE HOLDER _ VALUE _ ITEMS Ġnot Ġfound " Ġ} ĊĊĠĠĠĠĠĠĠ Ġtemplate . report . forEach Indexed Ġ{ Ġposition , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Placeholder Index Ġ-> Ġblocks . forEach Ġ{ Ġblock Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ block \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuilder . append ("$ item \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( PLACE HOLDER _ VALUE _ TOTAL , Ġtotal . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Block ( lines : ĠList < String >, Ġreduced Size : ĠInt , Ġcolor : ĠString , Ġdetails : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreduced Placeholder Index Ġ= Ġtemplate . block . indexOf First Ġ{ Ġit . contains ( PLACE HOLDER _ VALUE _ RED UC ED ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfull Placeholder Index Ġ= Ġtemplate . block . indexOf First Ġ{ Ġit . contains ( PLACE HOLDER _ VALUE _ FULL ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire ( color . startsWith ("# ")) Ġ{ Ġ" Color Ġvalue Ġmust Ġstart Ġwith Ġ# " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( lines . isNotEmpty ()) Ġ{ Ġ" No Ġlines Ġprovided " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( reduced Size Ġ> Ġ 0 ) Ġ{ Ġ" Value Ġfor Ġreduced Ġsize Ġmust Ġbe Ġ> Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( reduced Placeholder Index Ġ> Ġ 0 ) Ġ{ Ġ" Placeholder Ġ$ PLACE HOLDER _ VALUE _ RED UC ED Ġnot Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( full Placeholder Index Ġ> Ġ 0 ) Ġ{ Ġ" Placeholder Ġ$ PLACE HOLDER _ VALUE _ FULL Ġnot Ġfound " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreduc edList Ġ= Ġwhen Ġ( reduced Size Ġ>= Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlines . sub List ( 0 , Ġreduced Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġindentation Ġ= Ġtemplate . block [ reduced Placeholder Index ]. replace ( PLACE HOLDER _ VALUE _ RED UC ED , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġtemplate . block . forEach Indexed Ġ{ Ġposition , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduced Placeholder Index Ġ-> Ġreduc edList . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ indentation $ line \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Placeholder Index Ġ-> Ġlines . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ indentation $ line \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuilder . append ("$ item \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( PLACE HOLDER _ VALUE _ COLOR , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( PLACE HOLDER _ VALUE _ DETAILS , Ġdetails ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Line ( value : ĠString ) Ġ= Ġtemplate . line . replace ( PLACE HOLDER _ VALUE _ LINE , Ġvalue ) ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMPLATE _ DIR Ġ= Ġ"/ template " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMPLATE _ LINE Ġ= Ġ"$ TEMPLATE _ DIR / line . html " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMPLATE _ BLOCK Ġ= Ġ"$ TEMPLATE _ DIR / block . html " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMPLATE _ REPORT Ġ= Ġ"$ TEMPLATE _ DIR / report . html " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ LINE Ġ= Ġ"# value - line " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ COLOR Ġ= Ġ"# value - color " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ DETAILS Ġ= Ġ"# value - details " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ RED UC ED Ġ= Ġ"# value - reduced " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ FULL Ġ= Ġ"# value - full " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ TOTAL Ġ= Ġ"# value - total " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ VALUE _ ITEMS Ġ= Ġ"# value - items " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ RED UC ED _ BLOCK _ SIZE Ġ= Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠTemplate ( val Ġline : ĠString , Ġval Ġblock : ĠList < String >, Ġval Ġreport : ĠList < String >) Ċ }