@ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ Ċ package Ġru . in for ion . lab 4 0 3 . common . logging . logger Ċ Ċ import Ġru . in for ion . lab 4 0 3 . common . logging .* Ċ import Ġru . in for ion . lab 4 0 3 . common . logging . publish ers . Abstract Publisher Ċ import Ġjava . util . logging . Level Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠLogger Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġ@ Jvm Field Ġvar Ġlevel : ĠLogLevel , ĊĠĠĠ Ġvar Ġflush On Publish : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġvar arg Ġpublish ers : ĠAbstract Publisher Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTACK _ TRACE _ CALL ER _ INDEX Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġruntime Ġ= ĠRuntime . get Runtime () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠShutdown Ġhook Ġto Ġflush Ġall Ġlog gers Ġwhen Ġprogram Ġexit ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġshutdown Hook Ġ= Ġthread ( false ) Ġ{ Ġflush () Ġ}. also Ġ{ Ġruntime . add Shutdown Hook ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAll Ġalready Ġcreated Ġlog gers ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog gers Ġ= Ġmutable Map Of < String , ĠLogger >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLevel s Ġconfiguration Ġloaded Ġfrom ĠJSON - file Ġspecified Ġby Ġenvironment Ġvariable ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlevels Ġ= ĠConfig () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠExecute Ġgiven Ġ[ action ] Ġfor Ġeach Ġknown Ġlogger ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaction Ġis Ġaction Ġto Ġexecute ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 3 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠforEach ( action : Ġ( logger : ĠLogger ) Ġ-> ĠUnit ) Ġ= Ġapply Ġ{ Ġlog gers . values . forEach ( action ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠExecute Ġgiven Ġ[ action ] Ġfor Ġeach Ġknown Ġlogger ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġaction Ġis Ġaction Ġto Ġexecute ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 3 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠonCreate ( action : Ġ( logger : ĠLogger ) Ġ-> ĠUnit ) Ġ= Ġapply Ġ{ Ġcallbacks . add ( action ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallbacks Ġ= Ġmutable ListOf < Logger Action Callback >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġnew Ġlogger Ġby Ġname Ġwith Ġspecified Ġpublish ers Ġor Ġget Ġit Ġ( logger ) Ġif Ġit Ġalready Ġexist Ġfor Ġthe Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNOTE : Ġthis Ġfunction Ġis Ġmore Ġlikely Ġinternal ĠAPI , Ġplease Ġuse Ġfunctions Ġfrom Ġ' log gers . kt ' ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname Ġname Ġof Ġthe Ġnew Ġlogger ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġlevel Ġof Ġlogging Ġmessage Ġbelow Ġit Ġwill Ġnot Ġbe Ġpublished ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpublish ers Ġlist Ġof Ġpublish ers ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( name : ĠString , Ġlevel : ĠLogLevel , Ġflush : ĠBoolean , Ġvar arg Ġpublish ers : ĠAbstract Publisher ) Ġ= Ġlog gers . get Or Put ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġlevels [ name , Ġlevel ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger ( name , Ġactual , Ġflush , Ġ* publish ers ). apply Ġ{ Ġcallbacks . forEach Ġ{ Ġit . invoke ( this ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġnew Ġlogger Ġby Ġclass Ġwith Ġspecified Ġpublish ers Ġor Ġget Ġit Ġ( logger ) Ġif Ġit Ġalready Ġexist Ġfor Ġthe Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNOTE : Ġthis Ġfunction Ġis Ġmore Ġlikely Ġinternal ĠAPI , Ġplease Ġuse Ġfunctions Ġfrom Ġ' log gers . kt ' ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġklass Ġclass Ġto Ġuse Ġto Ġget Ġname Ġof Ġthe Ġnew Ġlogger ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġlevel Ġof Ġlogging Ġmessage Ġbelow Ġit Ġwill Ġnot Ġbe Ġpublished ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpublish ers Ġlist Ġof Ġpublish ers ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate ( klass : ĠClass < T >, Ġlevel : ĠLogLevel , Ġflush : ĠBoolean , Ġvar arg Ġpublish ers : ĠAbstract Publisher ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ( klass . simple Name , Ġlevel , Ġflush , Ġ* publish ers ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġnew Ġpublisher Ġto Ġall Ġlog gers ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpublisher Ġpublisher Ġto Ġadd ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Publisher ( publisher : ĠAbstract Publisher ) Ġ= Ġlog gers . values . forEach Ġ{ Ġit . add Publisher ( publisher ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRemove Ġpublisher Ġfrom Ġall Ġlog gers ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpublisher Ġpublisher Ġto Ġremove ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġremove Publisher ( publisher : ĠAbstract Publisher ) Ġ= Ġlog gers . values . forEach Ġ{ Ġit . remove Publisher ( publisher ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFlush Ġall Ġpublish ers Ġof Ġall Ġlog gers ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġflush () Ġ= Ġlog gers . values . forEach Ġ{ Ġit . flush () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandlers Ġ= Ġpublish ers . to Mutable Set () ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġname ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġnew Ġpublisher Ġto Ġlogger ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpublisher Ġpublisher Ġto Ġadd ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Publisher ( publisher : ĠAbstract Publisher ) Ġ= Ġhandlers . add ( publisher ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġpublisher Ġto Ġlogger ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpublisher Ġpublisher Ġto Ġremove ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Publisher ( publisher : ĠAbstract Publisher ) Ġ= Ġhandlers . remove ( publisher ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlush Ġall Ġpublish ers Ġof Ġlogger ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflush () Ġ= Ġhandlers . forEach Ġ{ Ġit . flush () Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġlog ( level : ĠLogLevel , Ġflush : ĠBoolean , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= ĠThread . currentThread (). stack Trace [ STACK _ TRACE _ CALL ER _ INDEX ] ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠRecord ( this , Ġlevel , Ġtimestamp , Ġcaller ) ĊĠĠĠĠĠĠĠ Ġhandlers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . publish ( message , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flush Ġ|| Ġflush On Publish ) Ġit . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġmessage Ġusing Ġdefined Ġpublish ers Ġin Ġlogger ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġmessage Ġlog Ġlevel ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġforce Ġto Ġflush Ġthe Ġrecord Ġimmediately ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġmessage Ġsupplier ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : Any > Ġlog ( level : ĠLogLevel , Ġflush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . level Ġpermit Ġlevel ) Ġlog ( level , Ġflush , Ġmessage (). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" please Ġuse Ġlog ( level : ĠLogLevel , Ġ... )") ĊĠĠĠ Ġinline Ġfun Ġ< T : Any > Ġlog ( level : ĠLevel , Ġflush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= ĊĠĠĠĠĠĠĠ Ġlog ( level . logLevel (), Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġsever e Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġsever e ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( SEVERE , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġwarning Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 9 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġwarning ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( WARNING , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġinfo Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 8 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġinfo ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( INFO , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġconfig Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 7 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġconfig ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( CONFIG , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġfine Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 5 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġfine ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( F INE , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġfin er Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 4 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġfin er ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( FIN ER , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġfin est Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 3 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġfin est ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( F INE ST , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġdebug Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 2 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġdebug ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( DEBUG , Ġflush , Ġmessage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġa Ġlazy Ġtrace Ġlog Ġ[ message ] Ġ( score Ġ= Ġ 1 0 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflush Ġif Ġtrue Ġor Ġ[ flush On Publish ] Ġis Ġtrue Ġmessage Ġwill Ġbe Ġemitted Ġimmediately ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 2 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< T : ĠAny > Ġtrace ( flush : ĠBoolean Ġ= Ġfalse , Ġmessage : ĠMess enger < T >) Ġ= Ġlog ( TRACE , Ġflush , Ġmessage ) Ċ }