/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠO sc ar ĠDavid ĠG all on ĠRos ero Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . osc arg 7 9 8 . ami ib ow iki . logger decorator processor . function creator Ċ Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . logger decorator processor . builder . Method Decorator Ċ import Ġcom . osc arg 7 9 8 . lom eno . event . Log Source Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ Ċ abstract Ġclass ĠAbstract Function Creator < Decorator Ġ: ĠMethod Decorator > Ġ: ĠFunction Creator < Decorator > Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġget Method Statement ( method Decorator : ĠDecor ator ): ĠString ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ( method Decorator : ĠDecor ator ): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfun Builder Ġ= Ġget Fun Spec Builder ( method Decorator ) ĊĠĠĠĠĠĠĠ Ġadd Properties ( fun Builder , Ġmethod Decorator ) ĊĠĠĠĠĠĠĠ Ġadd ReturnType ( fun Builder , Ġmethod Decorator ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfun Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget Sources Statement ( sources : ĠSet < Log Source >? ): ĠString Ġ= Ġif Ġ( sources Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġsources = set Of < Log Source > (${ sources . join ToString (",") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . java Class . name ĊĠĠĠĠĠĠĠ Ġ}}) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Fun Spec Builder ( method Decorator : ĠDecor ator ) Ġ= ĊĠĠĠĠĠĠĠ ĠFun Spec . builder ( method Decorator . methodName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PUBLIC , ĠK Modifier . OVERRIDE ) ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġadd Properties ( fun Spec Builder : ĠFun Spec . Builder , Ġmethod Decorator : ĠDecor ator ) Ġ= ĊĠĠĠĠĠĠĠ Ġmethod Decorator . properties Name ?. let Ġ{ Ġproperties Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Spec Builder . add Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap :: class . parameter ized By ( String :: class , ĠString :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd ReturnType ( ĊĠĠĠĠĠĠĠ Ġfun Builder : ĠFun Spec . Builder , ĊĠĠĠĠĠĠĠ Ġmethod Decorator : ĠDecor ator ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Builder . returns ( Unit :: class . java ObjectType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ( getMethod Statement ( method Decorator )) ĊĠĠĠ Ġ} Ċ } Ċ