package Ġnet . mi lo sv asic . factory . component . installer . step . database Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Json ParseException Ċ import Ġnet . mi lo sv asic . factory . common . Data Handler Ċ import Ġnet . mi lo sv asic . factory . common . filesystem . FilePath Builder Ċ import Ġnet . mi lo sv asic . factory . common . obtain . Ob tain Ċ import Ġnet . mi lo sv asic . factory . component . database .* Ċ import Ġnet . mi lo sv asic . factory . component . database . manager . Database Manager Ċ import Ġnet . mi lo sv asic . factory . component . installer . step . Remote Operation Installation Step Ċ import Ġnet . mi lo sv asic . factory . execution . flow . implementation . Command Flow Ċ import Ġnet . mi lo sv asic . factory . execution . flow . implementation . Installation Step Flow Ċ import Ġnet . mi lo sv asic . factory . execution . flow . implementation . Ob tain able Flow Ċ import Ġnet . mi lo sv asic . factory . execution . flow . implementation . Registration Flow Ċ import Ġnet . mi lo sv asic . factory . log Ċ import Ġnet . mi lo sv asic . factory . operation . Operation Result Ċ import Ġnet . mi lo sv asic . factory . operation . Operation Result Listener Ċ import Ġnet . mi lo sv asic . factory . remote . Connection Ċ import Ġnet . mi lo sv asic . factory . remote . ssh . SSH Ċ import Ġnet . mi lo sv asic . factory . terminal . command . Cat Command Ċ import Ġnet . mi lo sv asic . factory . terminal . command . Test Command Ċ import Ġjava . nio . file . Invalid Path Exception Ċ Ċ class ĠDatabase Step ( val Ġpath : ĠString ) Ġ: ĠRemote Operation Installation Step < SSH >() Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ CONFIGURATION _ FILE Ġ= Ġ" configuration . json " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class , ĠIllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Flow (): ĠCommand Flow Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconnection ?. let Ġ{ Ġconn Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠDatabase Manager . instantiate () Ġ?: Ġthrow ĠIllegalStateException (" Invalid Ġdatabase Ġmanager ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠDatabase Configuration ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration File Ġ= ĠFilePath Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Context ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Context ( DEFAULT _ CONFIGURATION _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Data Handler Ġ= Ġobject Ġ: ĠData Handler < Operation Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data ( data : ĠOperation Result ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġit . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġgson . fromJson ( json , ĠDatabase Configuration :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i (" Database Ġconfiguration Ġavailable : Ġ$ config ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson ParseException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Registration Provider Ġ= Ġobject Ġ: ĠObtain < Database Registration > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġobtain (): ĠDatabase Registration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Database Registration ( conn , Ġconfig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregistration Flow Ġ= ĠRegistration Flow < Database Registration >(" Database ĠRegistration ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform ( database Registration Provider ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Flow Ġ= ĠObtain able Flow (" Database "). width ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠObtain < Installation Step Flow > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( Invalid Path Exception :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġobtain (): ĠInstallation Step Flow Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Ġ= Ġdatabase Registration Provider . obtain (). database ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstallation Ġ= Ġdb . get Installation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig ?. let Ġ{ Ġconf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conf . sql s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsql Flow Ġ= ĠCommand Flow (" Sql "). width ( conn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconf . sql s . forEach Ġ{ Ġsql Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsql Path Ġ= ĠFilePath Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Context ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Context ( sql ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . v (" SQL : Ġ$ sql Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsql Command Ġ= Ġdb . get Sql Command ( sql Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Flow . perform ( sql Command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstallation . connect ( sql Flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstallation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCommand Flow (" Database ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( conn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform ( Test Command ( configuration File )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform ( Cat Command ( configuration File ), Ġconfiguration Data Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect ( registration Flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect ( database Flow ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġproper Ġconnection Ġprovided ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Operation () Ġ= ĠDatabase Initialization Operation () ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Database Registration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection : ĠConnection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration : ĠDatabase Configuration ? ĊĊĠĠĠ Ġ): ĠDatabase Registration Ġ{ ĊĠĠĠĠĠĠĠ Ġconfiguration ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠType . getType ( it . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Connection Ġ= ĠDatabase Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . host , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getPort (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . user , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . password , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠDatabase Factory ( type , Ġit . name , Ġdb Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= Ġfactory . build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠOperation Result Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Operation Performed ( result : ĠOperation Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDatabase Registration Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e (" Database Ġregistration Ġfailed : Ġ$ database ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDatabase Registration ( database , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Pro per Ġdatabase Ġconfiguration Ġunavailable ") ĊĠĠĠ Ġ} Ċ }