package Ġcom . min cor . vi am framework . vi am . injection . injection points Ċ Ċ import Ġcom . min cor . vi am framework . vi am . base . ext . className Ċ import Ġcom . min cor . vi am framework . vi am . base . prot otypes . XML Ċ import Ġcom . min cor . vi am framework . vi am . injection . Injection Config Ċ import Ġcom . min cor . vi am framework . vi am . injection . Injector Ċ import Ġcom . min cor . vi am framework . vi am . injection . Injector Error Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ open Ġclass ĠMethod Injection Point ( node : ĠXML , Ġinjector : ĠInject or ) Ġ: ĠInjection Point ( node , Ġinjector ) Ġ{ ĊĊĠĠĠ Ġ/ **************************************************************** ************************ *** ĊĠĠĠĠ Ġ* Ġprivate Ġproperties Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval ĠmethodName : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Args Ġ= Ġnode . get XML ByName (" arg "). get XML ListBy KeyValue (" key ", Ġ" name ") ĊĠĠĠĠĠĠĠ Ġval Ġmethod Node Ġ= Ġnode . parent !! ĊĠĠĠĠĠĠĠ Ġthis . gather Parameters ( method Node , Ġname Args ) ĊĠĠĠĠĠĠĠ Ġmethod Node . getValue (" name ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġparameter Injection Configs : ĠMutable List < Any > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġrequired Parameters Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġapply Injection ( target : ĠAny , Ġinjector : ĠInject or ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġthis . gather Parameter Values ( target , Ġinjector ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod : ĠMethod ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype List Ġ= Ġparameters [ 0 ] Ġas ĠList < K Class <* >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Classes Ġ= ĠarrayOf Null s < K Class < *> >( type List . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype List . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġtarget . java Class . getMethod ( this . methodName , Ġtype Classes . java Class ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke ( target , Ġ*( parameters [ 1 ] Ġas ĠList < Any >). to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG ather Ġthe Ġparameters ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Node Ġmethod Node ĊĠĠĠĠ Ġ* Ġ@ param Ġname Args ĠĠ Ġname Args ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġgather Parameters ( method Node : ĠXML , Ġname Args : ĠList < XML >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmethod Node . get XML List ByName (" parameter ") ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinjection Name Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Args . isNotEmpty () Ġ&& Ġname Args [ i ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinjection Name Ġ= Ġname Args [ i ]. getValue (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparameter TypeName : ĠString ? Ġ= Ġparameter . getValue (" type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter TypeName Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter . getValue (" optional ") Ġ== Ġ" false ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInject or Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġin Ġmethod Ġdefinition Ġof Ġinject ee . Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Required Ġparameters Ġcan \' t Ġhave Ġtype Ġ\"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠAny :: class . className () Ġ+ Ġ"\" .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter TypeName Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . parameter Injection Configs . add ( Parameter Injection Config ( parameter TypeName , Ġinjection Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameter . getValue (" optional ") Ġ== Ġ" false ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . required Parameters ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG ather Ġthe Ġvalue Ġof Ġthe Ġparameter ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĠĠ Ġtarget ĊĠĠĠĠ Ġ* Ġ@ param Ġinjector Ġinjector ĊĠĠĠĠ Ġ* Ġ@ return ĠObject [] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġgather Parameter Values ( target : ĠAny , Ġinjector : ĠInject or ): ĠArray < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĠArrayList < Any >() ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= ĠArrayList < K Class <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġthis . parameter Injection Configs . size ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Config Ġ= Ġthis . parameter Injection Configs [ i ] Ġas ĠParameter Injection Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig : ĠInjection Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġinjector . get Mapping ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName ( parameter Config . typeName ). kotlin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Config . injection Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( types , Ġparameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinjection Ġ= Ġconfig . getResponse ( injector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( injection Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġthis . required Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInject or Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Injector Ġis Ġmissing Ġa Ġrule Ġto Ġhandle Ġinjection Ġinto Ġtarget Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġtarget Ġ+ Ġ". ĠTarget Ġdependency : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġconfig . request :: class . className () Ġ+ Ġ", Ġmethod : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . methodName Ġ+ Ġ", Ġparameter : Ġ" Ġ+ Ġ( i Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . add ( Class . forName ( parameter Config . typeName ). kotlin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ( injection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( types , Ġparameters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOnly Ġbe Ġgather Parameters Ġand Ġgather Parameter Values Ġuse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠParameter Injection Config ( var ĠtypeName : ĠString ?, Ġvar Ġinjection Name : ĠString ) Ċ }