package Ġcom . open l attice . authorization Ċ Ċ import Ġcom . co da h ale . metrics . annotation . Timed Ċ import Ġcom . google . common . collect . Hash Multimap Ċ import Ġcom . google . common . collect . Immutable Set Ċ import Ġcom . google . common . collect . Maps Ċ import Ġcom . google . common . collect . Set Multimap Ċ import Ġcom . google . common . event bus . EventBus Ċ import Ġcom . hazelcast . aggregation . Ag greg ators Ċ import Ġcom . hazelcast . core . H azelcast Instance Ċ import Ġcom . hazelcast . map . I Map Ċ import Ġcom . hazelcast . query . Predicate Ċ import Ġcom . hazelcast . query . Pred icates Ċ import Ġcom . open l attice . assembler . events . Material ize Permission ChangeEvent Ċ import Ġcom . open l attice . authorization . aggreg ators . Authorization Set Aggregator Ċ import Ġcom . open l attice . authorization . aggreg ators . Principal Aggregator Ċ import Ġcom . open l attice . authorization . map stores . Permission Map store . ACL _ KEY _ INDEX Ċ import Ġcom . open l attice . authorization . map stores . Permission Map store . PERMISSION S _ INDEX Ċ import Ġcom . open l attice . authorization . map stores . Permission Map store . PR INC IP AL _ INDEX Ċ import Ġcom . open l attice . authorization . map stores . Permission Map store . PR INC IP AL _ TYPE _ INDEX Ċ import Ġcom . open l attice . authorization . map stores . Permission Map store . SE CUR ABLE _ OBJECT _ TYPE _ INDEX Ċ import Ġcom . open l attice . authorization . processors . Authorization Entry Processor Ċ import Ġcom . open l attice . authorization . processors . Permission Mer ger Ċ import Ġcom . open l attice . authorization . processors . Permission Rem over Ċ import Ġcom . open l attice . authorization . processors . Sec ur able ObjectType Updater Ċ import Ġcom . open l attice . authorization . se cur able . Sec ur able ObjectType Ċ import Ġcom . open l attice . authorization . util . to Ace Keys Ċ import Ġcom . open l attice . hazelcast . H azelcast Map Ċ import Ġcom . open l attice . organizations . Principal Set Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Stream Ċ Ċ @ Service Ċ class ĠH azelcast Authorization Service ( ĊĠĠĠĠĠĠĠ Ġh azelcast Instance : ĠH azelcast Instance , ĊĠĠĠĠĠĠĠ Ġval Ġevent Bus : ĠEvent Bus , ĊĠĠĠĠĠĠĠ Ġval Ġprincip als Map Manager : ĠPr incip als Map Manager Ċ ) Ġ: ĠAuthorization Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġse cur ableObject Types : ĠI Map < Acl Key , ĠSec ur able ObjectType > Ġ= ĠH azelcast Map . SE CUR ABLE _ OBJECT _ TYPES . getMap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh azelcast Instance ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġa ces : ĠI Map < Ace Key , ĠA ce Value > Ġ= ĠH azelcast Map . PERMISSION S . getMap ( hazelcast Instance ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( H azelcast Authorization Service :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġno Access ( permissions : ĠEnum Set < Permission >): ĠEnum Map < Permission , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpm Ġ= ĠEnum Map < Permission , ĠBoolean >( Permission :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ Ġpm [ it ] Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpm ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatches ( acl Keys : ĠCollection < Acl Key >, Ġprincip als : ĠSet < Principal >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . and < Ace Key , ĠA ce Value >( has Any Acl Keys ( acl Keys ), Ġhas Any Princip als ( pr incip als )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatches ( acl Key : ĠA cl Key , Ġpermissions : ĠEnum Set < Permission >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . and < Ace Key , ĠA ce Value >( has Acl Key ( acl Key ), Ġhas Exact Permissions ( permissions )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Exact Permissions ( permissions : ĠEnum Set < Permission >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Pred icates Ġ= Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPred icates . equal < Ace Key , ĠA ce Value >( PERMISSION S _ INDEX , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . and < Ace Key , ĠA ce Value >(* sub Pred icates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Any Princip als ( pr incip als : ĠCollection < Principal >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates .` in `< Ace Key , ĠA ce Value >( PR INC IP AL _ INDEX , Ġ* pr incip als . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Any Acl Keys ( acl Keys : ĠCollection < Acl Key >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates .` in `< Ace Key , ĠA ce Value >( ACL _ KEY _ INDEX , Ġ* acl Keys . map Ġ{ Ġit . index Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Acl Key ( acl Key : ĠA cl Key ): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . equal ( ACL _ KEY _ INDEX , Ġacl Key . index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Type ( object Type : ĠSec ur able ObjectType ): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . equal ( SE CUR ABLE _ OBJECT _ TYPE _ INDEX , Ġobject Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Any Type ( object Types : ĠCollection < Sec ur able ObjectType >): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates .` in `( SE CUR ABLE _ OBJECT _ TYPE _ INDEX , Ġ* object Types . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Principal ( principal : ĠPrincipal ): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . equal ( PR INC IP AL _ INDEX , Ġprincipal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhas Principal Type ( type : ĠPrincipal Type ): ĠPredicate < Ace Key , ĠA ce Value > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPred icates . equal ( PR INC IP AL _ TYPE _ INDEX , Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet ĠSec ur able ĠObject ĠType Ġ**/ ĊĊĠĠĠ Ġoverride Ġfun Ġset Sec ur ableObject Types ( acl Keys : ĠSet < Acl Key >, Ġobject Type : ĠSec ur able ObjectType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġse cur ableObject Types . put All ( acl Keys . associate With Ġ{ Ġobject Type Ġ}) ĊĠĠĠĠĠĠĠ Ġa ces . execute On Entries ( Sec ur able ObjectType Updater ( object Type ), Ġhas Any Acl Keys ( acl Keys )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Sec ur able ObjectType ( acl Key : ĠA cl Key , Ġobject Type : ĠSec ur able ObjectType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġse cur ableObject Types [ acl Key ] Ġ= Ġobject Type ĊĠĠĠĠĠĠĠ Ġa ces . execute On Entries ( Sec ur able ObjectType Updater ( object Type ), Ġhas Acl Key ( acl Key )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd ĠPermissions Ġ**/ ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permission ( key : ĠA cl Key , Ġprincipal : ĠPrincipal , Ġpermissions : ĠEnum Set < Permission >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Permission ( key , Ġprincipal , Ġpermissions , ĠOffset DateTime . MAX ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠSet < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date : ĠOffset DateTime ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO : ĠWe Ġshould Ġdo Ġsomething Ġbetter Ġthan Ġreading Ġthe Ġse cur able Ġobject Ġtype . ĊĠĠĠĠĠĠĠ Ġval Ġse cur able ObjectType Ġ= ĠgetDefault ObjectType ( se cur ableObject Types , Ġkey ) ĊĊĠĠĠĠĠĠĠ Ġadd Permission ( key , Ġprincipal , Ġpermissions , Ġse cur able ObjectType , Ġexpiration Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠSet < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġse cur able ObjectType : ĠSec ur able ObjectType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date : ĠOffset DateTime ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( set Of ( principal )) ĊĠĠĠĠĠĠĠ Ġa ces . execute On Key ( Ace Key ( key , Ġprincipal ), ĠPermission Mer ger ( permissions , Ġse cur able ObjectType , Ġexpiration Date )) ĊĊĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( key , Ġprincipal , Ġpermissions , Ġse cur able ObjectType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys : ĠSet < Acl Key >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġse cur able ObjectType : ĠSec ur able ObjectType ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Permissions ( keys , Ġprincipal , Ġpermissions , Ġse cur able ObjectType , ĠOffset DateTime . MAX ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys : ĠSet < Acl Key >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġse cur able ObjectType : ĠSec ur able ObjectType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date : ĠOffset DateTime ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( set Of ( principal )) ĊĠĠĠĠĠĠĠ Ġval Ġace Keys Ġ= Ġto Ace Keys ( keys , Ġprincipal ) ĊĠĠĠĠĠĠĠ Ġa ces . execute On Keys ( ace Keys , ĠPermission Mer ger ( permissions , Ġse cur able ObjectType , Ġexpiration Date )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Permissions ( ac ls : ĠList < Acl >) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Acl Princip als Exist ( ac ls ) ĊĠĠĠĠĠĠĠ Ġval Ġupdates Ġ= Ġget Ace Value To Ace Key Map ( ac ls ) ĊĠĠĠĠĠĠĠ Ġupdates . keySet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġace Keys Ġ= Ġupdates [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ces . execute On Keys ( ace Keys , ĠPermission Mer ger ( it . permissions , Ġit . se cur able ObjectType , Ġit . expiration Date )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemove ĠPermissions Ġ**/ ĊĊĠĠĠ Ġoverride Ġfun Ġremove Permissions ( ac ls : ĠList < Acl >) Ġ{ ĊĠĠĠĠĠĠĠ Ġa cls . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA cl Key ( it . acl Key ) Ġto Ġit . aces ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġace Ġ-> Ġace . permissions . contains ( Permission . OWNER ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġace Ġ-> Ġace . principal Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠ Ġ}. filter Ġ{ Ġ(_, Ġowners ) Ġ-> Ġowners . isNotEmpty () Ġ}. forEach Ġ{ Ġ( acl Key , Ġowners ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Acl Keys Have Other User Owners ( Immutable Set . of ( acl Key ), Ġowners ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdates Ġ= Ġget Ace Value To Ace Key Map ( ac ls ) ĊĊĠĠĠĠĠĠĠ Ġupdates . keySet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ces . execute On Keys ( updates [ it ], ĠPermission Rem over ( it . permissions )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . contains ( Permission . OWNER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Acl Keys Have Other User Owners ( set Of ( key ), Ġset Of ( principal )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey , Ġprincipal , Ġpermissions , ĠgetDefault ObjectType ( se cur ableObject Types , Ġkey ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġa ces . execute On Key ( Ace Key ( key , Ġprincipal ), ĠPermission Rem over ( permissions )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Permissions ( acl Key : ĠA cl Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġse cur ableObject Types . delete ( acl Key ) ĊĠĠĠĠĠĠĠ Ġa ces . removeAll ( has Acl Key ( acl Key )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Principal Permissions ( principal : ĠPrincipal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġa ces . removeAll ( has Principal ( principal )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet ĠPermissions Ġ**/ ĊĊĠĠĠ Ġoverride Ġfun Ġset Permissions ( ac ls : ĠList < Acl >) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Acl Princip als Exist ( ac ls ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġget Sec ur able ObjectType Map For A cls ( ac ls ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdates Ġ= Ġmutable Map Of < Ace Key , ĠA ce Value >() ĊĊĠĠĠĠĠĠĠ Ġa cls . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacl Key Ġ= ĠA cl Key ( it . acl Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġse cur able ObjectType Ġ= ĠgetDefault ObjectType ( types , Ġacl Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . aces . forEach Ġ{ Ġace : ĠA ce Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= Ġace . principal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= Ġace . permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdates [ Ace Key ( acl Key , Ġprincipal )] Ġ= ĠA ce Value ( permissions , Ġse cur able ObjectType , Ġace . expiration Date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( acl Key , Ġprincipal , Ġpermissions , Ġse cur able ObjectType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa ces . put All ( updates ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Permission ( key , Ġprincipal , Ġpermissions , ĠOffset DateTime . MAX ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date : ĠOffset DateTime ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( set Of ( principal )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! permissions . contains ( Permission . OWNER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Acl Keys Have Other User Owners ( set Of ( key ), Ġset Of ( principal )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// This Ġshould Ġbe Ġa Ġrare Ġcall Ġto Ġoverwrite Ġall Ġpermissions , Ġso Ġit 's Ġokay Ġto Ġdo Ġa Ġread Ġbefore Ġwrite . ĊĠĠĠĠĠĠĠ Ġval Ġse cur able ObjectType Ġ= ĠgetDefault ObjectType ( se cur ableObject Types , Ġkey ) ĊĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( key , Ġprincipal , Ġpermissions , Ġse cur able ObjectType ) ĊĠĠĠĠĠĠĠ Ġa ces [ Ace Key ( key , Ġprincipal )] Ġ= ĠA ce Value ( permissions , Ġse cur able ObjectType , Ġexpiration Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Permission ( acl Keys : ĠSet < Acl Key >, Ġprincip als : ĠSet < Principal >, Ġpermissions : ĠEnum Set < Permission >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// This Ġshould Ġbe Ġa Ġrare Ġcall Ġto Ġoverwrite Ġall Ġpermissions , Ġso Ġit 's Ġokay Ġto Ġdo Ġa Ġread Ġbefore Ġwrite . ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( pr incip als ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! permissions . contains ( Permission . OWNER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Acl Keys Have Other User Owners ( acl Keys , Ġprincip als ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġse cur ableObject Types For Acl Keys Ġ= Ġse cur ableObject Types . getAll ( acl Keys ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Permissions : ĠMutable Map < Ace Key , ĠA ce Value > Ġ= ĠHashMap ( acl Keys . size Ġ* Ġprincip als . size ) ĊĊĠĠĠĠĠĠĠ Ġacl Keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Type Ġ= ĠgetDefault ObjectType ( se cur ableObject Types For Acl Keys , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġace Value Ġ= ĠA ce Value ( permissions , Ġobject Type , ĠOffset DateTime . MAX ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als . forEach Ġ{ Ġprincipal Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Permissions [ Ace Key ( it , Ġprincipal )] Ġ= Ġace Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( it , Ġprincipal , Ġpermissions , Ġobject Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa ces . put All ( new Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Permissions ( permissions : ĠMap < Ace Key , ĠEnum Set < Permission >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( permissions . keys . map To ( mutable Set Of ()) Ġ{ Ġit . principal Ġ}) ĊĊĠĠĠĠĠĠĠ Ġpermissions . entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġentry Ġ-> Ġ! entry . value . contains ( Permission . OWNER ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġe Ġ-> Ġe . key . acl Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value . map Ġ{ Ġentry Ġ-> Ġentry . key . principal Ġ}. toSet () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( acl Key , Ġprincip als ) Ġ-> Ġensure Acl Keys Have Other User Owners ( set Of ( acl Key ), Ġprincip als ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġse cur ableObject Types For Acl Keys Ġ= Ġse cur ableObject Types . getAll ( permissions . keys . map Ġ{ Ġit . acl Key Ġ}. toSet ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Permissions : ĠMutable Map < Ace Key , ĠA ce Value > Ġ= ĠMaps . new HashMap () ĊĊĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ Ġ( ace Key : ĠA ce Key , Ġace Permissions : ĠEnum Set < Permission >) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacl Key Ġ= Ġace Key . acl Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Type Ġ= ĠgetDefault ObjectType ( se cur ableObject Types For Acl Keys , Ġacl Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Permissions [ ace Key ] Ġ= ĠA ce Value ( ace Permissions , Ġobject Type , ĠOffset DateTime . MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Material ization Permission Change ( acl Key , Ġace Key . principal , Ġace Permissions , Ġobject Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa ces . put All ( new Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĠAUTH ĠCHECK S Ġ*** / ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġauthorize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests : ĠMap < Acl Key , ĠEnum Set < Permission >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal > ĊĠĠĠ Ġ): ĠMutable Map < Acl Key , ĠEnum Map < Permission , ĠBoolean >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpermission Map Ġ= Ġrequests . map Values Ġ{ Ġno Access ( it . value ) Ġ}. to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġval Ġace Keys Ġ= Ġrequests . keys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġacl Key Ġ-> Ġprincip als . map Ġ{ Ġprincipal Ġ-> ĠA ce Key ( acl Key , Ġprincipal ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġa ces ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute On Keys ( ace Keys , ĠAuthorization Entry Processor ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( ace Key , Ġpermissions ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacl Key Permissions Ġ= Ġpermission Map . getValue ( ace Key . acl Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ Ġpermission Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacl Key Permissions . compute If Present ( permission ) Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpermission Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġaccess Checks For Princip als ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Checks : ĠSet < Access Check >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal > ĊĠĠĠ Ġ): ĠStream < Authorization > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequests : ĠMutable Map < Acl Key , ĠEnum Set < Permission >> Ġ= ĠMaps . new Linked HashMap With Expected Size ( access Checks . size ) ĊĊĠĠĠĠĠĠĠ Ġaccess Checks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġrequests . get OrDefault ( it . acl Key , ĠEnum Set . none Of ( Permission :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . addAll ( it . permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests [ it . acl Key ] Ġ= Ġp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġauthorize ( requests , Ġprincip als ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġe Ġ-> ĠAuthorization ( e . key , Ġe . value ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġcheck If Has Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Permissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġace Keys Ġ= Ġprincip als . map Ġ{ ĠA ce Key ( key , Ġit ) Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . execute On Keys ( ace Keys , ĠAuthorization Entry Processor ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit Ġas ĠDeleg ated Permission Enum Set Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains All ( required Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Sec ur ableObject Sets Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacl Key Sets : ĠCollection < Set < Acl Key >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal > ĊĠĠĠ Ġ): ĠMap < Set < Acl Key >, ĠEnum Set < Permission >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġacl Key Sets . parallel Stream (). collect ( Collectors . toMap < Set < Acl Key >, ĠSet < Acl Key >, ĠEnum Set < Permission >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction . identity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Ġ{ Ġget Sec ur ableObject Set Permissions ( it , Ġprincip als ) Ġ} ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Sec ur ableObject Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal > ĊĠĠĠ Ġ): ĠSet < Permission > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Permissions Ġ= ĠEnum Set . none Of ( Permission :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġace Keys Ġ= Ġprincip als . map Ġ{ ĠA ce Key ( key , Ġit ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġa ces . getAll ( ace Keys ). values . map NotNull Ġ{ Ġit . permissions Ġ}. forEach Ġ{ Ġobject Permissions . addAll ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobject Permissions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Authorized Objects OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Type : ĠSec ur able ObjectType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ): ĠStream < Acl Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Authorized Objects OfType ( set Of ( principal ), Ġobject Type , Ġpermissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Authorized Objects OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Type : ĠSec ur able ObjectType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ): ĠStream < Acl Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Predicate Ġ= Ġif Ġ( pr incip als . size Ġ== Ġ 1 ) Ġhas Principal ( pr incip als . first ()) Ġelse Ġhas Any Princip als ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPred icates . and < Ace Key , ĠA ce Value >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal Predicate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Type ( object Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Exact Permissions ( permissions ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . keySet ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . acl Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Authorized Objects Of Types ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Types : ĠCollection < Sec ur able ObjectType >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ): ĠStream < Acl Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Predicate Ġ= Ġif Ġ( pr incip als . size Ġ== Ġ 1 ) Ġhas Principal ( pr incip als . first ()) Ġelse Ġhas Any Princip als ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPred icates . and < Ace Key , ĠA ce Value >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal Predicate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Type ( object Types ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Exact Permissions ( permissions ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . keySet ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . acl Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Authorized Objects OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Type : ĠSec ur able ObjectType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠEnum Set < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Filter : ĠPredicate < *, Ġ*> ĊĠĠĠ Ġ): ĠStream < Acl Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPred icates . and < Ace Key , ĠA ce Value >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Princip als ( pr incip als ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Type ( object Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Exact Permissions ( permissions ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Filter ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . keySet ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġobj : ĠA ce Key Ġ-> Ġobj . acl Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun ĠgetAll Sec ur ableObject Permissions ( key : ĠA cl Key ): ĠA cl Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa ces With Permissions Ġ= Ġa ces . entrySet ( has Acl Key ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠA ce ( it . key . principal , Ġit . value . permissions ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠA cl ( key , Ġa ces With Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun ĠgetAll Sec ur ableObject Permissions ( keys : ĠSet < Acl Key >): ĠSet < Acl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . entrySet ( has Any Acl Keys ( keys )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . key . acl Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To ( mutable Set Of ()) Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA cl ( entry . key , Ġentry . value . map To ( mutable Set Of ()) Ġ{ ĠA ce ( it . key . principal , Ġit . value . permissions ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Authorized Princip als On Sec ur ableObject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , Ġpermissions : ĠEnum Set < Permission > ĊĠĠĠ Ġ): ĠSet < Principal > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Map Ġ= Ġmutable Map Of ( key Ġto ĠPrincipal Set ( mutable Set Of ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . aggregate ( Principal Aggregator ( principal Map ), Ġmatches ( key , Ġpermissions )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getResult () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getValue ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unwrap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Sec ur ableObject Owners ( key : ĠA cl Key ): ĠSet < Principal > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Authorized Princip als On Sec ur ableObject ( key , ĠEnum Set . of ( Permission . OWNER )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget Owners For Sec ur able Objects ( acl Keys : ĠCollection < Acl Key >): ĠSet Multimap < Acl Key , ĠPrincipal > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠSet Multimap < Acl Key , ĠPrincipal > Ġ= ĠHash Multimap . create () ĊĊĠĠĠĠĠĠĠ Ġa ces . keySet ( Pred icates . and ( has Any Acl Keys ( acl Keys ), Ġhas Exact Permissions ( Enum Set . of ( Permission . OWNER )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġresult . put ( it . acl Key , Ġit . principal ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĠPrivate ĠHelpers Ġ**/ ĊĊĠĠĠ Ġprivate Ġfun Ġensure Acl Keys Have Other User Owners ( acl Keys : ĠSet < Acl Key >, Ġprincip als : ĠSet < Principal >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Princip als Ġ= Ġprincip als . stream (). filter Ġ{ Ġp : ĠPrincipal Ġ-> Ġp . type Ġ== ĠPrincipal Type . USER Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toSet ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( user Princip als . size Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Other User Owners Predicate Ġ= ĠPred icates . and < Ace Key , ĠA ce Value >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Any Acl Keys ( acl Keys ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Exact Permissions ( Enum Set . of ( Permission . OWNER )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPred icates . not < Ace Key , ĠA ce Value >( has Any Princip als ( user Princip als )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Principal Type ( Principal Type . USER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Other User Owners Count : ĠLong Ġ= Ġa ces . aggregate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAg greg ators . count < Map . Entry < Ace Key , ĠA ce Value >> (), Ġall Other User Owners Predicate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( all Other User Owners Count Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġremove Ġowner Ġpermissions Ġas Ġa Ġse cur able Ġobject Ġwill Ġbe Ġleft Ġwithout Ġan Ġowner Ġof Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type ĠUSER " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ace Value To Ace Key Map ( ac ls : ĠList < Acl >): ĠSet Multimap < Ace Value , ĠA ce Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġget Sec ur able ObjectType Map For A cls ( ac ls ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠSet Multimap < Ace Value , ĠA ce Key > Ġ= ĠHash Multimap . create () ĊĠĠĠĠĠĠĠ Ġa cls . forEach Ġ{ Ġacl : ĠA cl Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacl Key Ġ= ĠA cl Key ( acl . acl Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġse cur able ObjectType Ġ= ĠgetDefault ObjectType ( types , Ġacl Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġacl . aces . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( Ace Value ( it . permissions , Ġse cur able ObjectType , Ġit . expiration Date ), ĠA ce Key ( acl Key , Ġit . principal )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sec ur ableObject Set Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacl Key Set : ĠSet < Acl Key >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als : ĠSet < Principal > ĊĠĠĠ Ġ): ĠEnum Set < Permission > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġauthor izations Map Ġ= Ġacl Key Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate With Ġ{ ĠEnum Set . none Of ( Permission :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa ces . aggregate ( Authorization Set Aggregator ( author izations Map ), Ġmatches ( acl Key Set , Ġprincip als )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsignal Material ization Permission Change ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠA cl Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal : ĠPrincipal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠSet < Permission >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġse cur able ObjectType : ĠSec ur able ObjectType ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthere Ġis Ġa Ġchange Ġin Ġmaterial ization Ġpermission Ġfor Ġa Ġproperty Ġtype Ġor Ġan Ġentity Ġset Ġfor Ġan Ġorganization ĊĠĠĠĠĠĠĠ Ġ// Ġprincipal , Ġwe Ġneed Ġto Ġflag Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . contains ( Permission . MAT ERIAL IZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġprincipal . type Ġ== ĠPrincipal Type . ORG AN IZATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( se cur able ObjectType Ġ== ĠSec ur able ObjectType . PropertyType In Entity Set Ġ|| Ġse cur able ObjectType Ġ== ĠSec ur able ObjectType . Entity Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Bus . post ( Material ize Permission ChangeEvent ( principal , Ġset Of ( key [ 0 ]), Ġse cur able ObjectType )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sec ur able ObjectType Map For A cls ( ac ls : ĠCollection < Acl >): ĠMap < Acl Key , ĠSec ur able ObjectType > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġse cur ableObject Types . getAll ( ac ls . map Ġ{ ĠA cl Key ( it . acl Key ) Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetDefault ObjectType ( types : ĠMap < Acl Key , ĠSec ur able ObjectType >, Ġacl Key : ĠA cl Key ): ĠSec ur able ObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġse cur able ObjectType Ġ= Ġtypes . get OrDefault ( acl Key , ĠSec ur able ObjectType . Unknown ) ĊĠĠĠĠĠĠĠ Ġif Ġ( se cur able ObjectType Ġ== ĠSec ur able ObjectType . Unknown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Unrecognized Ġobject Ġtype Ġfor Ġacl Ġkey Ġ{} Ġkey Ġ", Ġacl Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġse cur able ObjectType ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġensure Acl Princip als Exist ( ac ls : ĠList < Acl >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprincip als Ġ= Ġa cls . flatMap Ġ{ Ġit . aces Ġ}. map To ( mutable Set Of ()) Ġ{ Ġit . principal Ġ} ĊĠĠĠĠĠĠĠ Ġensure Princip als Exist ( pr incip als ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġensure Princip als Exist ( pr incip als : ĠSet < Principal >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnon existent Princip als Ġ= Ġprincip als Ġ- Ġprincip als Map Manager . get Acl Key By Principal ( pr incip als ). keys ĊĠĠĠĠĠĠĠ Ġcheck ( non existent Princip als . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Could Ġnot Ġupdate Ġpermissions Ġbecause Ġprincip als Ġ$ non existent Princip als Ġdo Ġnot Ġexist .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ