/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 0 - 2 0 1 9 , ĠD ani lo ĠP ian ini Ġand Ġcontributors Ġlisted Ġin Ġthe Ġmain Ġproject 's Ġal che mist / build . gradle Ġfile . Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠAl che mist , Ġand Ġis Ġdistributed Ġunder Ġthe Ġterms Ġof Ġthe Ċ Ġ* ĠGNU ĠGeneral ĠPublic ĠLicense , Ġwith Ġa Ġlinking Ġexception , Ċ Ġ* Ġas Ġdescribed Ġin Ġthe Ġfile ĠLICENSE Ġin Ġthe ĠAl che mist Ġdistribution 's Ġtop Ġdirectory . Ċ Ġ*/ Ċ Ċ package Ġit . uni bo . al che mist Ċ Ċ import Ġcom . github . ben man es . caffe ine . cache . C affe ine Ċ import Ġcom . google . common . base . Objects Ċ import Ġio . github . class graph . Class Graph Ċ import Ġjava . io . InputStream Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjava . net . URL Ċ import Ġjava . util . regex . Pattern Ċ Ċ private Ġdata Ġclass ĠScan Data ( val ĠsuperClass : ĠClass <* >, Ġval Ġin Packages : ĠArray < out ĠString >) Ġ{ ĊĊĠĠĠ Ġval ĠhashCode Ġ= ĠObjects . hashCode ( super Class , Ġ* in Packages ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġ=== Ġthis Ġ|| ĊĠĠĠĠĠĠĠ Ġother Ġis ĠScan Data Ġ&& ĠsuperClass Ġ== Ġother . super Class Ġ&& Ġin Packages . content Equals ( other . in Packages ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĠhashCode ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Scan Data (${ super Class . simple Name }, Ġ${ in Packages . asList () })" Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġutility Ġclass Ġproviding Ġsupport Ġfor Ġloading Ġarbitrary Ġsubclasses Ġavailable Ġin Ġthe Ġclasspath . Ċ Ġ*/ Ċ object ĠClass Path Scanner Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġloader Ġ= ĠC affe ine . newBuilder (). build < Scan Data , ĠList < Class <* >>> Ġ{ Ġscan Data Ġ-> ĊĠĠĠĠĠĠĠ Ġclass Graph For Packages (* scan Data . in Packages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Class Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġscan Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scan Data . super Class . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Result . get Classes Implement ing ( scan Data . super Class . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Result . getSub classes ( scan Data . super Class . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . is Abstract Ġ}. load Classes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclass Graph For Packages ( var arg Ġin Package : ĠString ): ĠClass Graph Ġ= ĠClass Graph () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWH ITE LIST Ġpackage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Packages (* in Package ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBLACK LIST Ġpackage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreject Packages (" org . gradle ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġloads Ġall Ġsub types Ġof Ġthe Ġprovided ĠJava Ġclass Ġthat Ġcan Ġbe Ġdiscovered Ġon Ġthe Ġcurrent Ġclasspath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcannot Ġuse Ġ` re ified ` Ġand Ġ` inline ` Ġ( as Ġit Ġshould Ġhave ) Ġdue Ġto ĠJava Ġbeing Ġun aware Ġof Ġthe Ġrequired ĊĠĠĠĠ Ġ* Ġtransformation Ġto Ġuse Ġthem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T > Ġsub Types Of ( super Class : ĠClass < T >, Ġvar arg Ġin Package : ĠString ): ĠList < Class < out ĠT >> Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠModifier . is Final ( super Class . modifiers ) Ġ-> ĠlistOf ( super Class ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġloader [ Scan Data ( super Class , Ġin Package )] Ġas ĠList < Class < out ĠT >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġloads Ġall Ġsub types Ġof Ġthe Ġprovided ĠJava Ġclass Ġthat Ġcan Ġbe Ġdiscovered Ġon Ġthe Ġcurrent Ġclasspath . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġsub Types Of ( var arg Ġin Package : ĠString ): ĠList < Class < out ĠT >> Ġ= ĊĠĠĠĠĠĠĠ Ġsub Types Of ( T :: class . java , Ġ* in Package ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġa Ġlist Ġof Ġall Ġthe Ġresources Ġin Ġa Ġcertain Ġ( optional ) Ġpackage Ġmatching Ġa Ġregular Ġexpression . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcannot Ġuse Ġ` re ified ` Ġand Ġ` inline ` Ġ( as Ġit Ġshould Ġhave ) Ġdue Ġto ĠJava Ġbeing Ġun aware Ġof Ġthe Ġrequired ĊĠĠĠĠ Ġ* Ġtransformation Ġto Ġuse Ġthem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġresources Matching ( regex : ĠString , Ġvar arg Ġin Package : ĠString ): ĠList < URL > Ġ= Ġclass Graph For Packages (* in Package ) ĊĠĠĠĠĠĠĠ Ġ. scan (). getResources Matching Pattern ( Pattern . compile ( regex )) ĊĠĠĠĠĠĠĠ Ġ. ur Ls ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġa Ġlist Ġof Ġall Ġthe Ġresources Ġin Ġa Ġcertain Ġ( optional ) Ġpackage Ġmatching Ġa Ġregular Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġresources Matching AsStream ( regex : ĠString , Ġvar arg Ġin Package : ĠString ): ĠList < InputStream > Ġ= ĊĠĠĠĠĠĠĠ Ġresources Matching ( regex , Ġ* in Package ). map Ġ{ Ġit . open Stream () Ġ} Ċ } Ċ