/* Ċ Ġ* ĠCopyright ĠD 3 ĠLed ger , ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . d 3 . commons . config Ċ Ċ import Ġcom . github . kit tin un f . result . Result Ċ import Ġcom . j dia z can o . cfg 4 k . loaders . Environment Config Loader Ċ import Ġcom . j dia z can o . cfg 4 k . loaders . Property Config Loader Ċ import Ġcom . j dia z can o . cfg 4 k . providers . Override Config Provider Ċ import Ġcom . j dia z can o . cfg 4 k . providers . Proxy Config Provider Ċ import Ġcom . j dia z can o . cfg 4 k . sources . Config Source Ċ import Ġmu . K Logging Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ Ċ // Environment Ġvariable Ġthat Ġholds Ġcurrent Ġapplication Ġprofile Ċ const Ġval ĠPRO FILE _ ENV Ġ= Ġ" PROFILE " Ċ Ċ private Ġval Ġlogger Ġ= ĠK Logging (). logger Ċ Ċ /** Ċ Ġ* ĠI ro ha Ġconfigurations Ċ Ġ*/ Ċ interface ĠI ro ha Config Ġ{ ĊĠĠĠ Ġval Ġhostname : ĠString ĊĠĠĠ Ġval Ġport : ĠInt Ċ } Ċ Ċ /** Ċ Ġ* ĠConfiguration Ġfor ĠI ro ha Ġcredential Ċ Ġ*/ Ċ interface ĠI ro ha Credential Raw Config Ġ{ ĊĠĠĠ Ġ// ĠID Ġof ĠI ro ha Ġaccount ĊĠĠĠ Ġval ĠaccountId : ĠString ĊĠĠĠ Ġ// ĠRaw Ġpublic Ġkey Ġdata Ġin Ġhex Ġformat ĊĠĠĠ Ġval Ġpub key : ĠString ĊĠĠĠ Ġ// ĠRaw Ġprivate Ġkey Ġdata Ġin Ġhex Ġformat ĊĠĠĠ Ġval Ġpriv key : ĠString Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġcurrent Ġprofile Ġbased Ġon Ġenvironment Ġvariable Ċ Ġ*/ Ċ fun Ġget Profile (): ĠString Ġ{ ĊĠĠĠ Ġvar Ġprofile Ġ= ĠSystem . getenv ( PROFILE _ ENV ) ĊĠĠĠ Ġif Ġ( profile Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" No Ġprofile Ġset . ĠUsing Ġdefault Ġlocal Ġprofile " Ġ} ĊĠĠĠĠĠĠĠ Ġprofile Ġ= Ġ" local " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġprofile Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġdefault ĠD 3 Ġconfig Ġfolder Ċ Ġ*/ Ċ fun ĠgetConfig Folder () Ġ= ĠSystem . getProperty (" user . dir ") Ġ+ Ġ"/ configs " Ċ Ċ /** Ċ Ġ* ĠLoad Ġconfigs Ġfrom ĠJava Ġproperties Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > Ġload Configs ( ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġfilename : ĠString Ċ ): ĠResult < T , ĠException > Ġ{ ĊĠĠĠ Ġreturn ĠResult . of Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"${ getConfig Folder ()} ${ get Profile d Config FileName ( filename )}" ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Loading Ġconfig Ġfrom Ġ$ path , Ġprefix Ġ$ prefix " Ġ} ĊĠĠĠĠĠĠĠ Ġload Raw Configs ( prefix , Ġtype , Ġpath ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠLoad Ġconfigs Ġfrom ĠJava Ġproperties Ġlocated Ġin Ġ' resources ' Ġfolder Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > Ġload Local Configs ( ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġfilename : ĠString Ċ ): ĠResult < T , ĠException > Ġ{ ĊĠĠĠ Ġreturn ĠResult . of Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġget Profile d Config FileName ( filename ) ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Loading Ġlocal Ġconfig Ġfrom Ġ$ path , Ġprefix Ġ$ prefix " Ġ} ĊĠĠĠĠĠĠĠ Ġload Raw Local Configs ( prefix , Ġtype , Ġpath ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġfilename Ġwith Ġprofile Ġpostfix Ċ Ġ*/ Ċ private Ġfun Ġget Profile d Config FileName ( filename : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġprofile Ġ= Ġget Profile () ĊĠĠĠ Ġval Ġ( file , Ġextension ) Ġ= Ġfilename . split (".") ĊĠĠĠ Ġreturn Ġ"${ file }_ $ profile .$ extension " Ċ } Ċ Ċ class ĠStream ( private Ġval Ġstream : ĠInputStream ) Ġ: ĠConfig Source Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġread (): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstream ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠLoads Ġconfigs Ġas Ġis ( no Ġprofiles ). Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > Ġload Raw Configs ( ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġfilename : ĠString Ċ ) Ġ= Ġload Stream Config ( prefix , Ġtype , Ġfilename ) Ġ{ ĠFile ( filename ). inputStream () Ġ} Ċ Ċ /** Ċ Ġ* ĠLoads Ġconfigs Ġfrom Ġ' resources ' Ġfolder Ġas Ġis ( no Ġprofiles ). Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > Ġload Raw Local Configs ( ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġfilename : ĠString Ċ ) Ġ= Ġload Stream Config ( prefix , Ġtype , Ġfilename ) Ġ{ ĠThread . currentThread (). context ClassLoader . getResource AsStream ( filename ) Ġ} Ċ Ċ private Ġfun Ġ< T Ġ: ĠAny > Ġload Stream Config ( ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġtype : ĠClass < T >, ĊĠĠĠ Ġfilename : ĠString , ĊĠĠĠ Ġstream Loader : Ġ( String ) Ġ-> ĠInputStream Ċ ): ĠT Ġ{ ĊĠĠĠ Ġval Ġenv Loader Ġ= ĠEnvironment Config Loader () ĊĠĠĠ Ġval Ġenv Provider Ġ= ĠProxy Config Provider ( env Loader ) ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġstream Loader ( filename ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠStream ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Loader Ġ= ĠProperty Config Loader ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠOverride Config Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Config Provider ( config Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . bind ( prefix , Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Couldn 't Ġopen Ġa Ġfile Ġ$ filename . ĠTrying Ġto Ġuse Ġonly Ġenv Ġvariables ." Ġ} ĊĠĠĠĠĠĠĠ Ġenv Provider . bind ( prefix , Ġtype ) ĊĠĠĠ Ġ} Ċ } Ċ