package Ġcom . ne va . jav are l . resource . impl Ċ Ċ import Ġcom . google . common . collect . Lists Ċ import Ġcom . google . common . collect . Sets Ċ import Ġcom . ne va . jav are l . foundation . api . ad ap ting . Ad ap tee Ċ import Ġcom . ne va . jav are l . foundation . api . ad ap ting . Ad ap ting Manager Ċ import Ġcom . ne va . jav are l . resource . api .* Ċ import Ġorg . apache . fel ix . scr . annotations .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Component ( immediate Ġ= Ġtrue ) Ċ @ Service ( Resource Resolver :: class ) Ċ class ĠGeneric Resource Resolver Ġ: ĠResource Resolver , ĠAd ap tee Ġ{ ĊĊĠĠĠ Ġ@ Reference ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġad ap ting Manager : ĠAd ap ting Manager ĊĊĠĠĠ Ġ@ Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Interface Ġ= ĠResource Provider :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcardinality Ġ= ĠReference Cardinality . M AND AT ORY _ MULTIPLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy Ġ= ĠReference Policy . DYNAMIC , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy Option Ġ= ĠReference Policy Option . GRE ED Y ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġvar Ġproviders Ġ= ĠSets . new Concurrent HashSet < Resource Provider >() ĊĊĠĠĠ Ġoverride Ġfun Ġfind ( uri : ĠString ): ĠResource ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠResource Descriptor ( uri ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprovide Resource ( descriptor , Ġfind Providers ( descriptor )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind OrFail ( uri : ĠString ): ĠResource Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠResource Descriptor ( Resource Mapper . fix Uri ( uri )) ĊĠĠĠĠĠĠĠ Ġval Ġproviders Ġ= Ġfind Providers ( descriptor ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( providers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResource NotFoundException (" Cannot Ġfind Ġany Ġprovider Ġfor Ġresource : Ġ'${ descriptor . uri }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġprovide Resource ( descriptor , Ġproviders ) ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResource NotFoundException (" Resource Ġby ĠURI Ġcannot Ġbe Ġfound : Ġ'${ descriptor . uri }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġadapt ( ad ap table : ĠResource , Ġclazz : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġad ap ting Manager . adapt ( ad ap table , Ġclazz ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġadapt To ( clazz : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġad ap ting Manager . adapt ( this , Ġclazz ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprovide Resource ( descriptor : ĠResource Descriptor , Ġproviders : ĠList < Resource Provider >): ĠResource ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresource : ĠResource ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( provider Ġin Ġproviders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= Ġprovider . provide ( this , Ġdescriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Providers ( descriptor : ĠResource Descriptor ): ĠList < Resource Provider > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLists . new LinkedList < Resource Provider >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( provider Ġin Ġproviders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . handles ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Providers ( provider : ĠResource Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproviders . add ( provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun bind Providers ( provider : ĠResource Provider ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproviders . remove ( provider ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ