/* Ċ Ġ* ĠPermissions Ex Ċ Ġ* ĠCopyright Ġ( C ) Ġz ml Ġand ĠPermissions Ex Ġcontributors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġca . stell ard rift . permission sex . sponge Ċ Ċ import Ġca . stell ard rift . permission sex . subject . Calculated Subject Ċ import Ġca . stell ard rift . permission sex . subject . Subject Type Ċ import Ġca . stell ard rift . permission sex . subject . Subject Type Collection Ċ import Ġcom . github . ben man es . caffe ine . cache . Async Loading Cache Ċ import Ġcom . github . ben man es . caffe ine . cache . C affe ine Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġcom . google . common . collect . Immutable Set Ċ import Ġjava . util . Optional Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . ExecutionException Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . function . Predicate Ċ import Ġjava . util . stream . Collectors Ċ import Ġorg . spongepowered . api . service . context . Context Ċ import Ġorg . spongepowered . api . service . permission . Subject Ċ import Ġorg . spongepowered . api . service . permission . Subject Collection Ċ import Ġorg . spongepowered . api . service . permission . Subject Reference Ċ import Ġorg . spongepowered . api . util . Tri state Ċ Ċ /** Ċ Ġ* ĠSubject Ġcollection Ċ Ġ*/ Ċ class ĠP EX Subject Collection < I > Ġprivate Ġconstructor ( private Ġval Ġidentifier : ĠSubject Type < I >, Ġval Ġplugin : ĠPermissions Ex Plugin ) Ġ: ĊĠĠĠ ĠSubject Collection Ġ{ ĊĠĠĠ Ġval Ġtype : ĠSubject Type Collection < I > Ġ= Ġplugin . manager . subjects ( identifier ) ĊĠĠĠ Ġprivate Ġvar Ġdefaults : ĠP EX Subject ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsubject Cache : ĠAsync Loading Cache < String , ĠP EX Subject > Ġ= ĠC affe ine . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. executor ( plugin . manager . async Executor ()) ĊĠĠĠĠĠĠĠ Ġ. build Async Ġ{ Ġkey , Ġ_ Ġ-> ĠP EX Subject . load ( key , Ġthis @ PE X Subject Collection ) Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< I > Ġload ( identifier : ĠSubject Type < I >, Ġplugin : ĠPermissions Ex Plugin ): ĠCompletableFuture < PE X Subject Collection < I >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠP EX Subject Collection ( identifier , Ġplugin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Future Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( identifier . equals ( plugin . manager . defaults (). type ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . load Subject ( plugin . manager . defaults (). type (). name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . load Collection ( plugin . manager . defaults (). type ()). then Compose Ġ{ Ġit . load Subject ( identifier . name ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault Future . then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . defaults Ġ= Ġit Ġas ĠP EX Subject ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Identifier (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . identifier . name () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Identifier Validity Predicate (): ĠPredicate < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPredicate ( this . identifier :: is Identifier Valid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Subject ( identifier : ĠString ): ĠOptional < Subject > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġsubject Cache . get If Present ( identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture ?. get (). option ally () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . empty () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExecution Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Subject ( identifier : ĠString ): ĠCompletableFuture < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype . persistent Data (). is Registered ( this . identifier . parse Identifier ( identifier )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Subject ( identifier : ĠString ): ĠCompletableFuture < Subject > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsubject Cache [ identifier ]. then Apply Ġ{ Ġx : ĠP EX Subject ? Ġ-> Ġx Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Subject s ( identifiers : ĠSet < String >): ĠCompletableFuture < Map < String , ĠSubject >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub js Ġ= Ġidentifiers . associate With Ġ{ Ġload Subject ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . all Of (* sub js . values . to Typed Array < Comp letableFuture <* >> ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Apply Ġ{ Ġ_: ĠVoid ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub js . map Values Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . join () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Subject Reference ( subject Identifier : ĠString ): ĠSubject Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP EX Subject Reference ( this . identifier , Ġthis . identifier . parse Identifier ( subject Identifier ), Ġplugin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsuggest Unload ( identifier : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject Cache . s ynchronous (). invalidate ( identifier ) ĊĠĠĠĠĠĠĠ Ġtype . unc ache ( this . identifier . parse Identifier ( identifier )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Identifiers (): ĠCompletableFuture < Set < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . completed Future ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . all Identifiers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( this . identifier :: serialize Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toSet ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Loaded Subject s (): ĠCollection < Subject > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠImmutable Set . copyOf < Subject >( active Subject s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġactive Subject s : ĠIterable < PE X Subject > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsubject Cache . s ynchronous (). as Map (). values ĊĊĠĠĠ Ġoverride Ġfun Ġget Loaded With Permission ( permission : ĠString ): ĠMap < Subject , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Loaded With Permission ( null , Ġpermission ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Loaded With Permission ( contexts : ĠSet < Context > ?, Ġpermission : ĠString ): ĠMap < Subject , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠImmutableMap . builder < Subject , ĠBoolean >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( subject Ġin Ġsubject Cache . s ynchronous (). as Map (). values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Value Ġ= Ġsubject . get Permission Value ( contexts Ġ?: Ġsubject . active Contexts , Ġpermission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Value Ġ!== ĠTri state . UNDEFINED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . put ( subject , Ġpermission Value . as Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll With Permission ( permission : ĠString ): ĠCompletableFuture < Map < Subject Reference , ĠBoolean >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetAll With Permission ( null , Ġpermission ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll With Permission ( ĊĠĠĠĠĠĠĠ Ġcontexts : ĠSet < Context > ?, ĊĠĠĠĠĠĠĠ Ġpermission : ĠString ĊĠĠĠ Ġ): ĠCompletableFuture < Map < Subject Reference , ĠBoolean >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġtype . all Identifiers () ĊĠĠĠĠĠĠĠ Ġval Ġfutures : ĠArray < Comp letableFuture < Calculated Subject >> Ġ= Ġraw . map Ġ{ Ġtype [ it ] Ġ}. collect ( Collectors . toList ()). to Typed Array () ĊĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . all Of (* futures ). then Apply ( Function Ġ{ Ġ_: ĠVoid ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . join () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperm Ġ= Ġit . permission ( contexts ?. to P ex ( plugin . manager ) Ġ?: Ġit . active Contexts (), Ġpermission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġb Perm : ĠBoolean ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perm Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Perm Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( perm Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Perm Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Perm Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . identifier () Ġas ĠSubject Reference , Ġb Perm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġsubject Ġthat Ġprovides Ġdefaults Ġfor Ġsubjects Ġof Ġthis Ġtype . ĠThis Ġsubject Ġis Ġplaced Ġat Ġthe Ġroot Ġof Ġany Ġinheritance Ġtree Ġinvol ving Ġsubjects Ġof Ġthis Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġsubject Ġholding Ġdefaults ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Defaults (): ĠSubject Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefaults !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Calculated Subject ( identifier : ĠString ): ĠCompletableFuture < Calculated Subject > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype [ this . identifier . parse Identifier ( identifier )] ĊĠĠĠ Ġ} Ċ } Ċ