/******************************************************************************* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGeneral ĠE lectric ĠCompany Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ************************************************************************* ******/ Ċ Ċ package Ġorg . eclipse . ket i . acs . policy . evaluation . cache Ċ Ċ import Ġorg . codehaus . jackson . map . ObjectMapper Ċ import Ġorg . eclipse . ket i . acs . attribute . connector . management . Attribute Connector Service Ċ import Ġorg . eclipse . ket i . acs . privilege . management . dao . Resource Entity Ċ import Ġorg . eclipse . ket i . acs . privilege . management . dao . Subject Entity Ċ import Ġorg . eclipse . ket i . acs . rest . Policy Evaluation Result Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . joda . time . DateTime Zone Ċ import Ġorg . joda . time . Minutes Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . io . IOException Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . HashMap Ċ Ċ internal Ġenum Ġclass ĠEntityType Ġconstructor ( val Ġvalue : ĠString ) Ġ{ ĊĊĠĠĠ ĠRESOURCE (" resource "), ĊĠĠĠ ĠSUB JECT (" subject "), ĊĠĠĠ ĠPOL ICY _ SET (" policy Ġset "); ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠLOGGER Ġ= ĠLoggerFactory . getLogger ( Abstract Policy Evaluation Cache :: class . java ) Ċ private Ġval ĠOBJECT _ MAP PER Ġ= ĠObjectMapper () Ċ Ċ fun Ġpolicy Set Key ( ĊĠĠĠ Ġzone Id : ĠString , ĊĠĠĠ Ġpolicy SetId : ĠString Ċ ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġzone Id Ġ+ Ġ": set - id :" Ġ+ ĠInteger . to HexString ( policy SetId . hashCode ()) Ċ } Ċ Ċ fun Ġresource Key ( ĊĠĠĠ Ġzone Id : ĠString , ĊĠĠĠ Ġresource Id : ĠString Ċ ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġzone Id Ġ+ Ġ": res - id :" Ġ+ ĠInteger . to HexString ( resourceId . hashCode ()) Ċ } Ċ Ċ fun Ġsubject Key ( ĊĠĠĠ Ġzone Id : ĠString , ĊĠĠĠ Ġsubject Id : ĠString Ċ ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġzone Id Ġ+ Ġ": sub - id :" Ġ+ ĠInteger . to HexString ( subject Id . hashCode ()) Ċ } Ċ Ċ internal Ġfun Ġis Policy Eval Result Key ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkey . matches ("^ [^ : ]* : [^ : ]* : [^ : ]* : [^ : ]* $ ". to Regex ()) Ċ } Ċ Ċ internal Ġfun Ġis Policy Set Changed Key ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkey . matches ("^ [^ : ]* : set - id : [^ : ]* $ ". to Regex ()) Ċ } Ċ Ċ internal Ġfun Ġis Resource Changed Key ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkey . matches ("^ [^ : ]* : res - id : [^ : ]* $ ". to Regex ()) Ċ } Ċ Ċ internal Ġfun Ġis Subject Changed Key ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkey . matches ("^ [^ : ]* : sub - id : [^ : ]* $ ". to Regex ()) Ċ } Ċ Ċ private Ġfun Ġcurrent Date UTC (): ĠDateTime Ġ{ ĊĠĠĠ Ġreturn ĠDateTime (). with Zone ( DateTime Zone . UTC ) Ċ } Ċ Ċ private Ġfun Ġtimestamp UTC (): ĠString Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOBJECT _ MAP PER . writeValue AsString ( current Date UTC (). millis ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġwrite Ġtimestamp Ġas ĠJSON .", Ġe ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġtimestamp ToDate UTC ( timestamp : ĠLong ): ĠDateTime Ġ{ ĊĠĠĠ Ġreturn ĠDateTime ( timestamp ). with Zone ( DateTime Zone . UTC ) Ċ } Ċ Ċ private Ġfun Ġtimestamp ToDate UTC ( timestamp : ĠString ): ĠDateTime Ġ{ ĊĠĠĠ Ġreturn ĠDateTime ( java . lang . Long . valueOf ( timestamp )). with Zone ( DateTime Zone . UTC ) Ċ } Ċ Ċ @ Component Ċ abstract Ġclass ĠAbstract Policy Evaluation Cache Ġ: ĠPolicy Evaluation Cache Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconnector Service : ĠAttribute Connector Service ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġget Ġthe ĠPolicy ĠEvaluation ĠResult Ġfrom Ġthe Ġcache . ĠIt Ġwill Ġcheck Ġif Ġany Ġof Ġthe Ġsubject , Ġpolicy ĊĠĠĠĠ Ġ* Ġsets Ġor Ġresolved Ġresource ĠURI 's Ġhave Ġa Ġtimestamp Ġin Ġthe Ġcache Ġafter Ġthe Ġtimestamp Ġof Ġthe ĠPolicy ĠEvaluation ĊĠĠĠĠ Ġ* ĠResult . ĠIf Ġthe Ġkey Ġis Ġnot Ġin Ġthe Ġcache Ġor Ġthe Ġresult Ġis Ġinvalid ated , Ġit Ġwill Ġreturn Ġnull . ĠAlso Ġit Ġwill Ġremove ĊĠĠĠĠ Ġ* Ġthe ĠPolicy ĠEvaluation Result Ġso Ġthat Ġsubsequent Ġevalu ations Ġwon 't Ġfind Ġthe Ġkey Ġin Ġthe Ġcache . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĠThe ĠPolicy ĠEvaluation Ġkey Ġto Ġretrieve . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠPolicy ĠEvaluation ĠResult Ġif Ġthe Ġkey Ġis Ġin Ġthe Ġcache Ġand Ġthe Ġresult Ġisn 't Ġinvalid ated , Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠPolicy Evaluation Request CacheKey ): ĠPolicy Evaluation Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġresult Ġrelated Ġentries ĊĠĠĠĠĠĠĠ Ġval Ġcached Entries Ġ= ĠDecision Cache Entries ( key ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcached Eval Result String Ġ= Ġcached Entries . decision String Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcached Eval Result Ġ= Ġto Policy Evaluation Result ( cached Eval Result String ) ĊĊĠĠĠĠĠĠĠ Ġval Ġattribute Invalid ation TimeStamp s Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠ Ġval Ġpolicy Invalid ation TimeStamp s Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠ Ġattribute Invalid ation TimeStamp s . add ( cached Entries . subject LastModified ) ĊĠĠĠĠĠĠĠ Ġpolicy Invalid ation TimeStamp s . addAll ( cached Entries . policy Sets LastModified ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcached Resolved Resource U ris Ġ= Ġcached Eval Result . resolved Resource U ris ĊĊĠĠĠĠĠĠĠ Ġ// Ġis Ġrequested Ġresource Ġid Ġsame Ġas Ġresolved Ġresource Ġuri Ġ? ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Resolved Resource U ris . size Ġ== Ġ 1 Ġ&& Ġcached Resolved Resource U ris . iterator (). next () Ġ== Ġkey . resourceId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Invalid ation TimeStamp s . add ( cached Entries . requested Resource LastModified ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Resolved Resource Keys Ġ= Ġcached Resolved Resource U ris ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresolved Resource Uri Ġ-> Ġresource Key ( key . zone Id !! , Ġresolved Resource Uri ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Invalid ation TimeStamp s . addAll ( multi Get ( cache Resolved Resource Keys )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Cached Request Invalid ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Invalid ation TimeStamp s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy Invalid ation TimeStamp s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp ToDate UTC ( cached Eval Result . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( cached Entries . decision Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug (" Cached Ġdecision Ġfor Ġkey Ġ'{}' Ġis Ġnot Ġvalid .", Ġcached Entries . decision Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcached Eval Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Policy Evaluation Result ( cached Decision String : ĠString ): ĠPolicy Evaluation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOBJECT _ MAP PER . readValue ( cached Decision String , ĠPolicy Evaluation Result :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġread Ġpolicy Ġevaluation Ġresult Ġas ĠJSON .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDecision Cache Entries ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġa Ġmulti - get Ġoperation Ġon Ġall Ġentries Ġrelated Ġto Ġa Ġcached Ġresult , ĊĠĠĠĠ Ġ* Ġand Ġprovides Ġa Ġimmutable Ġobject Ġfor Ġthe Ġvalues Ġfetched . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġconstructor ( eval Request Key : ĠPolicy Evaluation Request CacheKey ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġentry Values : ĠList < String ?> ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġentry Keys : ĠList < String > ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpolicy Set Timestamp s Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlast Value Index : ĠInt ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġdecision Key : ĠString Ġ= Ġeval Request Key . to Decision Key () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ( eval Ġresult , Ġeval Ġtime , Ġresolved Ġresource Ġuri ( s )). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġdecision String : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġentry Values [ this . last Value Index ] ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġsubject LastModified : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġentry Values [ last Value Index Ġ- Ġ 2 ] ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġrequested Resource LastModified : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġentry Values [ last Value Index Ġ- Ġ 1 ] ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpolicy Sets LastModified : ĠList < String ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . policy Set Timestamp s ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġvalues Ġwith Ġa Ġbatch Ġget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . entry Keys Ġ= Ġprepare Keys ( eval Request Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . entry Values Ġ= Ġmulti Get ( this . entry Keys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . last Value Index Ġ= Ġthis . entry Values . size Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Cache Get Debug Messages ( eval Request Key , Ġthis . decision Key , Ġthis . entry Keys , Ġthis . entry Values ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġseparate Ġlist Ġof Ġpolicy Set Times Ġto Ġprevent Ġmutation Ġon Ġentry Values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġeval Request Key . policy Set Ids . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . policy Set Timestamp s . add ( this . entry Values [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġkeys Ġto Ġfetch Ġin Ġone Ġbatch ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprepare Keys ( eval Request Key : ĠPolicy Evaluation Request CacheKey ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġ' n ' ĠPolicy ĠSet Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpolicy Set Ids Ġ= Ġeval Request Key . policy Set Ids ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy Set Ids . forEach Ġ{ Ġpolicy SetId Ġ-> Ġkeys . add ( policy Set Key ( eval Request Key . zone Id !! , Ġpolicy SetId !! )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġn + 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( subject Key ( eval Request Key . zone Id !! , Ġeval Request Key . subject Id !! )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġn + 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( resource Key ( eval Request Key . zone Id , Ġeval Request Key . resourceId !! )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġn + 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( this . decision Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Cache Get Debug Messages ( ĊĠĠĠĠĠĠĠ Ġkey : ĠPolicy Evaluation Request CacheKey , ĊĠĠĠĠĠĠĠ Ġredis Key : ĠString , ĊĠĠĠĠĠĠĠ Ġkeys : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġvalues : ĠList < String ?> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpolicy Set Ids Ġ= Ġkey . policy Set Ids ĊĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( policy SetId Ġin Ġpolicy Set Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Getting Ġtimestamp Ġfor Ġpolicy Ġset : Ġ'{} ', Ġkey : Ġ'{} ', Ġtimestamp :' {}'. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy SetId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys [ idx ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ idx ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLOGGER . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Getting Ġtimestamp Ġfor Ġsubject : Ġ'{} ', Ġkey : Ġ'{} ', Ġtimestamp :' {}'. ", Ġkey . subject Id , Ġkeys [ idx ], Ġvalues [ idx ++] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLOGGER . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Getting Ġtimestamp Ġfor Ġresource : Ġ'{} ', Ġkey : Ġ'{} ', Ġtimestamp :' {}'. ", Ġkey . resourceId , Ġkeys [ idx ], Ġvalues [ idx ++] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLOGGER . debug (" Getting Ġpolicy Ġevaluation Ġfrom Ġcache ; Ġkey : Ġ'{} ', Ġvalue : Ġ'{} '. ", Ġredis Key , Ġvalues [ idx ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSet 's Ġthe Ġpolicy Ġevaluation Ġkey Ġto Ġthe Ġpolicy Ġevaluation Ġresult Ġin Ġthe Ġcache ĊĠĠĠ Ġoverride Ġfun Ġset ( ĊĠĠĠĠĠĠĠ Ġkey : ĠPolicy Evaluation Request CacheKey , ĊĠĠĠĠĠĠĠ Ġvalue : ĠPolicy Evaluation Result ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Entity Timestamp s ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . timestamp Ġ= Ġcurrent Date UTC (). millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠOBJECT _ MAP PER . writeValue AsString ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( key . to Decision Key (), Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug (" Setting Ġpolicy Ġevaluation Ġto Ġcache ; Ġkey : Ġ'{} ', Ġvalue : Ġ'{} '. ", Ġkey . to Decision Key (), Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġwrite Ġpolicy Ġevaluation Ġresult Ġas ĠJSON .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Entity Timestamp s ( ĊĠĠĠĠĠĠĠ Ġkey : ĠPolicy Evaluation Request CacheKey , ĊĠĠĠĠĠĠĠ Ġresult : ĠPolicy Evaluation Result ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġensures Ġthat Ġif Ġthe Ġtimestamp Ġfor Ġany Ġentity Ġinvolved Ġin Ġthis Ġdecision Ġis Ġnot Ġin Ġthe Ġcache Ġat Ġthe Ġtime ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġthis Ġevaluation , Ġit Ġwill Ġbe Ġput Ġthere Ġso Ġthat Ġin Ġsubsequent Ġevalu ations , Ġwe Ġwill Ġuse Ġthe Ġcached ĊĠĠĠĠĠĠĠ Ġ// Ġdecision . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġreset Ġthe Ġtimestamp Ġto Ġnow Ġfor Ġentities Ġonly Ġif Ġthey Ġdo Ġnot Ġexist Ġin Ġthe Ġcache Ġso Ġthat Ġwe Ġdon 't ĊĠĠĠĠĠĠĠ Ġ// Ġinvalidate Ġprevious Ġcached Ġdecisions . ĊĠĠĠĠĠĠĠ ĠLOGGER . debug (" Setting Ġtimestamp Ġto Ġnow Ġfor Ġentities Ġif Ġthey Ġdo Ġnot Ġexist Ġin Ġthe Ġcache ") ĊĊĠĠĠĠĠĠĠ Ġval Ġzone Id Ġ= Ġkey . zone Id !! ĊĠĠĠĠĠĠĠ Ġset Subject IfNot Exists ( zone Id , Ġkey . subject Id !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Resource U ris Ġ= Ġresult . resolved Resource U ris ĊĠĠĠĠĠĠĠ Ġfor Ġ( resolved Resource Uri Ġin Ġresolved Resource U ris ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Resource IfNot Exists ( zone Id , Ġresolved Resource Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpolicy Set Ids Ġ= Ġkey . policy Set Ids ĊĠĠĠĠĠĠĠ Ġfor Ġ( policy SetId Ġin Ġpolicy Set Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Policy Set IfNot Exists ( zone Id , Ġpolicy SetId !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpolicy Set Ids . forEach Ġ{ Ġset Policy Set IfNot Exists ( zone Id , Ġit !! ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset ( key : ĠPolicy Evaluation Request CacheKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġkeys ( key . to Decision Key ()) ĊĠĠĠĠĠĠĠ Ġdelete ( keys ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMethod Ġwhich Ġresets Ġthe Ġtimestamp Ġfor Ġthe Ġgiven Ġentity Ġin Ġthe Ġpolicy Ġevaluation Ġcache . ĊĠĠĠ Ġprivate Ġfun Ġreset For Entity ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġentity Id : ĠString , ĊĠĠĠĠĠĠĠ Ġentity Type : ĠEntityType , ĊĠĠĠĠĠĠĠ ĠgetKey : Ġ( String , ĠString ) Ġ-> ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠgetKey ( zone Id , Ġentity Id ) ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġtimestamp UTC () ĊĠĠĠĠĠĠĠ Ġlog Set Entity Timestamp s Debug Message ( timestamp , Ġkey , Ġentity Id , Ġentity Type ) ĊĠĠĠĠĠĠĠ Ġset ( key , Ġtimestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Entity IfNot Exists ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġentity Id : ĠString , ĊĠĠĠĠĠĠĠ ĠgetKey : Ġ( String , ĠString ) Ġ-> ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠgetKey ( zone Id , Ġentity Id ) ĊĠĠĠĠĠĠĠ Ġset IfNot Exists ( key , Ġtimestamp UTC ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Set Entity Timestamp s Debug Message ( ĊĠĠĠĠĠĠĠ Ġtimestamp : ĠString , ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġentity Id : ĠString ?, ĊĠĠĠĠĠĠĠ Ġentity Type : ĠEntityType ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER . debug (" Setting Ġtimestamp Ġfor Ġ{} Ġ'{} '; Ġkey : Ġ'{} ', Ġvalue : Ġ'{} '", Ġentity Type , Ġentity Id , Ġkey , Ġtimestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Policy Set ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġpolicy SetId : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset For Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy SetId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . POLICY _ SET ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġpolicy Set Key ( zone Id , Ġpolicy SetId ) Ġ} ĊĠĠĠĠĠĠĠ Ġreset For Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠANY _ POLICY _ SET _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . POLICY _ SET ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġpolicy Set Key ( zone Id , ĠANY _ POLICY _ SET _ KEY ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Policy Set IfNot Exists ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġpolicy SetId : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Entity IfNot Exists ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy SetId ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġpolicy Set Key ( zone Id , Ġpolicy SetId ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Resource ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġresource Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset For Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . RESOURCE ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġresource Key ( zone Id , Ġresource Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Resource IfNot Exists ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġresource Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Entity IfNot Exists ( zone Id , Ġresource Id ) Ġ{ Ġ_, Ġ_ Ġ-> Ġresource Key ( zone Id , Ġresource Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Resources ById s ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġresource Ids : ĠSet < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( resourceId Ġin Ġresource Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mut li Set Entity Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . RESOURCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġresource Key ( zone Id , Ġresource Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmulti Set ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Resources ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġentities : ĠList < Resource Entity > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( resource Entity Ġin Ġentities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mut li Set Entity Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Entity . resource Identifier !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . RESOURCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġresource Id Ġ-> Ġresource Key ( zone Id , Ġresource Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmulti Set ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Subject ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġsubject Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset For Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . SUBJECT ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġsubject Key ( zone Id , Ġsubject Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Subject IfNot Exists ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġsubject Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Entity IfNot Exists ( zone Id , Ġsubject Id ) Ġ{ Ġ_, Ġ_ Ġ-> Ġsubject Key ( zone Id , Ġsubject Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Subject s ById s ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġsubject Ids : ĠSet < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( subject Id Ġin Ġsubject Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mut li Set Entity Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . SUBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġ_ Ġ-> Ġsubject Key ( zone Id , Ġsubject Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmulti Set ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset For Subject s ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġsubject Entities : ĠList < Subject Entity > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( subject Entity Ġin Ġsubject Entities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mut li Set Entity Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzone Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Entity . subject Identifier !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntityType . SUBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġsubject Id Ġ-> Ġsubject Key ( zone Id , Ġsubject Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmulti Set ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Mut li Set Entity Map ( ĊĠĠĠĠĠĠĠ Ġzone Id : ĠString , ĊĠĠĠĠĠĠĠ Ġmap : ĠMutable Map < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġsubject Id : ĠString , ĊĠĠĠĠĠĠĠ Ġentity Type : ĠEntityType , ĊĠĠĠĠĠĠĠ ĠgetKey : Ġ( String , ĠString ) Ġ-> ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠgetKey ( zone Id , Ġsubject Id ) ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġtimestamp UTC () ĊĠĠĠĠĠĠĠ Ġlog Set Entity Timestamp s Debug Message ( key , Ġtimestamp , Ġsubject Id , Ġentity Type ) ĊĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġtimestamp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Cached Request Invalid ( ĊĠĠĠĠĠĠĠ Ġattribute Invalid ation TimeStamp s : ĠList < String ? >, ĊĠĠĠĠĠĠĠ Ġpolicy Invalid ation TimeStamp s : ĠList < String ? >, ĊĠĠĠĠĠĠĠ Ġpolicy Eval Timestamp UTC : ĠDateTime ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( have Entities Changed ( policy Invalid ation TimeStamp s , Ġpolicy Eval Timestamp UTC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . connector Service . is Resource Attribute Connector Configured Ġ|| Ġthis . connector Service . is Subject Attribute Connector Configured ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhave Connector Cache Intervals L apsed ( this . connector Service , Ġpolicy Eval Timestamp UTC ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhave Entities Changed ( attribute Invalid ation TimeStamp s , Ġpolicy Eval Timestamp UTC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġchecks Ġto Ġsee Ġif Ġany Ġobjects Ġrelated Ġto Ġthe Ġpolicy Ġevaluation Ġhave Ġbeen Ġchanged Ġsince Ġthe ĠPolicy ĊĠĠĠĠ Ġ* ĠEvaluation ĠResult Ġwas Ġcached . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalues ĠList Ġof Ġvalues Ġwhich Ġcontain Ġsubject , Ġpolicy Ġsets Ġand Ġresolved Ġresource ĠURI 's . ĊĠĠĠĠ Ġ* Ġ@ param Ġpolicy Eval Timestamp UTC ĠThe Ġtimestamp Ġto Ġcompare Ġagainst . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġor Ġfalse Ġdepending Ġon Ġwhether Ġany Ġof Ġthe Ġobjects Ġin Ġvalues Ġhas Ġa Ġtimestamp Ġafter ĊĠĠĠĠ Ġ* Ġpolicy Eval Timestamp UTC . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhave Entities Changed ( ĊĠĠĠĠĠĠĠ Ġvalues : ĠList < String ? >, ĊĠĠĠĠĠĠĠ Ġpolicy Eval Timestamp UTC : ĠDateTime ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid ation Timestamp UTC Ġ= Ġtimestamp ToDate UTC ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invalid ation Timestamp UTC . is After ( policy Eval Timestamp UTC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Privilege Ġservice Ġattributes Ġhave Ġtimestamp Ġ'{}' Ġwhich Ġis Ġafter Ġ" Ġ+ Ġ" policy Ġevaluation Ġtimestamp Ġ'{} '", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid ation Timestamp UTC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy Eval Timestamp UTC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhave Connector Cache Intervals L apsed ( ĊĠĠĠĠĠĠĠ Ġlocal Connector Service : ĠAttribute Connector Service , ĊĠĠĠĠĠĠĠ Ġpolicy Eval Timestamp UTC : ĠDateTime ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow UTC Ġ= Ġcurrent Date UTC () ĊĊĠĠĠĠĠĠĠ Ġval Ġdecision Age Minutes Ġ= ĠMin utes . minutes Between ( policy Eval Timestamp UTC , Ġnow UTC ). minutes ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Resource Connector Interval L apsed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Connector Service . is Resource Attribute Connector Configured Ġ&& Ġdecision Age Minutes Ġ>= Ġlocal Connector Service . resource Attribute Connector !!. max Cached Interval Minutes ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Subject Connector Interval L apsed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Connector Service . is Subject Attribute Connector Configured Ġ&& Ġdecision Age Minutes Ġ>= Ġlocal Connector Service . subject Attribute Connector !!. max Cached Interval Minutes ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhas Resource Connector Interval L apsed Ġ|| Ġhas Subject Connector Interval L apsed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġdelete ( key : ĠString ) ĊĊĠĠĠ Ġabstract Ġfun Ġdelete ( keys : ĠCollection < String >) ĊĊĠĠĠ Ġabstract Ġfun Ġflush All () ĊĊĠĠĠ Ġabstract Ġfun Ġkeys ( key : ĠString ): ĠSet < String > ĊĊĠĠĠ Ġabstract Ġfun Ġmulti Get ( keys : ĠList < String >): ĠList < String ?> ĊĊĠĠĠ Ġabstract Ġfun Ġmulti Set ( map : ĠMap < String , ĠString >) ĊĊĠĠĠ Ġabstract Ġoperator Ġfun Ġset ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġabstract Ġfun Ġset IfNot Exists ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString ĊĠĠĠ Ġ) Ċ } Ċ