/** Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠGold man ĠS ach s . Ċ Ġ* Ġ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 . gs . o be vo . impl Ċ Ċ import Ġcom . gs . o be vo . api . app data . Change Ċ import Ġcom . gs . o be vo . api . app data . Change Incremental Ċ import Ġcom . gs . o be vo . api . app data . Change Key Ċ import Ġcom . gs . o be vo . api . app data . Change R er un nable Ċ import Ġcom . gs . o be vo . api . app data . Deploy Execution Ċ import Ġcom . gs . o be vo . api . app data . Deploy Execution Impl Ċ import Ġcom . gs . o be vo . api . app data . Deploy Execution Status Ċ import Ġcom . gs . o be vo . api . app data . Environment Ċ import Ġcom . gs . o be vo . api . factory . Platform Configuration Ċ import Ġcom . gs . o be vo . api . platform . Change Audit Dao Ċ import Ġcom . gs . o be vo . api . platform . Change Command Ċ import Ġcom . gs . o be vo . api . platform . Command ExecutionContext Ċ import Ġcom . gs . o be vo . api . platform . Deploy Execution Dao Ċ import Ġcom . gs . o be vo . api . platform . Deploy ExecutionException Ċ import Ġcom . gs . o be vo . api . platform . Deploy Metrics Ċ import Ġcom . gs . o be vo . api . platform . Failed Change Ċ import Ġcom . gs . o be vo . api . platform . Graph Export Format Ċ import Ġcom . gs . o be vo . api . platform . Main Deploy er Args Ċ import Ġcom . gs . o be vo . api . platform . Platform Ċ import Ġcom . gs . o be vo . impl . graph . Graph En r icher Ċ import Ġcom . gs . o be vo . impl . graph . Graph Util Ċ import Ġcom . gs . o be vo . impl . text . Text Dependency Extract able Impl Ċ import Ġcom . gs . o be vo . impl . text . Text Dependency Extractor Ċ import Ġcom . gs . o be vo . util . input reader . Console Input Reader Ċ import Ġcom . gs . o be vo . util . input reader . Credential Ċ import Ġorg . apache . commons . lang 3 . exception . Exception Utils Ċ import Ġorg . apache . commons . lang 3 . time . Stop Watch Ċ import Ġorg . eclipse . collections . api . Rich Iterable Ċ import Ġorg . eclipse . collections . api . block . function . Function Ċ import Ġorg . eclipse . collections . api . collection . Immutable Collection Ċ import Ġorg . eclipse . collections . api . list . ImmutableList Ċ import Ġorg . eclipse . collections . impl . block . factory . Pred icates Ċ import Ġorg . eclipse . collections . impl . block . factory . String Functions Ċ import Ġorg . eclipse . collections . impl . factory . Lists Ċ import Ġorg . eclipse . collections . impl . factory . Sets Ċ import Ġorg . j gr ap ht . Direct ed Graph Ċ import Ġorg . j gr ap ht . ext . DOT Exporter Ċ import Ġorg . j gr ap ht . ext . G ml Exporter Ċ import Ġorg . j gr ap ht . ext . Graph ML Exporter Ċ import Ġorg . j gr ap ht . ext . Integer Edge Name Provider Ċ import Ġorg . j gr ap ht . ext . Integer Name Provider Ċ import Ġorg . j gr ap ht . ext . Matrix Exporter Ċ import Ġorg . j gr ap ht . ext . Vertex Name Provider Ċ import Ġorg . j gr ap ht . graph . Default Edge Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . FileWriter Ċ import Ġjava . io . Writer Ċ import Ġjava . sql . Timestamp Ċ import Ġjava . util . Date Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġorche str ates Ġthe Ġdb Ġdeployment Ġlogic Ġfor Ġthe Ġgiven Ġplatform Ġand Ġenvironment . Ċ Ġ*/ Ċ class ĠMain Deploy er < P Ġ: ĠPlatform , ĠE Ġ: ĠEnvironment < P >>( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġartifact Deploy er Dao : ĠChange Audit Dao , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmain Input Reader : ĠMain Input Reader < E >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchange Type Behavior Registry : ĠChange Type Behavior Registry , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchangeset Creator : ĠChange set Creator , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpost Deploy Action : ĠPost Deploy Action < E >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdeploy Metrics Collector : ĠDeploy Metrics Collector , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdeploy Execution Dao : ĠDeploy Execution Dao , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcredential : ĠCredential , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Dependency Extractor : ĠText Dependency Extractor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdeploy er Plugin : ĠDeploy er Plugin < E >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgraph En r icher : ĠGraph En r icher ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġuser Input Reader Ġ= ĠConsole Input Reader () ĊĊĠĠĠ Ġfun Ġexecute ( env : ĠE , Ġsource Reader Strategy : ĠSource Reader Strategy , Ġdeploy er Args : ĠMain Deploy er Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchange Stop Watch Ġ= ĠStop Watch () ĊĠĠĠĠĠĠĠ Ġchange Stop Watch . start () ĊĊĠĠĠĠĠĠĠ Ġvar Ġmain Deployment Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Internal ( env , Ġsource Reader Strategy , Ġdeploy er Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Deployment Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Stop Watch . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeploy Runtime Seconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( change Stop Watch . time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" runtime Seconds ", Ġdeploy Runtime Seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" success ", Ġmain Deployment Success ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Internal ( env : ĠE , Ġsource Reader Strategy : ĠSource Reader Strategy , Ġdeploy er Args : ĠMain Deploy er Args ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info (" Running Ġ{} Ġversion Ġ{}", ĠPlatform Configuration . getInstance (). tool Name , ĠPlatform Configuration . getInstance (). tool Version ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( env . schemas . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Environment Ġneeds Ġschemas Ġpopulated ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( deploy er Args . product Version Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrollback Detector Ġ= ĠDefault Rollback Detector () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrollback Detected From Audit Ġ= Ġenv . is Rollback Detection Enabled Ġ&& Ġrollback Detector . determine Rollback ( deploy er Args . product Version , Ġenv . schema Names , Ġdeploy Execution Dao ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rollback Detected From Audit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Detected Ġa Ġrollback Ġbased Ġon Ġthe Ġaudit Ġdata ; Ġwill Ġproceed Ġin Ġrollback Ġmode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġonly Ġcall Ġthe Ġsetter Ġif Ġwe Ġcalculate Ġrollback == true Ġso Ġthat Ġwe Ġdon 't Ġoverride Ġan Ġintention al ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrollback Ġparameter Ġfrom Ġthe Ġclient Ġ( i . e . Ġin Ġcase Ġthe Ġaudit Ġdoes Ġnot Ġwant Ġa Ġrollback ). ĠThough Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġnever Ġbe Ġthe Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . is Rollback Ġ= Ġrollback Detected From Audit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( deploy er Args . is Rollback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" You Ġhave Ġrequested Ġa Ġrollback Ġin Ġyour Ġarguments , Ġthough Ġyour Ġversion Ġmetadata Ġdoes Ġnot Ġrequire Ġit .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric ( Deploy Metrics . WARNING S _ PREFIX Ġ+ Ġ". rollback Inv oked Des p ite Audit Data ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdeploy er Plugin . validate Setup () ĊĠĠĠĠĠĠĠ Ġif Ġ( deploy er Args . is Rollback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" *** ĠEXEC UT ING ĠIN ĠR OL L BACK ĠMODE Ġ*** ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog Argument Metrics ( deploy er Args ) ĊĠĠĠĠĠĠĠ Ġlog Environment ( env ) ĊĠĠĠĠĠĠĠ Ġlog Environment Metrics ( env ) ĊĠĠĠĠĠĠĠ Ġdeploy er Plugin . log Environment Metrics ( env ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Inputs Ġ= Ġmain Input Reader . read Internal ( source Reader Strategy , Ġdeploy er Args ) ĊĊĠĠĠĠĠĠĠ Ġval Ġon boarding Strategy Ġ= Ġget On boarding Strategy ( deploy er Args ) ĊĠĠĠĠĠĠĠ Ġon boarding Strategy . validate Source Dirs ( env . source Dirs , Ġenv . schema Names ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdeploy Strategy Ġ= Ġget Deploy Mode ( deploy er Args ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdeployed Changes Ġ= Ġread Deploy ed Changes ( deploy er Args ) ĊĠĠĠĠĠĠĠ Ġmain Input Reader . log Changes (" deployed ", Ġdeployed Changes ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġensure Ġthat Ġwe 've Ġhandled Ġthe Ġsplit Ġbetween Ġstatic Ġdata Ġand Ġothers Ġproperly ĊĠĠĠĠĠĠĠ Ġval Ġchange Input Set Map Ġ= Ġthis . text Dependency Extractor . calculate Dependencies ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Inputs . filter Ġ{ Ġit . change Key . change Type . is En rich able For Dependencies In Text Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġsource Changes Ġ= Ġchange Inputs . collect Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange : ĠChange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . is R er un nable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠChange R er un nable ( input . change Key , Ġinput . content Hash , Ġinput . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠChange Incremental ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . change Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . order Within Object , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . content Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . rollback If Already Deploy ed Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . isActive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . is Drop Ġ= Ġinput . is Drop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . base lined Changes Ġ= Ġinput . base lined Changes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . parallel Group Ġ= Ġinput . parallel Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . is Keep Incremental Order Ġ= Ġinput . is Keep Incremental Order ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . metadata Section Ġ= Ġinput . metadata Section ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġshould Ġnot Ġneed Ġseparate Ġconverted * Content Ġfields Ġin ĠChange . ĠShould Ġonly Ġbe Ġin ĠChange Input Ġ- Ġsee ĠG ITHUB # 1 9 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . converted Content Ġ= Ġinput . converted Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . rollback Content Ġ= Ġinput . rollback Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . converted Rollback Content Ġ= Ġinput . converted Rollback Content ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . change Input Ġ= Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . order Within Object Ġ= Ġinput . order Within Object ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . order Ġ= Ġinput . order ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . apply Gr ants Ġ= Ġinput . apply Gr ants ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . change set Ġ= Ġinput . change set ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . code Dependencies Ġ= ĠSets . immutable . with All ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Input Set Map . get ( input ) Ġ Ġ// Ġoption Ġ 1 Ġ- Ġuse Ġthe Ġinputs Ġextracted Ġfrom Ġthe Ġnext Ġif Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġinput . code Dependencies Ġ Ġ// Ġoption Ġ 2 Ġ- Ġuse Ġthe Ġpre - pop ulated Ġcode Dependencies Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty Set () Ġ Ġ// Ġfallback Ġ- Ġdefault Ġto Ġempty Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . drop Content Ġ= Ġinput . drop Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange . permission Scheme Ġ= Ġinput . permission Scheme ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ collect Ġchange ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġrollback Ġscripts Ġhere ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Pairs Ġ= ĠChange set Creator . get Change Pairs ( deployed Changes , Ġsource Changes ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( deploy er Args . is Rollback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġback Ġrollback Ġchanges Ġto Ġthe Ġsource List Ġso Ġthat Ġthey Ġcan Ġtake Ġpart Ġin Ġthe Ġchange Ġcalculation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrollback sTo Add Back Ġ= Ġchange Pairs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . change Key . change Type . is R er un nable Ġ&& Ġit . source Change Ġ== Ġnull Ġ&& Ġit . deployed Change Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . deployed Change Ġas ĠChange Incremental Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrollback sTo Add Back . forEach Ġ{ Ġit . is Rollback Activated Ġ= Ġtrue Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Changes Ġ= Ġsource Changes . new With All ( rollback sTo Add Back ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġrefactor Ġinto Ġseparate Ġmethod ĊĠĠĠĠĠĠĠ Ġif Ġ( env . platform . is Drop Order Required ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġblock , Ġwe Ġset Ġthe Ġ" dependent Changes " Ġfield Ġon Ġthe Ġdrop Ġobjects Ġto Ġensure Ġthey Ġcan Ġbe Ġsorted Ġfor Ġdependencies Ġlater Ġon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrops To En rich Ġ= Ġchange Pairs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . change Key . change Type . is R er un nable Ġ&& Ġit . source Change Ġ== Ġnull Ġ&& Ġit . deployed Change Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . deployed Change !! Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrops By ObjectName Ġ= Ġdrops To En rich . associate By Ġ{ Ġenv . platform . convert Db ObjectName (). valueOf ( it . objectName ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrops For Text Processing Ġ= Ġdrops To En rich . map Ġ{ Ġdrop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġchange Type Behavior Registry . get Change Type Behavior ( drop . change Type ). get Definition From Environment ( drop ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Found Ġthe Ġsql Ġfrom Ġthe ĠDB Ġfor Ġdropping : Ġ{}", Ġsql ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Dependency Extract able Impl ( drop . objectName , Ġsql Ġ?: Ġ"", Ġdrop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrop Dependencies Ġ= Ġthis . text Dependency Extractor . calculate Dependencies ( dro ps For Text Processing ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrops For Text Processing . forEach Ġ{ Ġit . code Dependencies Ġ= ĠSets . immutable . of All ( drop Dependencies . get ( it )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( drop Ġin Ġdrops For Text Processing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop . code Dependencies ?. let Ġ{ Ġdeps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deps . not Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop . payload . dependent Changes Ġ= ĠSets . immutable . of All ( deps . map Ġ{ Ġdrops By ObjectName [ it . target ] Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdependency Graph Ġ= Ġgraph En r icher . create Dependency Graph ( source Changes , Ġdeploy er Args . is Rollback ) ĊĊĠĠĠĠĠĠĠ Ġdeploy er Args . source Graph Export File ?. let Ġ{ Ġsource Graph OutputFile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexporter Format Ġ= Ġdeploy er Args . source Graph Export Format Ġ?: ĠGraph Export Format . DOT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexporter Func Ġ= Ġget Exporter Func ( exporter Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( source Graph OutputFile ). use Ġ{ Ġexporter Func ( it , Ġdependency Graph ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsource Changes . each Ġ{ Ġit . dependent Changes Ġ= ĠGraph Util . get Dependency Nodes ( dependency Graph , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġartifact sTo Process Ġ= Ġchangeset Creator . determine Change set ( change Pairs , Ġsource Changes , Ġdeploy Strategy . is Init Allowed On Hash Exceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Deferred Predicate ( deploy er Args . change set Predicate ) ĊĊĠĠĠĠĠĠĠ Ġvalidate Prior To Deployment ( env , Ġdeploy Strategy , Ġsource Changes , Ġdeployed Changes , Ġartifact sTo Process ) ĊĠĠĠĠĠĠĠ Ġdeploy er Plugin . validate Prior To Deployment ( env , Ġdeploy Strategy , Ġsource Changes , Ġdeployed Changes , Ġartifact sTo Process ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . should Pro ceed With Db Change ( artifact sTo Process , Ġdeploy er Args )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( schema Ġin Ġenv . physical Schemas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Plugin . initialize Schema ( env , Ġschema ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġ- Ġonly Ġinit Ġthe Ġaudit Ġtable Ġif Ġwe Ġactually Ġproceed Ġw / Ġa Ġdeploy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . deploy Execution Dao . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . artifact Deploy er Dao . init () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecution sBy Schema Ġ= Ġenv . schemas . associate By ({ it . name }, Ġ{ Ġschema Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeploy Execution Ġ= ĠDeploy Execution Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . deploy Request er Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform Configuration . getInstance (). tool Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp ( Date (). time ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . is Perform Init Only , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . is Rollback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . product Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . reason , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Args . deploy Execution Attributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution . status Ġ= ĠDeploy Execution Status . IN _ PROGRESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution Dao . persist New ( deploy Execution , Ġenv . get Physical Schema ( schema . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġare Ġno Ġdeployments Ġrequired , Ġthen Ġjust Ġupdate Ġthe Ġartifact Ġtables Ġand Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! artifact sTo Process . is Deployment Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" No Ġchanges Ġdetected Ġin Ġthe Ġdatabase Ġdeployment . ĠUpdating ĠDeploy ĠStatus ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution sBy Schema . values . forEach Ġ{ Ġdeploy Execution Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution . status Ġ= ĠDeploy Execution Status . SUCCEEDED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . deploy Execution Dao . update ( deploy Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġif Ġ( deploy er Args . is Rollback ) Ġ" Rollback " Ġelse Ġ" Deployment " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmain Deployment Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ec Ġ= ĠCommand ExecutionContext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . do Execute ( artifact sTo Process , Ġdeploy Strategy , Ġon boarding Strategy , Ġexecution sBy Schema , Ġc ec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("$ action Ġhas ĠCompleted ĠSuccessfully !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution sBy Schema . values . forEach Ġ{ Ġdeploy Execution Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution . status Ġ= ĠDeploy Execution Status . SUCCEEDED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . deploy Execution Dao . update ( deploy Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Deployment Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("$ action Ġhas ĠFailed . ĠWe Ġwill Ġerror Ġout , Ġbut Ġfirst Ġcomplete Ġthe Ġpost - deploy Ġstep ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution sBy Schema . values . forEach Ġ{ Ġdeploy Execution Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Execution . status Ġ= ĠDeploy Execution Status . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . deploy Execution Dao . update ( deploy Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Executing Ġthe Ġpost - deploy Ġstep ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy er Plugin . do Post Deploy Action ( env , Ġsource Changes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . post Deploy Action . value ( env ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Deployment Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Exception Ġfound Ġin Ġthe Ġpost - deploy Ġstep ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" Exception Ġfound Ġin Ġthe Ġpost - deploy Ġstep ; Ġprinting Ġit Ġout Ġhere , Ġbut Ġthere Ġwas Ġan Ġexception Ġduring Ġthe Ġregular Ġdeploy Ġas Ġwell ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Post - deploy Ġstep Ġcompleted ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwarnings Ġ= Ġc ec . warnings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( warnings . not Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Summary Ġof Ġwarnings Ġfrom Ġthis Ġdeployment ; Ġplease Ġaddress :\ n {}", Ġwarnings . collect ( String Functions . prepend (" ĠĠĠ Ġ" )). make String ("\ n ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Deploy Ġcomplete !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Exporter Func ( exporter Format : ĠEnum < Graph Export Format >): Ġ( Writer , ĠDirect ed Graph < Change , ĠDefault Edge >) Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertex Name Provider Ġ: ĠVertex Name Provider < Change > Ġ= ĠVertex Name Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ: ĠChange Ġ-> Ġchange . objectName Ġ+ Ġ"." Ġ+ Ġchange . change Name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( exporter Format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Export Format . DOT Ġ-> Ġreturn Ġ{ Ġwriter : ĠWriter , Ġgraph : ĠDirect ed Graph < Change , ĠDefault Edge > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOT Exporter < Change , ĠDefault Edge >( Integer Name Provider < Change >(), Ġvertex Name Provider , Ġnull ). export ( writer , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Export Format . G ML Ġ-> Ġreturn Ġ{ Ġwriter : ĠWriter , Ġgraph : ĠDirect ed Graph < Change , ĠDefault Edge > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ml Exporter < Change , ĠDefault Edge >( Integer Name Provider < Change >(), Ġvertex Name Provider , ĠInteger Edge Name Provider < Default Edge >(), Ġnull ). export ( writer , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Export Format . GRAPH ML Ġ-> Ġreturn Ġ{ Ġwriter : ĠWriter , Ġgraph : ĠDirect ed Graph < Change , ĠDefault Edge > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraph ML Exporter < Change , ĠDefault Edge >( Integer Name Provider < Change >(), Ġvertex Name Provider , ĠInteger Edge Name Provider < Default Edge >(), Ġnull ). export ( writer , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Export Format . MATRIX Ġ-> Ġreturn Ġ{ Ġwriter : ĠWriter , Ġgraph : ĠDirect ed Graph < Change , ĠDefault Edge > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix Exporter < Change , ĠDefault Edge >(). export Ad jacency Matrix ( writer , Ġgraph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Export ĠFormat Ġ$ exporter Format Ġis Ġnot Ġsupported Ġhere ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Argument Metrics ( deploy er Args : ĠMain Deploy er Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" args . on boarding Mode ", Ġdeploy er Args . is On boarding Mode ) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" args . init ", Ġdeploy er Args . is Perform Init Only ) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" args . rollback ", Ġdeploy er Args . is Rollback ) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" args . preview ", Ġdeploy er Args . is Preview ) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" args . use Baseline ", Ġdeploy er Args . is Use Baseline ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Environment ( env : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LOG . is Info Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Environment Ġinformation :") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Logical Ġschemas Ġ[ {} ]: Ġ{}", Ġenv . schema Names . size (), Ġenv . schema Names . make String ("," )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Physical Ġschemas Ġ[ {} ]: Ġ{}", Ġenv . physical Schemas . size (), Ġenv . physical Schemas . collect Ġ{ Ġ( physical Name ) Ġ-> Ġphysical Name Ġ}. make String ("," )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Environment Metrics ( env : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" platform ", Ġenv . platform . name ) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" schema Count ", Ġenv . schema Names . size ()) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" schemas ", Ġenv . schema Names . make String ("," )) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" physical Schema Count ", Ġenv . physical Schemas . size ()) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" physical Schemas ", Ġenv . physical Schemas . collect Ġ{ Ġ( physical Name ) Ġ-> Ġphysical Name Ġ}. make String ("," )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Prior To Deployment ( env : ĠE , Ġdeploy Strategy : ĠDeploy Strategy , Ġsource Changes : ĠImmutableList < Change >, Ġdeployed Changes : ĠImmutable Collection < Change >, Ġartifact sTo Process : ĠChange set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Artifact sTo Process ForUser ( artifact sTo Process , Ġdeploy Strategy ) ĊĠĠĠĠĠĠĠ Ġdeploy er Plugin . print Artifact sTo Process ForUser 2 ( artifact sTo Process , Ġdeploy Strategy , Ġenv , Ġdeployed Changes , Ġsource Changes ) ĊĊĠĠĠĠĠĠĠ Ġlog Change set ( artifact sTo Process ) ĊĠĠĠĠĠĠĠ Ġartifact sTo Process . validate For Deployment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Deploy ed Changes ( args : ĠMain Deploy er Args ): ĠImmutable Collection < Change > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġartifact Deploy er Dao . deployed Changes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. select ( Pred icates . attribute Predicate ( Function Ġ{ Ġit Ġ-> Ġit . change Key Ġ}, Ġargs . change In clusion Predicate )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Deploy Mode ( deploy er Args : ĠMain Deploy er Args ): ĠDeploy Strategy Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( deploy er Args . is Perform Init Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠForce Init Deploy Strategy . INSTANCE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecute Deploy Strategy . INSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget On boarding Strategy ( deploy er Args : ĠMain Deploy er Args ): ĠOn boarding Strategy Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( deploy er Args . is On boarding Mode ) ĠEnabled On boarding Strategy () Ġelse ĠDisabled On boarding Strategy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Execute ( artifact sTo Process : ĠChange set , Ġdeploy Strategy : ĠDeploy Strategy , Ġon boarding Strategy : ĠOn boarding Strategy , Ġexecution sBy Schema : ĠMap < String , ĠDeploy Execution >, Ġc ec : ĠCommand ExecutionContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfailed Changes Ġ= ĠLists . mutable . empty < Failed Change >() ĊĠĠĠĠĠĠĠ Ġval Ġfailed Object Names Ġ= ĠSets . mutable . empty < String >() Ġ Ġ// Ġto Ġhandle Ġuse Ġcase Ġof Ġtable Ġfailing Ġand Ġprevent Ġsubsequent ĠCSV Ġfrom Ġgetting Ġdeployed ĊĠĠĠĠĠĠĠ Ġval Ġfailed Change Keys Ġ= ĠSets . mutable . empty < Change Key >() Ġ Ġ// Ġto Ġhandle Ġall Ġother Ġcases ; Ġshould Ġmove Ġthe ĠCSV Ġcase Ġinto Ġthis Ġone ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( audit Change Command Ġin Ġartifact sTo Process . audit Changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudit Change Command . mark Audit Table ( change Type Behavior Registry , Ġthis . artifact Deploy er Dao , Ġexecution sBy Schema . get ( audit Change Command . schema )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( change Command Ġin Ġartifact sTo Process . inser ts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Failed Objects Ġ= Ġfailed Object Names . intersect ( change Command . changes . toSet (). collect Ġ{ Ġchange 2 Ġ-> Ġchange 2 . db Object Key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Failed Objects . not Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġskip Ġsubsequent Ġchanges Ġin Ġobjects Ġthat Ġfailed Ġas Ġwe Ġdon 't Ġany Ġunexpected Ġactivities Ġto Ġhappen Ġon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġparticular ĠDB Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( e . g . Ġif Ġone Ġchange Ġre lied Ġon Ġa Ġprevious Ġone , Ġand Ġthe Ġprevious Ġone Ġfailed ; Ġwhat Ġif Ġsomething Ġgoes Ġbad ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġfirst Ġone Ġisn 't Ġexecuted ?) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Skipping Ġartifact Ġ[ {}] Ġas Ġthese Ġobjects Ġpreviously Ġfailed Ġdeploying : Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Command . command Description , Ġprevious Failed Objects . make String (", Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Change Keys Ġ= Ġchange Command . changes . flatMap Ġ{ Ġit . dependent Changes Ġ?: ĠSets . mutable . empty () Ġ}. map Ġ{ Ġit . change Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailed Command Keys Ġ= Ġdependency Change Keys . intersect ( failed Change Keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( failed Command Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġskip Ġsubsequent Ġchanges Ġin Ġobjects Ġthat Ġfailed Ġas Ġwe Ġdon 't Ġany Ġunexpected Ġactivities Ġto Ġhappen Ġon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġparticular ĠDB Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( e . g . Ġif Ġone Ġchange Ġre lied Ġon Ġa Ġprevious Ġone , Ġand Ġthe Ġprevious Ġone Ġfailed ; Ġwhat Ġif Ġsomething Ġgoes Ġbad ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġfirst Ġone Ġisn 't Ġexecuted ?) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Skipping Ġartifact Ġ[ {}] Ġas Ġthese Ġchanges Ġpreviously Ġfailed Ġdeploying : Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Command . command Description , Ġfailed Command Keys . join ToString (", Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" At tempting Ġto Ġdeploy : Ġ" Ġ+ Ġchange Command . command Description ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Stop Watch Ġ= ĠStop Watch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Stop Watch . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Strategy . deploy ( change Type Behavior Registry , Ġchange Command , Ġc ec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Command . mark Audit Table ( change Type Behavior Registry , Ġthis . artifact Deploy er Dao , Ġexecution sBy Schema . get ( change Command . schema )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Stop Watch . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime Seconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( change Stop Watch . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Successfully Ġ" Ġ+ Ġdeploy Strategy . deploy Verb Message Ġ+ Ġ" Ġartifact Ġ" Ġ+ Ġchange Command . command Description Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġtook Ġ" Ġ+ Ġruntime Seconds Ġ+ Ġ" Ġseconds ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( change Ġin Ġchange Command . changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchange Input Ġmay Ġbe Ġnull Ġdue Ġto Ġman ufact ured Ġchanges Ġe . g . Ġobject Ġdrops ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . change Input ?. let Ġ{ Ġon boarding Strategy . handle Success ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Stop Watch . stop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime Seconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( change Stop Watch . time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( change Ġin Ġchange Command . changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . change Input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon boarding Strategy . handle Exception ( change . change Input , Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Failed Ġto Ġdeploy Ġartifact Ġ" Ġ+ Ġchange Command . command Description Ġ+ Ġ", Ġtook Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġruntime Seconds Ġ+ Ġ" Ġseconds ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" We Ġwill Ġcontinue Ġand Ġfail Ġthe Ġprocess Ġat Ġthe Ġend . ĠThis Ġwas Ġthe Ġexception : Ġ" Ġ+ ĠException Utils . get StackTrace ( exc )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Changes . add ( Failed Change ( change Command , Ġexc )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Object Names . with All ( change Command . changes . collect Ġ{ Ġit . db Object Key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Change Keys . with All ( change Command . changes . collect Ġ{ Ġit . change Key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! failed Changes . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" exception Count ", Ġfailed Changes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Messages Ġ= Ġfailed Changes . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . change Command . command Description Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" ĠĠĠ ĠRoot ĠException ĠMessage : Ġ" Ġ+ ĠException Utils . getRoot Cause Message ( it . exception )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Message Ġ= Ġ" Failed Ġdeploying Ġthe Ġfollowing Ġartifacts .\ n " Ġ+ Ġchange Messages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. make String ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( exception Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( failed Change Ġin Ġfailed Changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" This Ġchange Ġfailed : Ġ" Ġ+ Ġfailed Change . change Command . command Description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" From Ġexception : Ġ" Ġ+ ĠException Utils . get StackTrace ( failed Change . exception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDeploy ExecutionException ( exception Message , Ġfailed Changes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Pro ceed With Db Change ( artifact sTo Process : ĠChange set , Ġargs : ĠMain Deploy er Args ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( args . is Preview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" We Ġare Ġin ĠPRE VIEW Ġmode , Ġso Ġwe Ġwill Ġnot Ġproceed Ġfurther . ĠExit ing .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( args . is No Prompt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("- no Prompt Ġparameter Ġwas Ġpassed ; Ġhence , Ġwe Ġcan Ġproceed Ġw / out Ġuser Ġpromp ting ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! artifact sTo Process . is Deployment Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" No Ġartifacts Ġto Ġdeploy , Ġhence Ġwe Ġcan Ġproceed Ġwithout Ġuser Ġpromp ting .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Will Ġonly Ġupdate Ġthe ĠArtifact ĠExecution Ġtables Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Deploy ing Ġto Ġa Ġlive Ġenvironment ; Ġhence , Ġwe Ġneed Ġto Ġprompt Ġuser Ġconfirmation ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġproceed ? Ġ( Y / N )") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġthis . user Input Reader . readLine ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . trim (). equals (" Y ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLOG . info (" Did Ġnot Ġpass Ġcommand Ġline Ġvalidation Ġinput . ĠWill Ġnot Ġproceed Ġw / Ġactual Ġdeployment ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Artifact sTo Process ForUser ( artifact sTo Process : ĠChange set , Ġdeploy Strategy : ĠDeploy Strategy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Commands ( artifact sTo Process . inser ts , Ġ" DB ĠChanges Ġare Ġto Ġbe Ġ" Ġ+ Ġdeploy Strategy . deploy Verb Message ) ĊĠĠĠĠĠĠĠ Ġprint Commands ( artifact sTo Process . audit Changes , Ġ" audit Table - only Ġchanges Ġare Ġto Ġbe Ġdeployed ") ĊĠĠĠĠĠĠĠ Ġprint Commands ( artifact sTo Process . change Warnings , Ġ" warnings / errors Ġare Ġfor Ġyour Ġinformation Ġ( no Ġchanges Ġ" Ġ+ Ġ" done )") ĊĠĠĠĠĠĠĠ Ġprint Commands ( artifact sTo Process . deferred Changes , Ġ" DB ĠChanges Ġare Ġdeferred Ġfrom Ġdeploying Ġhere Ġas Ġthey Ġhave Ġthe Ġchangeset Ġattribute Ġset Ġand Ġthe Ġrelevant Ġchangeset Ġargument Ġwas Ġnot Ġprovided Ġat Ġinput ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Change set ( change set : ĠChange set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" change set . execute Count ", Ġchangeset . inser ts . size ()) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" change set . audit Count ", Ġchangeset . audit Changes . size ()) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" change set . warning Count ", Ġchangeset . change Warnings . size ()) ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector . add Metric (" change set . deferred Count ", Ġchangeset . deferred Changes . size ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġwarning Bag Ġ= Ġchangeset . change Warnings . collect Ġ{ Ġwarning Ġ-> Ġwarning . java Class . name Ġ}. to Bag () ĊĠĠĠĠĠĠĠ Ġwarning Bag . toMap Of Item To Count (). forEach KeyValue Ġ{ Ġwarning ClassName , Ġcount Ġ-> Ġdeploy Metrics Collector . add Metric (" change set . warning Type Counts .$ warning ClassName ", Ġcount ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Commands ( commands : ĠRich Iterable < out ĠChange Command >, Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( commands . not Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" The Ġfollowing Ġ$ message :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( change Command Ġin Ġcommands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("\ t " Ġ+ Ġchange Command . command Description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Nothing Ġapplicable Ġfor : Ġ[$ message ]") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Main Deploy er :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ