/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand Ġother Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġcom . jetbrains . plugin verifier . repository . cache Ċ Ċ import Ġcom . jetbrains . plugin . structure . base . utils . close On Exception Ċ import Ġcom . jetbrains . plugin verifier . repository . cleanup . Size E viction Policy Ċ import Ġcom . jetbrains . plugin verifier . repository . cleanup . Size Weight Ċ import Ġcom . jetbrains . plugin verifier . repository . provider . Resource Provider Ċ import Ġcom . jetbrains . plugin verifier . repository . resources . E viction Policy Ċ import Ġcom . jetbrains . plugin verifier . repository . resources . Resource Repository Impl Ċ import Ġcom . jetbrains . plugin verifier . repository . resources . Resource Repository Result Ċ import Ġcom . jetbrains . plugin verifier . repository . resources . Resource Weight Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . Closeable Ċ import Ġjava . time . Clock Ċ Ċ /** Ċ Ġ* ĠResource Ġcache Ġis Ġintended Ġto Ġcache Ġany Ġresources Ġwhich Ċ Ġ* Ġfetching Ġmay Ġbe Ġexpensive . Ċ Ġ* Ċ Ġ* ĠInit ially , Ġthe Ġcache Ġis Ġempty . Ċ Ġ* ĠThe Ġresources Ġare Ġfetched Ġand Ġcached Ġon Ġdemand : Ġif Ġa Ġresource Ċ Ġ* Ġrequested Ġby Ġa Ġ[ key ] Ġ[ K ] Ġis Ġnot Ġavailable Ġin Ġthe Ġcache , Ċ Ġ* Ġthe Ġ[ resource Provider ] Ġprovides Ġthe Ġcorresponding Ġresource . ĠIt Ġworks Ċ Ġ* Ġconcurrent ly , Ġmeaning Ġthat Ġin Ġcase Ġseveral Ġthreads Ġrequest Ġa Ġresource Ċ Ġ* Ġby Ġthe Ġsame Ġkey , Ġonly Ġone Ġof Ġthem Ġwill Ġactually Ġprovide Ġthe Ġresource , Ċ Ġ* Ġwhile Ġothers Ġwill Ġwait Ġfor Ġthe Ġfirst Ġto Ġcomplete . Ċ Ġ* Ċ Ġ* ĠThe Ġresources Ġare Ġ[ returned ] Ġ[ getResource Cache Entry ] Ġwrapped Ġin Ġ[ Resource Cache Entry ] Ċ Ġ* Ġthat Ġprotect Ġthem Ġfrom Ġe viction Ġfrom Ġthe Ġcache Ġwhile Ġthe Ġresources Ċ Ġ* Ġare Ġused Ġby Ġrequesting Ġthreads . ĠOnly Ġonce Ġall Ġthe Ġ[ cache Ġentries ] Ġ[ Resource Cache Entry ] Ċ Ġ* Ġof Ġa Ġresource Ġby Ġa Ġspecific Ġ[ key ] Ġ[ K ] Ġget Ġ[ closed ] Ġ[ Resource Cache Entry . close ], Ċ Ġ* Ġthe Ġresource Ġ_ may Ġbe _ Ġ[ dis posed ] Ġ[ dis poser ]. ĠNote Ġthat Ġit Ġmay Ġnot Ġhappen Ġimmediately Ċ Ġ* Ġsince Ġthe Ġsame Ġresource Ġmay Ġbe Ġrequested Ġonce Ġagain Ġshortly . Ċ Ġ* Ċ Ġ* ĠWhile Ġthere Ġare Ġavailable Ġ" slots " Ġin Ġthe Ġcache , Ġthe Ġresources Ġare Ġnot Ġdisposed . Ċ Ġ* ĠAll Ġthe Ġun released Ġresources Ġwill Ġbe Ġ[ dis posed ] Ġ[ dis poser ] Ġonce Ġthe Ġcache Ġis Ġ[ closed ] Ġ[ close ]. Ċ Ġ*/ Ċ class ĠResource Cache < R , Ġin ĠK , ĠW Ġ: ĠResource Weight < W >>( ĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ Resource Provider ] Ġthat Ġprovides Ġthe ĊĠĠ Ġ* Ġrequested Ġresources Ġby Ġ[ keys ] Ġ[ K ]. ĊĠĠ Ġ*/ ĊĠ Ġresource Provider : ĠResource Provider < K , ĠR >, ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġdis poser Ġused Ġto Ġclose Ġthe Ġresources . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġresources Ġare Ġclosed Ġeither Ġwhen Ġthe Ġ[ cleanup ] Ġ[ Size E viction Policy ] Ġprocedure ĊĠĠ Ġ* Ġdetermines Ġto Ġev ict Ġthe Ġcorresponding Ġresources , ĊĠĠ Ġ* Ġor Ġwhen Ġthe Ġresources Ġare Ġremoved Ġfrom Ġthe Ġ[ resource Repository ]. ĊĠĠ Ġ* ĠOn Ġ[ close ], Ġall Ġthe Ġresources Ġare Ġremoved Ġand Ġclosed . ĊĠĠ Ġ*/ ĊĠ Ġdis poser : Ġ( R ) Ġ-> ĠUnit , ĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ E viction Policy ] Ġthat Ġmanages Ġe viction Ġof Ġresources ĊĠĠ Ġ* Ġheld Ġin Ġthis Ġcache . ĊĠĠ Ġ*/ ĊĠ Ġe viction Policy : ĠE viction Policy < R , ĠK , ĠW >, ĊĠ Ġ/** ĊĠĠ Ġ* ĠInitial Ġweight Ġof Ġthe Ġresources Ġheld Ġin Ġthis Ġcache . ĊĠĠ Ġ*/ ĊĠ Ġinitial Weight : ĠW , ĊĠ Ġ/** ĊĠĠ Ġ* ĠWe igh er Ġof Ġthe Ġresources Ġheld Ġin Ġthis Ġcache . ĊĠĠ Ġ*/ ĊĠ Ġwe igh er : Ġ( R ) Ġ-> ĠW , ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġcache Ġname Ġthat Ġcan Ġbe Ġused Ġfor Ġlogging Ġand Ġdebugging Ġpurposes ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġpresent able Name : ĠString Ċ ) Ġ: ĠClose able Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Resource Cache :: class . java ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠResource Ġ[ repository ] Ġ[ com . jetbrains . plugin verifier . repository . resources . Resource Repository ] ĊĠĠ Ġ* Ġof Ġthe Ġallocated Ġ[ resources ] Ġ[ R ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠInit ially , Ġthe Ġrepository Ġis Ġempty , Ġmeaning Ġthat Ġthere ĊĠĠ Ġ* Ġare Ġno Ġresources Ġopened . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠWhen Ġthe Ġrepository Ġis Ġfull Ġand Ġa Ġnew Ġresource Ġis Ġrequested , ĊĠĠ Ġ* Ġunused Ġresources Ġare Ġ[ dis posed ] Ġ[ dis poser ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġresource Repository Ġ= ĠResource Repository Impl ( ĊĠĠĠ Ġe viction Policy , ĊĠĠĠ ĠClock . system UTC (), ĊĠĠĠ Ġresource Provider , ĊĠĠĠ Ġinitial Weight , ĊĠĠĠ Ġwe igh er , ĊĠĠĠ Ġdis poser , ĊĠĠĠ Ġpresent able Name ĊĠ Ġ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġflag Ġindicating Ġwhether Ġ_ this _ Ġcache Ġis Ġalready Ġclosed . ĊĠĠ Ġ* ĠIt Ġis Ġprotected Ġby Ġthe Ġsynchronized Ġblocks . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġis Closed Ġ= Ġfalse ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠEn queues Ġfor Ġclosing Ġall Ġresources . ĊĠĠ Ġ* ĠThe Ġresources Ġthat Ġhave Ġno Ġlocks Ġregistered Ġat Ġthis ĊĠĠ Ġ* Ġmoment Ġwill Ġbe Ġclosed Ġimmediately , Ġwhile Ġthe Ġlocked Ġresources ĊĠĠ Ġ* Ġwill Ġbe Ġclosed Ġonce Ġthey Ġbecome Ġreleased Ġby Ġtheir Ġhold ers . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġresources Ġbeing Ġrequested Ġat Ġthe Ġtime Ġof Ġ[ close ] Ġinvocation Ġwill ĊĠĠ Ġ* Ġbe Ġreleased Ġand Ġclosed Ġat Ġthe Ġ[ getResource Cache Entry ]. ĊĠĠ Ġ* ĠThus , Ġno Ġnew Ġresources Ġcan Ġbe Ġallocated Ġafter Ġthe Ġ[ close ] Ġis Ġinvoked . ĊĠĠ Ġ*/ ĊĠ Ġ@ Synchron ized ĊĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ ĠLOG . debug (" Closing Ġthe Ġ$ present able Name ") ĊĠĠĠ Ġif Ġ(! is Closed ) Ġ{ ĊĠĠĠĠĠ Ġis Closed Ġ= Ġtrue ĊĠĠĠĠĠ Ġresource Repository . removeAll () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠProvides Ġthe Ġ[ Resource Cache Entry ] Ġthat Ġcontains ĊĠĠ Ġ* Ġthe Ġ[ resource ] Ġ[ Resource Cache Entry . resource ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠPossible Ġresults Ġof Ġthis Ġmethod Ġinvocation ĊĠĠ Ġ* Ġare Ġrepresented Ġas Ġinstances Ġof Ġthe Ġ[ Resource Cache Entry Result ]. ĊĠĠ Ġ* ĠIf Ġthe Ġ[ Found ] Ġ[ Resource Cache Entry Result . Found ] Ġis Ġreturned , ĊĠĠ Ġ* Ġthe Ġcorresponding Ġ[ Resource Cache Entry ] Ġmust Ġbe ĊĠĠ Ġ* Ġ[ closed ] Ġ[ Resource Cache Entry . close ] Ġafter Ġbeing Ġused . ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠ Ġfun ĠgetResource Cache Entry ( key : ĠK ): ĠResource Cache Entry Result < R , ĠW > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġthe Ġfetching Ġif Ġ_ this _ Ġresource Ġcache Ġis Ġalready Ġclosed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Closed ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrepository Result Ġ= Ġresource Repository . get ( key ) ĊĠĠĠ Ġval Ġlocked Resource Ġ= Ġwith ( repository Result ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠResource Repository Result . Found < R , ĠW > Ġ-> Ġlocked Resource ĊĠĠĠĠĠĠĠ Ġis ĠResource Repository Result . Failed < *, Ġ*> Ġ-> Ġreturn ĠResource Cache Entry Result . Failed ( reason , Ġerror ) ĊĠĠĠĠĠĠĠ Ġis ĠResource Repository Result . NotFound < *, Ġ*> Ġ-> Ġreturn ĠResource Cache Entry Result . NotFound ( reason ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġ_ this _ Ġcache Ġwas Ġclosed Ġafter Ġthe Ġ[ key ] ĊĠĠĠĠ Ġ* Ġhad Ġbeen Ġrequested , Ġrelease Ġthe Ġlock Ġand Ġregister ĊĠĠĠĠ Ġ* Ġthe Ġ[ key ] Ġfor Ġdeletion : Ġit Ġwill Ġbe Ġeither ĊĠĠĠĠ Ġ* Ġremoved Ġimmediately , Ġor Ġjust Ġafter Ġthe Ġlast ĊĠĠĠĠ Ġ* Ġholder Ġreleases Ġthe Ġlock . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Closed ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocked Resource . release () ĊĠĠĠĠĠĠĠ Ġresource Repository . remove ( key ) ĊĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġlocked Resource . close On Exception Ġ{ ĊĠĠĠĠĠĠĠ ĠResource Cache Entry Result . Found ( Resource Cache Entry ( locked Resource )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠExplicit ly Ġremove Ġthe Ġresource Ġfrom Ġthis Ġcache Ġand Ġinvoke Ġthe Ġassociated Ġdis poser . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġremove ( key : ĠK ) Ġ{ ĊĠĠĠ Ġresource Repository . remove ( key ) ĊĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġ< K , ĠR > Ġcreate Size Limit ed Resource Cache ( ĊĠ Ġcache Size : ĠInt , ĊĠ Ġresource Provider : ĠResource Provider < K , ĠR >, ĊĠ Ġdis poser : Ġ( R ) Ġ-> ĠUnit , ĊĠ Ġpresent able Name : ĠString Ċ ): ĠResource Cache < R , ĠK , ĠSize Weight > Ġ= ĠResource Cache ( ĊĠ Ġresource Provider , ĊĠ Ġdis poser , ĊĠ ĠSize E viction Policy ( cache Size ), ĊĠ ĠSize Weight ( 0 ), ĊĠ Ġ{ ĠSize Weight ( 1 ) Ġ}, ĊĠ Ġpresent able Name Ċ )