@ file : Suppress (" Matching Declaration Name ") Ċ Ċ package Ġru . it basis . kotlin . utils . properties Ċ Ċ import Ġk log . K Logger Holder Ċ import Ġk log . With Logging Ċ import Ġru . it basis . kotlin . utils . to Boolean Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ /** Ċ Ġ* ĠParameters Ġcan Ġbe Ġpassed Ġas Ġenvironment Ġvariables . Ċ Ġ* ĠFor Ġexample , Ġif Ġ[ prefix ] Ġis Ġ" PRE " Ġand Ġthe Ġfield Ġname Ġis Ġ" my FieldName ", Ċ Ġ* Ġthen Ġthe Ġenvironment Ġwill Ġlook Ġfor Ġa Ġparameter Ġnamed Ġ" PRE _ MY _ FIELD _ NAME " Ċ Ġ* Ġ@ param Ġsecurity Ġif ĠTRUE , Ġthen Ġthe Ġparameter Ġis Ġhidden Ġwhen Ġprinted Ġin Ġthe Ġlogger Ġ( See Ġ[ Property Delegate . setValue ]) Ċ Ġ*/ Ċ fun Ġ< T > ĠAny . lazy Property ( ĊĠ Ġprefix : ĠString ? Ġ= Ġnull , ĊĠ Ġsecurity : ĠBoolean Ġ= Ġfalse , ĊĠ ĠdefaultValue : Ġ(() Ġ-> ĠT )? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠProperty Delegate < T > Ġ= ĠProperty Delegate ( this , Ġprefix , Ġsecurity , ĠdefaultValue ) Ċ Ċ class ĠProperty Delegate < T >( ĊĠ Ġprivate Ġval Ġself : ĠAny , ĊĠ Ġprivate Ġval Ġprefix : ĠString ? Ġ= Ġnull , ĊĠ Ġprivate Ġval Ġsecurity : ĠBoolean , ĊĠ Ġprivate Ġvar Ġinitializer : Ġ(() Ġ-> ĠT )? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ: ĠWith Logging Ġby ĠK Logger Holder (), ĠRead Write Property < Any ?, ĠT > Ġ{ ĊĊĠ Ġprivate Ġvar Ġvalue : ĠT ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun ĠgetValue ( ĊĠĠĠ Ġthis Ref : ĠAny ?, ĊĠĠĠ Ġproperty : ĠK Property < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenv Name Ġ= Ġ( if Ġ( prefix . isNull OrEmpty ()) Ġproperty . name Ġelse Ġ"${ prefix }_${ property . name } "). replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREG EXP _ ENV _ NAME _ UNDER SCORE , Ġ"_ $ 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" find Ġenvironment Ġvariable Ġ'$ env Name '" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsys Env Value : ĠString ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperties (). containsKey ( env Name ) Ġ-> ĠSystem . getProperty ( env Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv (). containsKey ( env Name ) ĠĠĠĠĠĠĠ Ġ-> ĠSystem . getenv ()[ env Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ"$ env Name =$ sys Env Value " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ", Ġ" IMP LICIT _ CAST _ TO _ ANY ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenv Value Ġ= Ġsys Env Value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġproperty . returnType . jvm Er asure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( returnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class Ġ Ġ-> Ġsys Env Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class Ġ-> Ġsys Env Value . to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class ĠĠĠ Ġ-> Ġsys Env Value . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class ĠĠĠĠ Ġ-> Ġsys Env Value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble :: class Ġ Ġ-> Ġsys Env Value . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class ĠĠ Ġ-> Ġsys Env Value . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort :: class ĠĠ Ġ-> Ġsys Env Value . to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte :: class ĠĠĠ Ġ-> Ġsys Env Value . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠIllegalStateException (" unsupported Ġdata Ġtype Ġfrom Ġfield : Ġ${ property . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ? ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ref , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġinitializer ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ@ Suppress (" Max Line Length ") Ġthrow ĠIllegalStateException (" For Ġthe Ġfield Ġ'${ property . name }' Ġvalue Ġhas Ġnot Ġbeen Ġfound Ġ- Ġnot Ġfound Ġan Ġenvironment Ġvariable Ġ'$ env Name ' Ġor Ġdefault ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġvalue !! ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Suppress (" IMP LICIT _ CAST _ TO _ ANY ") ĊĠ Ġoverride Ġfun ĠsetValue ( ĊĠĠĠ Ġthis Ref : ĠAny ?, ĊĠĠĠ Ġproperty : ĠK Property <* >, ĊĠĠĠ Ġvalue : ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġlog . debug Ġ{ Ġ"${ property . name } =${ if Ġ( security ) Ġ"< PROTECT ED ĠDATA >" Ġelse Ġvalue }" Ġ} ĊĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval ĠREG EXP _ ENV _ NAME _ UNDER SCORE Ġ= Ġ"( ? <= . )( ?< ![ A - Z _ ]) ([ A - Z ]) ". to Regex () ĊĠ Ġ} Ċ } Ċ