package Ġno . nav . hel se . spark el . person info Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġh enter Ġjwt Ġtoken Ġf ra ĠST S Ċ Ġ*/ Ċ internal Ġclass ĠSt s RestClient ( ĊĠĠĠ Ġprivate Ġval ĠbaseUrl : ĠString , ĊĠĠĠ Ġprivate Ġval Ġservice User : ĠService User Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcached Oid c Token : ĠToken Ġ= Ġfetch Token () ĊĊĠĠĠ Ġinternal Ġfun Ġtoken (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Oid c Token . expired ) Ġcached Oid c Token Ġ= Ġfetch Token () ĊĠĠĠĠĠĠĠ Ġreturn Ġcached Oid c Token . access _ token ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Token (): ĠToken Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ baseUrl / rest / v 1 / sts / token ? grant _ type = client _ credentials & scope = openid " ĊĠĠĠĠĠĠĠ Ġval Ġ( response Code , Ġresponse Body ) Ġ= Ġwith ( URL ( url ). open Connection () Ġas ĠHttp URLConnection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Method Ġ= Ġ" GET " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Timeout Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Timeout Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Request Property (" Authorization ", Ġservice User . basic Auth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Request Property (" Accept ", Ġ" application / json ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream : ĠInputStream ? Ġ= Ġif Ġ( response Code Ġ< Ġ 3 0 0 ) Ġthis . inputStream Ġelse Ġthis . error Stream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code Ġto Ġstream ?. buffered Reader ()?. read Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( response Code Ġ>= Ġ 3 0 0 Ġ|| Ġresponse Body Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" unknown Ġerror Ġ( response Code =$ response Code ) Ġfrom Ġst s ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠobjectMapper . readValue ( response Body ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠToken ( ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġaccess _ token : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtoken _ type : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexpires _ in : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġexpire Ġ 1 0 Ġseconds Ġbefore Ġactual Ġexpiry . Ġfor Ġgreat Ġmargins . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexpiration Time : ĠLocalDateTime Ġ= ĠLocalDateTime . now (). plus Seconds ( expires _ in Ġ- Ġ 1 0 L ) ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġexpired Ġget () Ġ= Ġexpiration Time . is Before ( LocalDateTime . now ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠService User ( ĊĠĠĠ Ġusername : ĠString , ĊĠĠĠ Ġpassword : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġval Ġbasic Auth Ġ= Ġ" Basic Ġ${ Base 6 4 . get Encoder (). encode ToString ("$ username :$ password ". toByteArray ()) }" Ċ } Ċ