package Ġcom . tester um . settings Ċ Ċ import Ġcom . tester um . settings . reference _ resolver . Settings Resolver Ċ import Ġcom . tester um _ api . tester um _ steps _ api . test _ context . settings . model . Setting Ċ import Ġcom . tester um _ api . tester um _ steps _ api . test _ context . settings . model . Setting Definition Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ class ĠSettings Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠĠĠ Ġprivate Ġvar Ġdefinitions Ġ= ĠLinkedHashMap < String , ĠSetting Definition >() ĊĠĠĠ Ġprivate Ġvar Ġvalues Ġ= ĠLinkedHashMap < String , ĠString >() ĊĊĠĠĠ Ġprivate Ġvar Ġresolved Ġ= ĠLinkedHashMap < String , ĠSetting >() ĊĊĠĠĠ Ġfun Ġmodify ( build : ĠSettings Manager Modifier . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Definitions Ġ= ĠLinkedHashMap < String , ĠSetting Definition >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Values Ġ= ĠLinkedHashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= Ġobject Ġ: ĠSettings Manager Modifier Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Definition ( definition : ĠSetting Definition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Definitions [ definition . key ] Ġ= Ġdefinition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Definitions ( definitions : ĠList < Setting Definition >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( definition Ġin Ġdefinitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Definition ( definition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Values [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Values ( setting Values : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġsetting Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve With ( additional Definitions , Ġadditional Values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Settings (): ĠList < Setting > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved . values . toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Setting ( key : ĠString ): ĠSetting ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved [ key ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve With ( additional Definitions : ĠLinkedHashMap < String , ĠSetting Definition >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Values : ĠLinkedHashMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Definitions Ġ= ĠLinkedHashMap < String , ĠSetting Definition >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput All ( definitions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput All ( additional Definitions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Values Ġ= ĠLinkedHashMap < String , ĠString >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput All ( this @ Settings Manager . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput All ( additional Values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Values : ĠMap < String , ĠString > Ġ= Ġresolve Values ( new Definitions , Ġnew Values ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Resolved Ġ= Ġresolve Settings ( new Definitions , Ġnew Values , Ġresolved Values ) ĊĊĠĠĠĠĠĠĠ Ġdefinitions Ġ= Ġnew Definitions ĊĠĠĠĠĠĠĠ Ġvalues Ġ= Ġnew Values ĊĠĠĠĠĠĠĠ Ġresolved Ġ= Ġnew Resolved ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Values ( definitions : ĠMap < String , ĠSetting Definition >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues : ĠMap < String , ĠString >): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun resolved Values Ġ= ĠLinkedHashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġvalues ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġdefinition ) Ġin Ġdefinitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Values [ key ] Ġ= Ġdefinition . defaultValue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġvalue Ġoverrides ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Values [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSettings Resolver . resolve ( un resolved Values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Settings ( definitions : ĠMap < String , ĠSetting Definition >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Values : ĠMap < String , ĠString >): ĠLinkedHashMap < String , ĠSetting > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLinkedHashMap < String , ĠSetting >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġresolved Value ) Ġin Ġresolved Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefinition Ġ= Ġdefinitions [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠSetting Definition . undefined ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalues [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefinition . defaultValue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ key ] Ġ= ĠSetting ( definition , Ġvalue , Ġresolved Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ