/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġcom . uch uh imo . kon f . source Ċ Ċ import Ġcom . nat pr y ce . ham k rest . assertion . assertThat Ċ import Ġcom . nat pr y ce . ham k rest . equalTo Ċ import Ġcom . nat pr y ce . ham k rest . same Instance Ċ import Ġcom . nat pr y ce . ham k rest . throws Ċ import Ġcom . uch uh imo . kon f . Config Ċ import Ġcom . uch uh imo . kon f . Config Spec Ċ import Ġcom . uch uh imo . kon f . source . properties . Properties Provider Ċ import Ġcom . uch uh imo . kon f . temp File Of Ċ import Ġjava . net . URL Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . given Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġorg . jetbrains . spe k . api . dsl . on Ċ import Ġorg . jetbrains . spe k . subject . Subject Spe k Ċ import Ġorg . jetbrains . spe k . subject . it Be haves Like Ċ import Ġspark . Service Ċ Ċ object ĠDefault Lo aders Spec Ġ: ĠSubject Spe k < Default Lo aders >({ ĊĠĠĠ Ġsubject Ġ{ ĊĠĠĠĠĠĠĠ ĠConfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Spec ( Default Lo aders Config ) ĊĠĠĠĠĠĠĠ Ġ}. from ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġitem Ġ= ĠDefault Lo aders Config . type ĊĊĠĠĠ Ġgiven (" a Ġloader ") Ġ{ ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġsystem Ġenvironment ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . env () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġa Ġconfig Ġwhich Ġcontains Ġvalue Ġfrom Ġsystem Ġenvironment ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" env ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġsystem Ġproperties ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty ( Default Lo aders Config . qual ify ( Default Lo aders Config . type ), Ġ" system ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . system Properties () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġa Ġconfig Ġwhich Ġcontains Ġvalue Ġfrom Ġsystem Ġproperties ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" system ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" dispatch Ġloader Ġbased Ġon Ġextension ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġthrow ĠUnsupported Extension Exception Ġwhen Ġthe Ġextension Ġis Ġunsupported ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ Ġsubject . dispatch Extension (" txt ") Ġ}, Ġthrows < Unsupported Extension Exception >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġthe Ġcorresponding Ġloader Ġwhen Ġthe Ġextension Ġis Ġregistered ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProvider . register Extension ( extension , ĠProperties Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . dispatch Extension ( extension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProvider . unregister Extension ( extension ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġprovider ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . source ( Properties Provider ). file ( temp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġwith Ġthe Ġprovider ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġbuild Ġa Ġnew Ġlayer Ġon Ġthe Ġparent Ġconfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config . parent !! , Ġsame Instance ( subject . config )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom ĠURL ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġproperties Content Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . url ( URL (" http :// localhost :${ service . port () }/ source . properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom ĠURL Ġstring ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġproperties Content Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . url (" http :// localhost :${ service . port () }/ source . properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġfile ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . file ( temp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġfile Ġpath ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtemp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . file ( file . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ item ], ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched Ġfile ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtemp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch File ( file , Ġ 1 , Ġunit Ġ= ĠTimeUnit . SECONDS , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( properties Content . replace (" properties ", Ġ" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġwhen Ġfile Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched Ġfile Ġwith Ġdefault Ġdelay Ġtime ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtemp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch File ( file , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( properties Content . replace (" properties ", Ġ" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġwhen Ġfile Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched Ġfile Ġpath ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtemp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch File ( file . path , Ġ 1 , Ġunit Ġ= ĠTimeUnit . SECONDS , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( properties Content . replace (" properties ", Ġ" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġwhen Ġfile Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched Ġfile Ġpath Ġwith Ġdefault Ġdelay Ġtime ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtemp File Of ( properties Content , Ġsuffix Ġ= Ġ". properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch File ( file . path , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( properties Content . replace (" properties ", Ġ" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected Ġfile Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġwhen Ġfile Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched ĠURL ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġproperties Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" http :// localhost :${ service . port () }/ source . properties " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch Url ( URL ( url ), Ġperiod Ġ= Ġ 1 , Ġunit Ġ= ĠTimeUnit . SECONDS , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġproperties Content . replace (" properties ", Ġ" newValue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġafter ĠURL Ġcontent Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched ĠURL Ġwith Ġdefault Ġdelay Ġtime ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġproperties Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" http :// localhost :${ service . port () }/ source . properties " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch Url ( URL ( url ), Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġproperties Content . replace (" properties ", Ġ" newValue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġafter ĠURL Ġcontent Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched ĠURL Ġstring ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġproperties Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" http :// localhost :${ service . port () }/ source . properties " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch Url ( url , Ġperiod Ġ= Ġ 1 , Ġunit Ġ= ĠTimeUnit . SECONDS , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġproperties Content . replace (" properties ", Ġ" newValue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġafter ĠURL Ġcontent Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġw atched ĠURL Ġstring Ġwith Ġdefault Ġdelay Ġtime ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġproperties Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService . ignite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . port ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get ("/ source . properties ") Ġ{ Ġ_, Ġ_ Ġ-> Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . await Initialization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" http :// localhost :${ service . port () }/ source . properties " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġsubject . watch Url ( url , Ġcontext Ġ= ĠDispatch ers . Sequential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Value Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġproperties Content . replace (" properties ", Ġ" newValue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . Sequential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TimeUnit . SECONDS . to Millis ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġconfig [ item ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġas Ġauto - detected ĠURL Ġformat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( original Value , ĠequalTo (" properties ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġload Ġnew Ġvalue Ġafter ĠURL Ġcontent Ġhas Ġbeen Ġchanged ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( newValue , ĠequalTo (" newValue ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon (" load Ġfrom Ġmap ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġuse Ġthe Ġsame Ġconfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . config , Ġsame Instance ( subject . map . config )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ object ĠDefault Lo aders With Flatten Env Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġgiven (" a Ġloader ") Ġ{ ĊĠĠĠĠĠĠĠ Ġon (" load Ġas Ġflatten Ġformat Ġfrom Ġsystem Ġenvironment ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Spec ( Flatten Default Lo aders Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. from . env ( nested Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġa Ġconfig Ġwhich Ġcontains Ġvalue Ġfrom Ġsystem Ġenvironment ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( config [ Flatten Default Lo aders Config . SOURCE _ TEST _ TYPE ], ĠequalTo (" env ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ object ĠM apped Default Lo aders Spec Ġ: ĠSubject Spe k < Default Lo aders >({ ĊĠĠĠ Ġsubject Ġ{ ĊĠĠĠĠĠĠĠ ĠConfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Spec ( Default Lo aders Config [" source "]) ĊĠĠĠĠĠĠĠ Ġ}. from . mapped Ġ{ Ġit [" source "] Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġit Be haves Like ( Default Lo aders Spec ) Ċ }) Ċ Ċ object ĠPrefix ed Default Lo aders Spec Ġ: ĠSubject Spe k < Default Lo aders >({ ĊĠĠĠ Ġsubject Ġ{ ĊĠĠĠĠĠĠĠ ĠConfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Spec ( Default Lo aders Config . with Prefix (" prefix ")) ĊĠĠĠĠĠĠĠ Ġ}. from . prefix ed (" prefix ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġit Be haves Like ( Default Lo aders Spec ) Ċ }) Ċ Ċ object ĠScoped Default Lo aders Spec Ġ: ĠSubject Spe k < Default Lo aders >({ ĊĠĠĠ Ġsubject Ġ{ ĊĠĠĠĠĠĠĠ ĠConfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Spec ( Default Lo aders Config [" source "]) ĊĠĠĠĠĠĠĠ Ġ}. from . scoped (" source ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġit Be haves Like ( Default Lo aders Spec ) Ċ }) Ċ Ċ object ĠDefault Lo aders Config Ġ: ĠConfig Spec (" source . test ") Ġ{ ĊĠĠĠ Ġval Ġtype Ġby Ġrequired < String >() Ċ } Ċ Ċ object ĠFlat ten Default Lo aders Config Ġ: ĠConfig Spec ("") Ġ{ ĊĠĠĠ Ġval ĠSOURCE _ TEST _ TYPE Ġby Ġrequired < String >() Ċ } Ċ Ċ const Ġval Ġproperties Content Ġ= Ġ" source . test . type Ġ= Ġproperties " Ċ