package Ġde . k lg 7 1 . keycloak migration . change Control . actions Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . de ser . std . Std Deserializer Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġjava . util . Objects . isNull Ċ Ċ class ĠParseException ( message : ĠString , Ġcause : ĠException ?) Ġ: ĠRuntimeException ( message , Ġcause ) Ġ{ ĊĠĠĠ Ġconstructor ( message : ĠString ) Ġ: Ġthis ( message , Ġnull ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDeserial izes ĠActions Ġfrom ĠChange Log Ġfiles . Ċ Ġ* ĠRe places Ġ${ } Ġplaceholders Ġwith Ġsystem Ġenvironment Ġvariables Ġand Ġvariables Ġpassed Ġto Ġit Ġat Ġstart . Ċ Ġ* ĠIf Ġthe Ġsame Ġidentifier Ġis Ġgiven Ġas Ġenvironment Ġvariable Ġand Ġparameter Ġthe Ġenvironment Ġvariable Ġwins . Ċ Ġ*/ Ċ class ĠAction Deserializer ( private Ġval Ġaction Factory : ĠAction Factory ) Ġ: ĠStd Deserializer < Action >( Action :: class . java ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser ?, Ġctxt : ĠDeserial ization Context ?): ĠAction Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isNull ( p )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Json Parser Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġp !!. read Object Node (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Field () ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Factory . create Action ( it . key , Ġit . value . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠObject Node . first Field (): ĠMap . Entry < String , ĠJsonNode > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! fields (). hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Change Ġis Ġempty !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfields (). next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJson Parser . read Object Node () Ġ= Ġcodec . read Tree < Object Node >( this ) Ċ } ĊĊĊ