/** Ċ Ġ* Ġ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 . reader Ċ Ċ import Ġcom . gs . o be vo . api . app data .* Ċ import Ġcom . gs . o be vo . api . app data . doc . Text Markup Document Ċ import Ġcom . gs . o be vo . api . app data . doc . Text Markup Document Section Ċ import Ġcom . gs . o be vo . api . platform . Change Type Ċ import Ġcom . gs . o be vo . impl . Deploy Metrics Collector Ċ import Ġcom . gs . o be vo . impl . Deploy Metrics Collector Impl Ċ import Ġcom . gs . o be vo . util . Tokenizer Ċ import Ġcom . gs . o be vo . util . Visible ForTesting Ċ import Ġcom . gs . o be vo . util . hash . Db Change Hash Strategy Ċ import Ġcom . gs . o be vo . util . vfs . FileObject Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . apache . commons . lang 3 . Validate Ċ import Ġorg . eclipse . collections . api . list . ImmutableList Ċ import Ġorg . eclipse . collections . api . map . Immutable Map Ċ import Ġorg . eclipse . collections . api . set . Immutable Set Ċ import Ġorg . eclipse . collections . impl . block . factory . Functions Ċ import Ġorg . eclipse . collections . impl . block . factory . String Pred icates Ċ import Ġorg . eclipse . collections . impl . factory . Lists Ċ import Ġorg . eclipse . collections . impl . factory . Maps Ċ import Ġorg . eclipse . collections . impl . factory . Sets Ċ import Ġorg . eclipse . collections . impl . list . fixed . Array Adapter Ċ import Ġorg . eclipse . collections . impl . list . mutable . Fast List Ċ import Ġorg . eclipse . collections . impl . tuple . Tuples Ċ import Ġorg . eclipse . collections . impl . utility . String Iterate . trimmed Tokens ToList Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ class ĠTable Change Parser ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontent Hash Strategy : ĠDb Change Hash Strategy , ĊĠĠĠĠĠĠĠ Ġbackwards Compatible Mode : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġdeploy Metrics Collector : ĠDeploy Metrics Collector , ĊĠĠĠĠĠĠĠ Ġtext Markup Document Reader : ĠText Markup Document Reader , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġget Change Type : ĠGet Change Type Ċ ) Ġ: ĠAbstract Db Change File Parser ( back wards Compatible Mode , Ġdeploy Metrics Collector , Ġtable Attributes (), Ġtable Toggle s (), Ġtable Dis allowed Sections (), Ġtext Markup Document Reader ) Ġ{ ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġconstructor ( content Hash Strategy : ĠDb Change Hash Strategy , Ġget Change Type : ĠGet Change Type ) Ġ: Ġthis ( content Hash Strategy , Ġfalse , ĠDeploy Metrics Collector Impl (), ĠText Markup Document Reader ( false ), Ġget Change Type ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalue ( table Change Type : ĠChange Type , Ġfile : ĠFile Object ?, Ġfile Content : ĠString , Ġnon Token ized ObjectName : ĠString , Ġschema : ĠString , Ġpackage Metadata : ĠText Markup Document Section ?): ĠImmutableList < Change Input > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . debug (" At tempting Ġto Ġread Ġfile Ġ{}", Ġfile ) ĊĊĠĠĠĠĠĠĠ Ġval Ġorig Doc Ġ= Ġread Document ( file Content , Ġpackage Metadata ). one ĊĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġthis . get OrCreate Metadata Node ( orig Doc ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Param Attr Ġ= Ġmetadata . get Attr ( ATTR _ TEMPLATE _ PARAMS ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġa Ġpotential Ġtemplate Ġobject ; Ġthis Ġwill Ġreturn Ġa Ġdummy Ġparams Ġlist Ġif Ġthis Ġis Ġnot Ġa Ġtemplate Ġobject ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Params List Ġ= ĠconvertTo Param List ( template Param Attr ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfile To Change Pairs Ġ= Ġtemplate Params List . map Ġ{ Ġtemplate Params Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokenizer Ġ= ĠToken izer ( template Params , Ġ"\ ${ ", Ġ" }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Name Ġ= Ġtokenizer . tokenize String ( non Token ized ObjectName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġif Ġ( template Params . not Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Table Change Parser . read Document ( tokenizer . tokenize String ( file Content ), Ġpackage Metadata ). one ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig Doc Ġ Ġ/// Ġif Ġno Ġtemplate Ġparams , Ġthen Ġsave Ġsome Ġeffort Ġand Ġdon 't Ġbother Ġre - reading Ġthe Ġdoc Ġfrom Ġthe Ġstring ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Level Restrictions Ġ= ĠDb Change Restrictions Reader (). valueOf ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġdoc . sections ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠText Markup Document Reader . TAG _ CHANGE Ġ== Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġsection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Ġ= Ġthis @ Table Change Parser . create ( table Change Type , Ġsection , Ġschema , Ġobject Name , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Level Restrictions Ġ= ĠDb Change Restrictions Reader (). valueOf ( section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . set Restrictions ( this @ Table Change Parser . merge Restrictions ( file Level Restrictions , Ġchange Level Restrictions )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . permission Scheme Ġ= Ġthis @ Table Change Parser . get Permission Scheme Value ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . set File Location ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . metadata Section Ġ= Ġmetadata ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Str Ġ= Ġsection . get Attr ( Text Markup Document Reader . ATTR _ DEPEND ENCI ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dependencies Str Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . set Code Dependencies ( Sets . immutable . with (* dependencies Str . split ("," . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()). reject ( String Pred icates . empty ()). collect With ({ Ġtarget , Ġcode Dependency Type Ġ-> ĠCode Dependency ( target , Ġcode Dependency Type ) Ġ}, ĠCode Dependency Type . EX PL IC IT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexclude Dependencies Str Ġ= Ġsection . get Attr ( Text Markup Document Reader . ATTR _ EXCL UDE _ DEPEND ENCI ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exclude Dependencies Str Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . set Exclude Dependencies ( Sets . immutable . with (* exclude Dependencies Str . split ("," . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()). reject ( String Pred icates . empty ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinclude Dependencies Str Ġ= Ġmetadata . get Attr ( Text Markup Document Reader . ATTR _ INCLUDE _ DEPEND ENCI ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Dependencies Str Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . set Include Dependencies ( Sets . immutable . with (* include Dependencies Str . split ("," . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()). reject ( String Pred icates . empty ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠT uples . pair ( objectName , Ġchanges ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġthat Ġif Ġwe Ġhad Ġused Ġtemplates , Ġthat Ġit Ġresulted Ġin Ġdifferent Ġfile Ġnames ĊĠĠĠĠĠĠĠ Ġval Ġde temp lated Object Names Ġ= Ġfile To Change Pairs . map To ( Sets . mutable . empty (), Ġ{ Ġit . one Ġ}) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( de temp lated Object Names . size Ġ!= Ġtemplate Params List . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Expecting Ġthe Ġusage Ġof Ġtemplates Ġto Ġresult Ġin Ġa Ġdifferent Ġfile Ġname Ġper Ġtemplate Ġset ; Ġexpected Ġ" Ġ+ Ġtemplate Params List . size () Ġ+ Ġ" Ġobject Ġnames Ġ( from Ġ" Ġ+ Ġtemplate Param Attr Ġ+ Ġ") Ġbut Ġfound Ġ" Ġ+ Ġde temp lated Object Names ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLists . immutable . of All ( file To Change Pairs . flatMap Ġ{ Ġit . two Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠconvertTo Param List ( template Param Attr : ĠString ?): ĠImmutableList < Immutable Map < String , ĠString >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( template Param Attr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLists . immutable . of ( Maps . immutable . empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparam Groups Ġ= ĠArray Adapter . adapt (* template Param Attr . split ("; ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()). to Immutable () ĊĠĠĠĠĠĠĠ Ġreturn Ġparam Groups . collect Ġ{ Ġparam Group Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Str s Ġ= Ġparam Group . split ("," . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠMaps . mutable . empty < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( param Str Ġin Ġparam Str s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Parts Ġ= Ġparam Str . split (" =". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams [ param Parts [ 0 ]] Ġ= Ġparam Parts [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . to Immutable () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Structure New ( doc : ĠText Markup Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdoc Sections Ġ= Ġdoc . sections ĊĊĠĠĠĠĠĠĠ Ġif Ġ( doc Sections . isEmpty Ġ|| Ġdoc Sections . none Satisf y Ġ{ Ġit Ġ-> ĠText Markup Document Reader . TAG _ CHANGE Ġ== Ġit . name Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġ//// Ġ" Ġ+ ĠText Markup Document Reader . TAG _ CHANGE Ġ+ Ġ" Ġsections Ġfound ; Ġat Ġleast Ġone Ġis Ġrequired ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(!( Text Markup Document Reader . TAG _ CHANGE Ġ== Ġdoc Sections . get ( 0 ). name Ġ|| ĠText Markup Document Reader . TAG _ METADATA Ġ== Ġdoc Sections . get ( 0 ). name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" First Ġcontent Ġof Ġthe Ġfile Ġmust Ġbe Ġthe Ġ//// ĠCHANGE Ġline , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" or Ġa Ġ//// Ġ" Ġ+ ĠText Markup Document Reader . TAG _ METADATA Ġ+ Ġ" Ġline , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" or Ġjust Ġa Ġblank Ġline ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Text Markup Document Reader . TAG _ METADATA Ġ== Ġdoc Sections . get ( 0 ). name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Sections Ġ= Ġdoc Sections . sub List ( 1 , Ġdoc Sections . size ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbad Sections Ġ= Ġdoc Sections . reject Ġ{ Ġit Ġ-> ĠText Markup Document Reader . TAG _ CHANGE Ġ== Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bad Sections . not Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" File Ġstructure Ġfor Ġincremental Ġfile Ġmust Ġbe Ġoptionally Ġa Ġ//// Ġ" Ġ+ ĠText Markup Document Reader . TAG _ METADATA Ġ+ Ġ" Ġsection Ġfollowed Ġonly Ġby Ġ//// Ġ" Ġ+ ĠText Markup Document Reader . TAG _ CHANGE Ġ+ Ġ" Ġsections . ĠInstead , Ġfound Ġthis Ġsection Ġin Ġbetween : Ġ" Ġ+ Ġbad Sections ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Structure Old ( doc : ĠText Markup Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Empty Ġ= ĠStringUtils . isBlank ( doc . sections . get ( 0 ). content ) ĊĊĠĠĠĠĠĠĠ ĠValidate . isTrue ( doc . sections . get ( 0 ). name Ġ!= Ġnull Ġ|| Ġcontent Empty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" First Ġcontent Ġof Ġthe Ġfile Ġmust Ġbe Ġthe Ġ//// ĠCHANGE Ġline , Ġor Ġa Ġ//// Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠText Markup Document Reader . TAG _ METADATA Ġ+ Ġ" Ġline , Ġor Ġjust Ġa Ġblank ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge Ġfile Ġand Ġchange Ġlevel Ġrestrictions Ġby Ġrestriction Ġclass Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmerge Restrictions ( file Level Restrictions : ĠImmutableList < Artifact Restrictions >, Ġchange Level Restrictions : ĠImmutableList < Artifact Restrictions >): ĠImmutableList < Artifact Restrictions > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLists . mutable . of All ( file Level Restrictions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with All ( change Level Restrictions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ( Functions . get To Class ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multi Values View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġartifact Restrictions Ġ-> Ġartifact Restrictions . last Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList (). to Immutable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ( table Change Type : ĠChange Type , Ġsection : ĠText Markup Document Section , Ġschema : ĠString , Ġobject Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Index : ĠInt ): ĠChange Input Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchange Type Ġ= Ġget Change Type . get Change Type ( section , Ġtable Change Type ) ĊĠĠĠĠĠĠĠ Ġval Ġdrop Ġ= Ġsection . is Toggle Present ( TO GGLE _ DROP _ TABLE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Name Ġ= Ġsection . get Attr ( ATTR _ NAME ) ĊĠĠĠĠĠĠĠ ĠValidate . notNull ( change Name , Ġ" Must Ġdefine Ġname Ġparameter ") ĊĊĠĠĠĠĠĠĠ Ġval Ġbase lined Changes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( section . get Attr ( ATTR _ BASE LIN ED _ CHANG ES ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFast List . new List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Tokens ToList ( section . get Attr ( ATTR _ BASE LIN ED _ CHANG ES ), Ġ", ") ĊĊĠĠĠĠĠĠĠ Ġval Ġactive Ġ= Ġ! section . is Toggle Present ( TO GGLE _ IN ACTIVE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrollback If Already Deploy ed Section Ġ= Ġsection . subsection s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . name Ġ== ĠText Markup Document Reader . TAG _ ROLL BACK _ IF _ AL READY _ DEPLOY ED Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġin Ġcase Ġthe Ġsection Ġexists Ġbut Ġno Ġcontent , Ġmark Ġit Ġas Ġan Ġempty Ġstring Ġso Ġthat Ġchanges Ġcan Ġstill Ġget Ġdropped Ġfrom Ġthe Ġaudit Ġlog ĊĠĠĠĠĠĠĠ Ġval Ġrollback If Already Deploy ed Command Ġ= Ġif Ġ( rollback If Already Deploy ed Section Ġ== Ġnull ) Ġnull Ġelse ĠStringUtils . default If Empty ( rollback If Already Deploy ed Section . content , Ġ"") ĊĊĠĠĠĠĠĠĠ Ġval Ġrollback Section Ġ= Ġsection . subsection s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. detect Ġ{ Ġit Ġ-> Ġit . name Ġ== ĠText Markup Document Reader . TAG _ ROLL BACK Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrollback Content Ġ= Ġrollback Section ?. content ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġif Ġ( section . content Ġ== Ġnull ) Ġ"" Ġelse Ġsection . content ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . isEmpty ( content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" WARNING : ĠEmpty Ġchange Ġdefined Ġin Ġ[ Table ={}, ĠChange ={} ]; Ġplease Ġavoid Ġempty Ġchanges Ġor Ġcorrect / remove Ġif Ġpossible ", Ġobject Name , Ġchange Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rollback Section Ġ!= Ġnull Ġ&& ĠStringUtils . isBlank ( rollback Content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" WARNING : ĠEmpty Ġrollback Ġscript Ġdefined Ġin Ġ[ Table ={}, ĠChange ={ }], Ġwhich Ġwill Ġbe Ġignored . ĠPlease Ġremove , Ġor Ġadd Ġcontent Ġ( e . g . Ġa Ġdummy ĠSQL Ġupdate Ġif Ġyou Ġwant Ġto Ġforce Ġa Ġrollback )", Ġobject Name , Ġchange Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Input Ġ= ĠChange Input ( false ) ĊĠĠĠĠĠĠĠ Ġchange Input . change Key Ġ= ĠChange Key ( schema , Ġchange Type , Ġobject Name , Ġchange Name ) ĊĠĠĠĠĠĠĠ Ġchange Input . order Within Object Ġ= Ġchange Index ĊĠĠĠĠĠĠĠ Ġchange Input . content Hash Ġ= Ġthis . content Hash Strategy . hash Content ( content ) ĊĠĠĠĠĠĠĠ Ġchange Input . content Ġ= Ġcontent ; ĊĠĠĠĠĠĠĠ Ġchange Input . active Ġ= Ġactive ĊĠĠĠĠĠĠĠ Ġchange Input . rollback If Already Deploy ed Content Ġ= Ġrollback If Already Deploy ed Command ĊĠĠĠĠĠĠĠ Ġ// Ġpart 2 ĊĠĠĠĠĠĠĠ Ġchange Input . rollback Content Ġ= Ġrollback Content ĊĠĠĠĠĠĠĠ Ġchange Input . base lined Changes Ġ= Ġbase lined Changes ĊĠĠĠĠĠĠĠ Ġchange Input . is Drop Ġ= Ġdrop ĊĠĠĠĠĠĠĠ Ġchange Input . is Keep Incremental Order Ġ= Ġdrop ĊĊĠĠĠĠĠĠĠ Ġval Ġapply Gr ants Str Ġ= Ġsection . get Attr ( ATTR _ AP PLY _ GRAN TS ) ĊĠĠĠĠĠĠĠ Ġchange Input . apply Gr ants Ġ= Ġif Ġ( apply Gr ants Str Ġ== Ġnull ) Ġnull Ġelse Ġjava . lang . Boolean . valueOf ( apply Gr ants Str ) ĊĠĠĠĠĠĠĠ Ġchange Input . change set Ġ= Ġsection . get Attr ( ATTR _ CHANGE SET ) ĊĠĠĠĠĠĠĠ Ġchange Input . parallel Group Ġ= Ġsection . get Attr ( ATTR _ PAR ALLEL _ GROUP ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchange Input ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Table Change Parser :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ AP PLY _ GRAN TS Ġ= Ġ" apply Gr ants " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ CHANGE SET Ġ= Ġ" change set " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ PAR ALLEL _ GROUP Ġ= Ġ" parallel Group " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ NAME Ġ= Ġ" name " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ BASE LIN ED _ CHANG ES Ġ= Ġ" base lined Changes " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ COMMENT Ġ= Ġ" comment " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTR _ TEMPLATE _ PARAMS Ġ= Ġ" template Params " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO GGLE _ FK Ġ= Ġ" FK " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO GGLE _ TRIGGER Ġ= Ġ" TRIGGER " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO GGLE _ DROP _ TABLE Ġ= Ġ" DROP _ TABLE " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO GGLE _ IN ACTIVE Ġ= Ġ" IN ACTIVE " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO GGLE _ INDEX Ġ= Ġ" INDEX " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ IMPL : ĠGet Change Type Ġ= Ġobject Ġ: ĠGet Change Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Change Type ( section : ĠText Markup Document Section , Ġtable Change Type : ĠChange Type ): ĠChange Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtable Change Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtable Dis allowed Sections (): ĠImmutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSets . immutable . with ( Text Markup Document Reader . TAG _ DROP _ COMMAND ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtable Toggle s (): ĠImmutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSets . immutable . with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . TO GGLE _ DISABLE _ QUOT ED _ IDENT IFI ERS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ IN ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ FK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ TRIGGER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ INDEX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ DROP _ TABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtable Attributes (): ĠImmutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSets . immutable . with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ AP PLY _ GRAN TS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ BASE LIN ED _ CHANG ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ CHANGE SET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ COMMENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ PAR ALLEL _ GROUP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠATTR _ TEMPLATE _ PARAMS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . ATTR _ DEPEND ENCI ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . ATTR _ EXCL UDE _ DEPEND ENCI ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . ATTR _ INCLUDE _ DEPEND ENCI ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . TAG _ PERM _ SCHEME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . EXCL UDE _ EN VS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . EXCL UDE _ PL AT FOR MS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . INCLUDE _ EN VS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Markup Document Reader . INCLUDE _ PL AT FOR MS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ