package Ġorg . radar base . red cap . config Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . Property Naming Strategy Ċ import Ġcom . fasterxml . jackson . data format . yaml . YAML Factory Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġorg . radar base . red cap . webapp . exception . Illegal RequestException Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠKing 's ĠCollege ĠLondon Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ /** Ċ Ġ* ĠSingleton Ġclass Ġto Ġmanage Ġconfiguration Ġfiles . Ċ Ġ*/ Ċ object ĠProperties Ġ{ ĊĠĠĠ Ġ/** ĠLogger . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLoggerFactory . getLogger ( Properties :: class . java ) ĊĠĠĠ Ġprivate Ġconst Ġval ĠHTTPS Ġ= Ġ" https " ĊĊĠĠĠ Ġ/** ĠPath Ġto Ġthe Ġconfiguration Ġfile . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠPATH _ FILE Ġ= Ġ"/ usr / local / etc / radar - red cap - int /" ĊĊĠĠĠ Ġ/** ĠPlace holder Ġalternative Ġpath Ġfor Ġthe Ġconfig Ġfolder . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠCONFIG _ FOLDER Ġ= Ġ" RE DC AP _ INTEGR ATION _ CONFIG _ FOLDER " ĊĊĠĠĠ Ġ/** ĠAPI ĠConfig Ġfile Ġname . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠNAME _ CONFIG _ FILE Ġ= Ġ" radar . yml " ĊĊĠĠĠ Ġval ĠCONFIG : ĠConfiguration Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Api Config () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exec : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( exec . message , Ġexec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException In Initializer Error ( exec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmapper Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠObjectMapper ( YAML Factory ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Module ( Kotlin Module ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Naming Strategy Ġ= ĠProperty Naming Strategy . S NA KE _ CASE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġthe ĠAPI Ġconfiguration Ġfile . ĠFirst Ġof Ġall , Ġthe Ġ` CONFIG _ FOLDER ` Ġenv Ġvariable Ġis ĊĠĠĠĠ Ġ* Ġchecked Ġto Ġverify Ġif Ġpoints Ġa Ġvalid Ġconfig Ġfile . ĠIf Ġnot , Ġthe Ġdefault Ġlocation Ġfor ĠAWS ĊĠĠĠĠ Ġ* Ġand ĠDocker Ġimage Ġdeployment Ġare Ġchecked . ĠIn Ġthe Ġlast Ġinstance , Ġthe Ġconfig Ġfile Ġis ĊĠĠĠĠ Ġ* Ġsearched Ġinside Ġthe Ġdefault Ġprojects Ġresources Ġfolder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġload Api Config (): ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getenv ( CONFIG _ FOLDER ) Ġ?: Ġ".", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPATH _ FILE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġpaths ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Api Config ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠProperties :: class . java . class Loader . getResource ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAME _ CONFIG _ FILE ĊĠĠĠĠĠĠĠ Ġ) ?. file ĊĠĠĠĠĠĠĠ Ġval Ġfolders Ġ= Ġpaths . copyOf Range ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . getenv ( CONFIG _ FOLDER ) Ġ== Ġnull ) Ġ 1 Ġelse Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! check File Exist ( path ) Ġ&& Ġ! folders . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck File Exist ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Config Ġfile Ġ{} Ġcannot Ġbe Ġfound Ġat Ġ{} Ġor Ġin Ġthe Ġresources Ġfolder .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNAME _ CONFIG _ FILE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG _ FOLDER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException ("$ NAME _ CONFIG _ FILE Ġcannot Ġbe Ġfound .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLOGGER . info (" Loading ĠConfig Ġfile Ġlocated Ġat Ġ: Ġ{}", Ġpath ) ĊĠĠĠĠĠĠĠ Ġreturn Ġload Config ( File ( path !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġload Api Config ( path : ĠString ): ĠConfiguration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġpath Ġ+ ĠNAME _ CONFIG _ FILE ĊĠĠĠĠĠĠĠ Ġif Ġ( check File Exist ( filePath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Loading ĠConfig Ġfile Ġlocated Ġat Ġ: Ġ{}", Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Config ( file : ĠFile ): ĠConfiguration Ġ= Ġfile . inputStream (). use Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper . readValue ( it , ĠConfiguration :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġgive Ġpath Ġpoints Ġa Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpath Ġthat Ġshould Ġpoint Ġa Ġfile ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġ` path ` Ġpoints Ġa Ġfile , Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck File Exist ( path : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( path Ġ== Ġnull ) Ġfalse Ġelse ĠFile ( path ). exists () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġall Ġconfigurations Ġand Ġconverts Ġthem Ġto Ġ[ String ]. ĠIf Ġthe Ġconversion ĊĠĠĠĠ Ġ* Ġfails , Ġit Ġmeans Ġthat Ġthe Ġconfig Ġfiles Ġare Ġwrong . ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ String ] Ġrepresenting Ġthe Ġloaded Ġconfigurations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate (): ĠString Ġ= ĠCONFIG . toString () ĊĊĠĠĠ Ġfun Ġis Supported Instance ( url : ĠURL , ĠprojectId : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= ĠRed Cap Info ( url , ĠprojectId ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCONFIG . projects . any Ġ{ Ġit . red Cap Info Ġ== Ġidentifier Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Red Cap Info ( url : ĠURL , ĠprojectId : ĠInt ): ĠRed Cap Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= ĠRed Cap Info ( url , ĠprojectId ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCONFIG . projects . find Ġ{ Ġit . red Cap Info Ġ== Ġidentifier Ġ} ?. red Cap Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegal RequestException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġproject Ġ$ projectId Ġfor Ġinstance Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mp Info ( url : ĠURL , ĠprojectId : ĠInt ): ĠManagement Portal Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= ĠRed Cap Info ( url , ĠprojectId ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCONFIG . projects . find Ġ{ Ġit . red Cap Info Ġ== Ġidentifier Ġ} ?. mp Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegal RequestException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġproject Ġ$ projectId Ġfor Ġinstance Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe ĠOAuth 2 Ġclient Ġid Ġto Ġaccess ĠManagement Portal . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġclient Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġoauth ClientId : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCONFIG . mp Config . oauth ClientId ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe ĠOAuth 2 Ġclient Ġsecret Ġto Ġaccess ĠManagement Portal . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġclient Ġsecret ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġoauth Client Secret : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCONFIG . mp Config . oauth Client Secret ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġthe Ġtoken Ġend Ġpoint Ġ[ URL ] Ġneeded Ġto Ġrefresh Ġtokens Ġagainst ĠManagement ĠPortal . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ URL ] Ġuseful Ġto Ġrefresh Ġtokens ĊĠĠĠĠ Ġ* Ġ@ throws ĠMal formed URLException Ġin Ġcase Ġthe Ġ[ URL ] Ġcannot Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ get : Throws ( Malformed URLException :: class ) ĊĠĠĠ Ġval Ġtoken EndPoint : ĠURL ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠURL ( validate Mp Url (), ĠCONFIG . mp Config . token Endpoint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġthe Ġtoken Ġend Ġpoint Ġ[ URL ] Ġneeded Ġto Ġmanage Ġsubjects Ġon ĠManagement ĠPortal . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ URL ] Ġuseful Ġcreate Ġand Ġupdate Ġsubjects ĊĠĠĠĠ Ġ* Ġ@ throws ĠMal formed URLException Ġin Ġcase Ġthe Ġ[ URL ] Ġcannot Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ get : Throws ( Malformed URLException :: class ) ĊĠĠĠ Ġval Ġsubject EndPoint : ĠURL ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠURL ( validate Mp Url (), ĠCONFIG . mp Config . subject Endpoint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġthe ĠProject Ġend Ġpoint Ġ[ URL ] Ġneeded Ġto Ġread Ġprojects Ġon ĠManagement ĠPortal . ĊĠĠĠĠ Ġ* Ġ@ param Ġmp Info Ġ[ Management Portal Info ] Ġused Ġto Ġextract Ġthe ĠManagement ĠPortal Ġproject ĊĠĠĠĠ Ġ* Ġidentifier ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ URL ] Ġuseful Ġto Ġread Ġproject Ġinformation ĊĠĠĠĠ Ġ* Ġ@ throws ĠMal formed URLException Ġin Ġcase Ġthe Ġ[ URL ] Ġcannot Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Malformed URLException :: class ) ĊĠĠĠ Ġfun Ġget Project EndPoint ( mp Info : ĠManagement Portal Info ): ĠURL Ġ= ĠURL ( ĊĠĠĠĠĠĠĠ Ġproject EndPoint , Ġmp Info . projectName ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġthe Ġbase ĠProject Ġend Ġpoint Ġ[ URL ] Ġneeded Ġto Ġread Ġprojects Ġon ĠManagement ĠPortal . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ URL ] Ġuseful Ġto Ġread Ġproject Ġinformation ĊĠĠĠĠ Ġ* Ġ@ throws ĠMal formed URLException Ġin Ġcase Ġthe Ġ[ URL ] Ġcannot Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ get : Throws ( Malformed URLException :: class ) ĊĠĠĠ Ġval Ġproject EndPoint : ĠURL ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠURL ( validate Mp Url (), ĠCONFIG . mp Config . project Endpoint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġprovided Ġ[ URL ] Ġis Ġusing Ġa Ġsecure Ġconnection Ġor Ġnot . ĊĠĠĠĠ Ġ* Ġ@ param Ġurl Ġ[ URL ] Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġprotocol Ġis Ġ` HTTPS `, Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Secure Connection ( url : ĠURL ): ĠBoolean Ġ= Ġurl . protocol Ġ== ĠHTTPS ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ URL ] Ġpointing Ġa ĠManagement ĠPortal Ġinstance Ġand ĠChecks Ġif Ġit Ġis Ġusing Ġa ĊĠĠĠĠ Ġ* Ġsecure Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ URL ] Ġpointing Ġthe ĠManagement ĠPortal Ġinstance Ġspecified Ġon Ġthe Ġconfig Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate Mp Url (): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Secure Connection ( CONFIG . mp Config . management Portal Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġprovided ĠManagement ĠPortal Ġinstance Ġis Ġnot Ġusing Ġan Ġencrypted " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġconnection ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCONFIG . mp Config . management Portal Url ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġprovided Ġ[ URL ] Ġis Ġusing Ġa Ġsecure Ġconnection Ġand Ġreturns Ġit . ĊĠĠĠĠ Ġ* Ġ@ param Ġurl Ġ[ URL ] Ġto Ġhas Ġto Ġbe Ġchecked ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġprovided Ġ[ URL ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate Red cap Url ( url : ĠURL ): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Secure Connection ( url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" The Ġprovided ĠRED Cap Ġinstance Ġis Ġnot Ġusing Ġan Ġencrypted Ġconnection .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġurl ĊĠĠĠ Ġ} Ċ }