package Ġdata maint ain . cli Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . core . find Object Ċ import Ġcom . github . aj alt . cli kt . core . require Object Ċ import Ġcom . github . aj alt . cli kt . core . sub commands Ċ import Ġcom . github . aj alt . cli kt . parameters . options .* Ċ import Ġcom . github . aj alt . cli kt . parameters . types . choice Ċ import Ġdata maint ain . core . Data maint ain Ċ import Ġdata maint ain . core . config . Core Config Key Ċ import Ġdata maint ain . core . config . Data maint ain Config Ċ import Ġdata maint ain . core . db . driver . Data maint ain Driver Config Ċ import Ġdata maint ain . core . db . driver . Driver Config Key Ċ import Ġdata maint ain . core . exception . Data maint ain Base Exception Ċ import Ġdata maint ain . core . exception . Data maint ain Exception Ċ import Ġdata maint ain . core . script . Script Action Ċ import Ġdata maint ain . core . step . check . all Check Rule Names Ċ import Ġdata maint ain . core . step . executor . Execution Mode Ċ import Ġdata maint ain . db . driver . jdbc . Jdbc Driver Config Ċ import Ġdata maint ain . db . driver . mongo . Mongo Config Key Ċ import Ġdata maint ain . db . driver . mongo . Mongo Driver Config Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . system . exit Process Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠApp Ġ: ĠCli kt Command () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconfig FilePath : ĠFile ? Ġby Ġoption ( help Ġ= Ġ" path Ġto Ġconfig Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert Ġ{ ĠFile ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ Ġit . exists () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Type : ĠString Ġby Ġoption ( help Ġ= Ġ" db Ġtype Ġ: Ġ${ DbType . values (). join ToString (",") Ġ{ Ġv Ġ-> Ġv . value Ġ}} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default (" mongo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ ĠDb Type . values (). map Ġ{ Ġv Ġ-> Ġv . value Ġ}. contains ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Uri : ĠString ? Ġby Ġoption ( help Ġ= Ġ" mongo Ġuri Ġwith Ġat Ġleast Ġdatabase Ġname . ĠEx : Ġmongodb :// localhost : 2 7 0 1 7 / new Name ") ĊĊĠĠĠ Ġprivate Ġval Ġtrust Uri : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" De activate Ġall Ġcontrols Ġon Ġthe ĠURI Ġyou Ġprovide ĠData maint ain "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġmongo Tmp Path : ĠString ? Ġby Ġoption ( help Ġ= Ġ" mongo Ġtmp Ġfile Ġpath ") ĊĊĠĠĠ Ġprivate Ġval Ġprops Ġby Ġfind Object () Ġ{ ĠProperties () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig FilePath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . load ( it . inputStream ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverload Props From Args ( props ) ĊĠĠĠĠĠĠĠ Ġprops . put (" db Type ", Ġdb Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverload Props From Args ( props : ĠProperties ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Uri ?. let Ġ{ Ġprops . put ( Driver Config Key . DB _ URI . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġmongo Tmp Path ?. let Ġ{ Ġprops . put ( Mongo Config Key . DB _ MONGO _ TMP _ PATH . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġtrust Uri ?. let Ġ{ Ġprops . put ( Driver Config Key . DB _ TR UST _ URI . key , Ġit . toString ()) Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun Ġdefault Update Db Runner ( config : ĠData maint ain Config ) Ġ{ ĊĠĠĠ ĠData maint ain ( config ). update Database (). print ( config . verbose ) Ċ } Ċ Ċ class ĠUpdate Db ( val Ġrunner : Ġ( Data maint ain Config ) Ġ-> ĠUnit Ġ= Ġ:: default Update Db Runner ) Ġ: ĠCli kt Command ( name Ġ= Ġ" update - db ") Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpath : ĠString ? Ġby Ġoption ( help Ġ= Ġ" path Ġto Ġdirectory Ġcontaining Ġscripts ") ĊĊĠĠĠ Ġprivate Ġval Ġidentifier Regex : ĠString ? Ġby Ġoption ( help Ġ= Ġ" regex Ġto Ġextract Ġidentifier Ġpart Ġfrom Ġscripts ") ĊĊĠĠĠ Ġprivate Ġval Ġwh itelisted Tags : ĠString ? Ġby Ġoption ( help Ġ= Ġ" tags Ġto Ġwhitelist Ġ( separated Ġby Ġ',' ") ĊĊĠĠĠ Ġprivate Ġval Ġblack listed Tags : ĠString ? Ġby Ġoption ( help Ġ= Ġ" tags Ġto Ġblacklist Ġ( separated Ġby Ġ', ') ") ĊĊĠĠĠ Ġprivate Ġval Ġtags To Play Again : ĠString ? Ġby Ġoption ( help Ġ= Ġ" tags Ġto Ġplay Ġagain Ġat Ġeach Ġdata maint ain Ġexecution Ġ( separated Ġby Ġ', ') ") ĊĊĠĠĠ Ġprivate Ġval Ġcreate Tags From Folder : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" create Ġautomatically Ġtags Ġfrom Ġparent Ġfolders "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġexecution Mode Ġby Ġoption ( help Ġ= Ġ" execution Ġmode "). choice ( Execution Mode . values (). map Ġ{ Ġit . name Ġ}. map Ġ{ Ġit Ġto Ġit Ġ}. toMap ()) ĊĊĠĠĠ Ġprivate Ġval Ġaction Ġby Ġoption ( help Ġ= Ġ" script Ġaction "). choice ( Script Action . values (). map Ġ{ Ġit . name Ġ}. map Ġ{ Ġit Ġto Ġit Ġ}. toMap ()) ĊĊĠĠĠ Ġprivate Ġval Ġallow Auto Override : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" Allow Ġdata maint ain Ġto Ġautomatic aly Ġoverride Ġscripts "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġverbose : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" verbose "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġsave Db Output : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" save Ġyour Ġscript Ġand Ġdb Ġoutput "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġprint Db Output : ĠBoolean ? Ġby Ġoption ( help Ġ= Ġ" print Ġyour Ġscript Ġand Ġdb Ġoutput "). flag () ĊĊĠĠĠ Ġprivate Ġval Ġprops Ġby Ġrequire Object < Properties >() ĊĊĠĠĠ Ġprivate Ġval Ġtags Matchers : ĠList < Pair < String , ĠString >> ? Ġby Ġoption ("-- tag ", Ġhelp Ġ= Ġ" Tag Ġdefined Ġusing Ġglob Ġpath Ġmatch ers . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To Ġdefine Ġmultiple Ġtags , Ġuse Ġoption Ġmultiple Ġtimes . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Syntax Ġexample : ĠMY TAG 1 =[ path Matcher 1 , Ġpath Matcher 2 ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġit . split (" =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( split [ 0 ], Ġsplit [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiple () ĊĊĠĠĠ Ġprivate Ġval Ġcheck Rules : ĠList < String >? Ġby Ġoption ("-- rule ", Ġhelp Ġ= Ġ" check Ġrule Ġto Ġplay . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To Ġdefine Ġmultiple Ġrules , Ġuse Ġoption Ġmultiple Ġtimes .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. choice ( all Check Rule Names . map Ġ{ Ġit Ġto Ġit Ġ}. toMap ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiple () ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠData maint ain Config ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverload Props From Args ( props ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġload Config ( props ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunner ( config ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠData maint ain Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġverbose : ĠBoolean Ġ= Ġconfig ?. verbose Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho (" Error Ġat Ġstep Ġ${ e . step }", Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . report . print ( verbose ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message , Ġerr Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . resolution Message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . resolution Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠData maint ain Base Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message , Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . resolution Message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message , Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message Ġ?: Ġ" unexpected Ġerror ", Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverload Props From Args ( props : ĠProperties ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ Ġprops . put ( Core Config Key . SCAN _ PATH . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġidentifier Regex ?. let Ġ{ Ġprops . put ( Core Config Key . SCAN _ IDENTIFIER _ REGEX . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġwh itelisted Tags ?. let Ġ{ Ġprops . put ( Core Config Key . TAGS _ WHITE LIST ED . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġblack listed Tags ?. let Ġ{ Ġprops . put ( Core Config Key . TAGS _ BLACK LIST ED . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġtags To Play Again ?. let Ġ{ Ġprops . put ( Core Config Key . PR UNE _ TAGS _ TO _ RUN _ AG AIN . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġcreate Tags From Folder ?. let Ġ{ Ġprops . put ( Core Config Key . CREATE _ TAGS _ FROM _ FOLDER . key , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverbose ?. let Ġ{ Ġprops . put ( Core Config Key . VERBOSE . key , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġsave Db Output ?. let Ġ{ Ġprops . put ( Driver Config Key . DB _ SAVE _ OUTPUT . key , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġprint Db Output ?. let Ġ{ Ġprops . put ( Driver Config Key . DB _ PRINT _ OUTPUT . key , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġexecution Mode ?. let Ġ{ Ġprops . put ( Core Config Key . EXEC UTION _ MODE . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġaction ?. let Ġ{ Ġprops . put ( Core Config Key . DEFAULT _ SCRIPT _ ACTION . key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġtags Matchers ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . put ("${ Core Config Key . TAG . key }.${ it . first }", Ġit . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Rules ?. let Ġ{ Ġprops . put ( Core Config Key . CHECK _ R ULES . key , Ġit . join ToString ("," )) Ġ} ĊĠĠĠĠĠĠĠ Ġallow Auto Override ?. let Ġ{ Ġprops . put ( Core Config Key . PR UNE _ OVERRIDE _ UPDATED _ SCRIP TS . key , Ġit . toString ()) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠList Executed Scripts Ġ: ĠCli kt Command ( name Ġ= Ġ" list ") Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprops Ġby Ġrequire Object < Properties >() ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġload Config ( props ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData maint ain ( config ). list Executed Scripts (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"${ it . name } Ġ(${ it . checksum })" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠData maint ain Base Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message , Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . resolution Message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġecho ( e . message Ġ?: Ġ" unexpected Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġload Config ( props : ĠProperties ): ĠData maint ain Config Ġ{ ĊĠĠĠ Ġval Ġdriver Config Ġ= Ġload Driver Config ( props ) ĊĠĠĠ Ġreturn ĠData maint ain Config . build Config ( driver Config , Ġprops ) Ċ } Ċ Ċ private Ġfun Ġload Driver Config ( props : ĠProperties ): ĠData maint ain Driver Config Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( props . getProperty (" db Type ")) Ġ{ ĊĠĠĠĠĠĠĠ ĠDb Type . MONGO . value Ġ-> ĠMongo Driver Config . build Config ( props ) ĊĠĠĠĠĠĠĠ ĠDb Type . JDBC . value Ġ-> ĠJdbc Driver Config . build Config ( props ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDb Type NotFoundException ( props . getProperty (" db Type ")) ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠDb Type ( val Ġvalue : ĠString ) Ġ{ ĊĠĠĠ ĠM ONGO (" mongo "), ĊĠĠĠ ĠJDBC (" jdbc "); Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ ĠApp (). sub commands ( Update Db (), ĠList Executed Scripts ()). main ( args ) Ċ } Ċ Ċ class ĠDb Type NotFoundException ( val Ġdb Type : ĠString ) Ġ: ĠData maint ain Base Exception (" db Type Ġ$ db Type Ġis Ġunknown ") Ċ