package Ġnet . andre inc . map ne at . dsl Ċ Ċ import Ġcom . jay way . json path . Configuration Ċ import Ġnet . andre inc . map ne at . config . Json Path Configuration Ċ import Ġnet . andre inc . map ne at . model . Map Ne at Object Map Ċ import Ġnet . andre inc . map ne at . model . Map Ne at Source Ċ import Ġnet . andre inc . map ne at . operation .* Ċ import Ġorg . apache . logging . log 4 j . kotlin . Logging Ċ import Ġjava . util .* Ċ import Ġkotlin . math . exp Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġthe Ġstarting Ġpoint Ġof Ġthe ĠDSL . Ċ Ġ* Ċ Ġ* ĠThe ĠMap Ne at Ġclass Ġextends ĠMap Ne at Object Map Ġwhich Ġholds Ġinternal Ġrepresentation Ġof Ġa ĠJSON Ġas Ġa ĠMutable Map < String , ĠAny > Ċ Ġ*/ Ċ class ĠMap Ne at ( val Ġinput Json : ĠString , Ġval Ġparent Object : ĠMap Ne at ? Ġ= Ġnull , Ġval Ġtransformation Id Ġ: ĠString Ġ= ĠUUID . randomUUID (). toString (), Ġprivate Ġval Ġjson Path Config : ĠConfiguration Ġ= ĠJson Path Configuration . map Ne at Configuration ) Ġ: ĠMap Ne at Object Map ( input Json , Ġjson Path Config ), ĠLogging Ġ{ ĊĊĠĠĠ Ġfun Ġhas Parent () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparent Object Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġrepresents Ġa Ġreference Ġof Ġa Ġpossible Ġparent ĠJSON . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparent () Ġ: ĠMap Ne at ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . parent Object ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAll Ġthe Ġoperations Ġassociated Ġwith Ġa Ġtransformation Ġwill Ġbe Ġlogged Ġusing Ġthe Ġsame ĠID ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġan Ġeasier Ġtracking Ġinside Ġthe Ġlogs ĊĠĠĠĠĠĠĠ Ġval Ġprint Input Ġ= Ġif Ġ( input Json Ġ== Ġparent ()?. input Json ) Ġ" IN HER IT ED " Ġelse Ġinput Json ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Transformation ( id =$ transformation Id , ĠparentId =${ parent Object ?. transformation Id }) ĠINPUT Ġ= Ġ$ print Input "} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconstructor ( source : ĠMap Ne at Source ) Ġ: Ġthis ( source . getString Content ()) ĊĊĠĠĠ Ġin fix Ġoperator Ġfun ĠString . div Assign ( constant Value : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAssign ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ div Assign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġconstant Value ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġoperator Ġfun ĠString . div Assign ( acc : ĠAssign Operation Method ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAssign ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ div Assign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġacc ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . assign ( constant Value : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAssign ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ assign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġconstant Value ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . assign ( acc : ĠAssign Operation Method ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAssign ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ assign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġacc ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠShift Ġtransformation ĠDSL Ġmethods ĊĊĠĠĠ Ġin fix Ġoperator Ġfun ĠString . times Assign ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠShift ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Path Ġ= ĠJson Path Query (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ times Assign ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġoperator Ġfun ĠString . times Assign ( value : ĠJson Path Query . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠShift ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Path Ġ= ĠJson Path Query (). apply ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ times Assign ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . shift ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠShift ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Path Ġ= ĠJson Path Query (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ shift ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . shift ( value : ĠJson Path Query . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠShift ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Path Ġ= ĠJson Path Query (). apply ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ shift ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDelete Ġtransformation ĠDSL Ġmethods ĊĊĠĠĠ Ġfun Ġdelete ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete ( source Ctx , Ġtarget Map , Ġtransformation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠString . unary Minus () Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete ( source Ctx , Ġtarget Map , Ġtransformation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ unary Minus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMove Ġtransformation ĠDSL Ġmethods ĊĊĠĠĠ Ġin fix Ġoperator Ġfun ĠString . rem Assign ( value Ġ: ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMove ( source Ctx , Ġtarget Map , Ġtransformation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . full Field Path Ġ= Ġthis @ rem Assign ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . new Field Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . move ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMove ( source Ctx , Ġtarget Map , Ġtransformation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . full Field Path Ġ= Ġthis @ move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . new Field Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCopy Ġtransformation ĠDSL Ġmethods ĊĊĠĠĠ Ġin fix Ġfun ĠString . copy ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCopy ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ copy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠ Ġin fix Ġoperator Ġfun ĠString . rem ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠ ĠCopy ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġthis @ rem ĊĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġvalue ĊĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy Source To Target () Ġ{ ĊĠĠĠĠĠĠĠ ĠShift ( source Ctx , Ġtarget Map , Ġtransformation Id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Path Ġ= ĠJson Path Query (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġ"$ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Field Path Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ}. do Operation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Pretty String () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjson ( init : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ: ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMap Ne at ( super . source , Ġthis , Ġtransformation Id , Ġjson Path Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( init ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getObject Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjson ( json : ĠString , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ: ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMap Ne at ( json , Ġthis , Ġtransformation Id , Ġjson Path Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( init ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getObject Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjson ( source : ĠMap Ne at Source , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ): ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMap Ne at ( source . content , Ġthis , Ġtransformation Id , Ġjson Path Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( init ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getObject Map () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ inline Ġfun Ġjson ( json : ĠString , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ Ġ: ĠMap Ne at Ġ{ ĊĠĠĠ Ġreturn ĠMap Ne at ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( init ) Ċ } Ċ Ċ inline Ġfun Ġjson ( json : ĠString , Ġjson Path Config : ĠConfiguration , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ Ġ: ĠMap Ne at Ġ{ ĊĠĠĠ Ġreturn ĠMap Ne at ( json , Ġjson Path Config Ġ= Ġjson Path Config ) ĊĠĠĠĠĠĠĠ Ġ. apply ( init ) Ċ } Ċ Ċ inline Ġfun Ġjson ( source : ĠMap Ne at Source , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ: ĠMap Ne at Ġ{ ĊĠĠĠ Ġreturn ĠMap Ne at ( source . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( init ) Ċ } Ċ Ċ inline Ġfun Ġjson ( source : ĠMap Ne at Source , Ġjson Path Config : ĠConfiguration , Ġinit : ĠMap Ne at . () Ġ-> ĠUnit ) Ġ: ĠMap Ne at Ġ{ ĊĠĠĠ Ġreturn ĠMap Ne at ( source . content , Ġjson Path Config Ġ= Ġjson Path Config ) ĊĠĠĠĠĠĠĠ Ġ. apply ( init ) Ċ }