package Ġtech . sim ter . reactive . context Ċ Ċ import Ġreactor . core . publisher . Mono Ċ import Ġtech . sim ter . exception . Permission Denied Exception Ċ import Ġtech . sim ter . exception . Un authenticated Exception Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThe Ġreactive Ġsystem - context . Ċ Ġ* Ċ Ġ* ĠSee Ġ[" 8 . 8 . ĠAdding Ġa ĠContext Ġto Ġa ĠReactive ĠSequence "]( http :// project reactor . io / docs / core / release / reference /# context ) Ċ Ġ* Ċ Ġ* Ġ@ author ĠR J Ċ Ġ*/ Ċ object ĠSystem Context Ġ{ ĊĠ Ġconst Ġval ĠSYSTEM _ CONTEXT _ KEY : ĠString Ġ= Ġ" ST _ SYSTEM _ CONTEXT " ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġsystem - context Ġdata - holder . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġ[ Mono . empty ] Ġif Ġwithout Ġa Ġsystem - context . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠgetData Holder (): ĠMono < Data Holder > Ġ{ ĊĠĠĠ Ġreturn ĠMono . subscriber Context () ĊĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . has Key ( SYSTEM _ CONTEXT _ KEY )) ĠMono . just ( it . get < Data Holder >( SYSTEM _ CONTEXT _ KEY )) ĊĠĠĠĠĠĠĠ Ġelse ĠMono . empty () ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġthe Ġspecific Ġ[ key ] Ġvalue . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġ[ Mono . empty ] Ġif Ġthere Ġwas Ġno Ġmapping Ġfor Ġ[ key ] ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġfun Ġ< V > Ġget ( key : ĠString ): ĠMono < V > Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder (). flatMap Ġ{ ĠMono . just OrEmpty ( it . extras [ key ] Ġas ĠV ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġthe Ġspecific Ġ[ key ] Ġvalue . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn ĠMono . just ([ Optional . empty ]) Ġif Ġthere Ġwas Ġno Ġmapping Ġfor Ġ[ key ] ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġfun Ġ< V > Ġget Optional ( key : ĠString ): ĠMono < Optional < V >> Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder () ĊĠĠĠĠĠ Ġ. map Ġ{ ĠOptional . of Nullable ( it . extras [ key ] Ġas ĠV ) Ġ} ĊĠĠĠĠĠ Ġ. switch If Empty ( Mono . just ( Optional . empty ())) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġthe Ġauthenticated Ġuser Ġinfo . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġa Ġmono Ġinstance Ġwith Ġthe Ġauthenticated Ġuser Ġinfo Ġif Ġhas Ġa Ġauthenticated Ġsystem - context , ĊĠĠ Ġ* Ġotherwise Ġreturn ĠMono . just ([ Optional . empty ]). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Authenticated User (): ĠMono < Optional < User >> Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder () ĊĠĠĠĠĠ Ġ. map Ġ{ ĠOptional . of ( it . user ) Ġ} ĊĠĠĠĠĠ Ġ. switch If Empty ( Mono . just ( Optional . empty ())) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDetermine Ġwhether Ġthe Ġsystem - context Ġhas Ġany Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġ` Mono . just ( true )` Ġif Ġhas Ġa Ġauthenticated Ġsystem - context Ġand Ġit Ġhas Ġany Ġspecified Ġ[ roles ], ĊĠĠ Ġ* Ġotherwise Ġreturn Ġ` Mono . just ( false )`. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhas Any Role ( var arg Ġroles : ĠString ): ĠMono < Boolean > Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder (). map Ġ{ Ġit . has Any Role (* roles ) Ġ}. switch If Empty ( Mono . just ( false )) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDetermine Ġwhether Ġthe Ġsystem - context Ġhas Ġall Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġ` Mono . just ( true )` Ġif Ġhas Ġa Ġauthenticated Ġsystem - context Ġand Ġit Ġhas Ġall Ġspecified Ġ[ roles ], ĊĠĠ Ġ* Ġotherwise Ġreturn Ġ` Mono . just ( false )`. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhas All Role ( var arg Ġroles : ĠString ): ĠMono < Boolean > Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder (). map Ġ{ Ġit . has All Role (* roles ) Ġ}. switch If Empty ( Mono . just ( false )) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠVerify Ġwhether Ġthe Ġsystem - context Ġhas Ġany Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġa Ġ[ Mono . error ] Ġwith Ġ[ Un authenticated Exception ] Ġif Ġwithout Ġa Ġauthenticated Ġsystem - context . ĊĠĠ Ġ* ĠOr Ġreturn Ġa Ġ[ Mono . error ] Ġwith Ġ[ Permission Denied Exception ] Ġif Ġhas Ġa Ġauthenticated Ġsystem - context Ġbut Ġit Ġhas ' ont Ġany Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĠOtherwise Ġreturn Ġ[ Mono . empty ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġverify Has Any Role ( var arg Ġroles : ĠString ): ĠMono < Void > Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder () ĊĠĠĠĠĠ Ġ. switch If Empty ( Mono . error ( Un authenticated Exception (" Without Ġsystem - context "))) ĊĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . has Any Role (* roles )) ĠMono . empty < Void >() ĊĠĠĠĠĠĠĠ Ġelse ĠMono . error ( Permission Denied Exception (" Verify Ġhas Ġany Ġroles Ġfailed : Ġ$ roles ")) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠVerify Ġwhether Ġthe Ġsystem - context Ġhas Ġall Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠReturn Ġa Ġ[ Mono . error ] Ġwith Ġ[ Un authenticated Exception ] Ġif Ġwithout Ġa Ġauthenticated Ġsystem - context . ĊĠĠ Ġ* ĠOr Ġreturn Ġa Ġ[ Mono . error ] Ġwith Ġ[ Permission Denied Exception ] Ġif Ġhas Ġa Ġauthenticated Ġsystem - context Ġbut Ġit Ġhas ' ont Ġall Ġspecified Ġ[ roles ]. ĊĠĠ Ġ* ĠOtherwise Ġreturn Ġ[ Mono . empty ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġverify Has All Role ( var arg Ġroles : ĠString ): ĠMono < Void > Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder () ĊĠĠĠĠĠ Ġ. switch If Empty ( Mono . error ( Un authenticated Exception (" Without Ġsystem - context "))) ĊĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . has All Role (* roles )) ĠMono . empty < Void >() ĊĠĠĠĠĠĠĠ Ġelse ĠMono . error ( Permission Denied Exception (" Verify Ġhas Ġall Ġroles Ġfailed : Ġ$ roles ")) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDetermine Ġwhether Ġthe Ġsystem - context Ġhas Ġ[ role A ], Ġ[ role B ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhas Role ( role A : ĠString , Ġrole B : ĠString ): ĠMono < Pair < Boolean , ĠBoolean >> Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder (). map Ġ{ Ġit . has Role ( role A , Ġrole B ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDetermine Ġwhether Ġthe Ġsystem - context Ġhas Ġ[ role A ], Ġ[ role B ], Ġ[ role C ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhas Role ( role A : ĠString , Ġrole B : ĠString , Ġrole C : ĠString ): ĠMono < Triple < Boolean , ĠBoolean , ĠBoolean >> Ġ{ ĊĠĠĠ Ġreturn ĠgetData Holder (). map Ġ{ Ġit . has Role ( role A , Ġrole B , Ġrole C ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHold Ġthe Ġsystem - context Ġdata . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠData Holder ( ĊĠĠĠ Ġval Ġuser : ĠUser , ĊĠĠĠ Ġprivate Ġval Ġroles : ĠList < String >, ĊĠĠĠ Ġval Ġextras : ĠMap < String , ĠAny > Ġ= Ġempty Map () ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġfun Ġhas Any Role ( var arg Ġroles : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġroles . any Ġ{ Ġthis . roles . contains ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas All Role ( var arg Ġroles : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġroles . all Ġ{ Ġthis . roles . contains ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Role ( role A : ĠString , Ġrole B : ĠString ): ĠPair < Boolean , ĠBoolean > Ġ{ ĊĠĠĠĠĠ Ġreturn ĠPair ( this . roles . contains ( role A ), Ġthis . roles . contains ( role B )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Role ( role A : ĠString , Ġrole B : ĠString , Ġrole C : ĠString ): ĠTrip le < Boolean , ĠBoolean , ĠBoolean > Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTrip le ( this . roles . contains ( role A ), Ġthis . roles . contains ( role B ), Ġthis . roles . contains ( role C )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHold Ġthe Ġauthenticated Ġuser Ġinfo . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠUser ( ĊĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠ Ġval Ġaccount : ĠString , ĊĠĠĠ Ġval Ġname : ĠString ĊĠ Ġ) Ċ }