/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 - 2 0 2 2 ĠExact pro Ġ( Exact pro ĠSystems ĠLimited ) Ċ Ġ* Ċ Ġ* Ġ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 . exact pro . th 2 . codec . openapi . writer . visitor s . json Ċ Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . check Enum Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . get Required Array Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . getField Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As BigDecimal Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Boolean Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Double Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Float Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Integer Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Long Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . validate As Object Ċ import Ġcom . exact pro . th 2 . codec . openapi . writer . Schema Writer Ċ import Ġcom . exact pro . th 2 . codec . openapi . writer . visitor s . Schema Visitor . Decode Visitor Ċ import Ġcom . exact pro . th 2 . common . grpc . Message Ċ import Ġcom . exact pro . th 2 . common . message . addField Ċ import Ġcom . exact pro . th 2 . common . message . add Fields Ċ import Ġcom . exact pro . th 2 . common . message . message Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . node . JsonNode Factory Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġio . swagger . v 3 . o as . models . media . Array Schema Ċ import Ġio . swagger . v 3 . o as . models . media . Schema Ċ import Ġjava . math . BigDecimal Ċ Ċ class ĠDecode JsonObject Visitor ( override Ġval Ġfrom : ĠObject Node ) Ġ: ĠDecode Visitor < Object Node >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġroot Message Ġ= Ġmessage () ĊĊĠĠĠ Ġconstructor ( json String : ĠString ) Ġ: Ġthis ( mapper . read Tree ( json String ) Ġas ĠObject Node ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠSchema < *> ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean , Ġschema Writer : ĠSchema Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . getField ( fieldName , Ġrequired )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= ĠDecode JsonObject Visitor ( it . validate As Object ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Writer . traverse ( visitor , Ġfld Struct ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvisitor . root Message . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠString ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. as Text () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠBoolean ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As Boolean () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠInt ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As Integer () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠFloat ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As Float () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠDouble ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As Double () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠBigDecimal ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As BigDecimal () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue ?. to Plain String () Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( fieldName : ĠString , ĠdefaultValue : ĠLong ?, Ġfld Struct : ĠSchema <* >, Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfrom . getField ( fieldName , Ġrequired )?. validate As Long () ĊĠĠĠĠĠĠĠ Ġfld Struct . check Enum ( value , ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġroot Message . add Fields ( fieldName , Ġvalue Ġ?: ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Boolean Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Boolean > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As Boolean () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Integer Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Int > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As Integer () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit String Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < String > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. map Ġ{ Ġit . as Text () Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Double Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Double > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As Double () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Float Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Float > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As Float () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Long Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Long > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As Long () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit BigDecimal Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < BigDecimal > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ Ġit . validate As BigDecimal (). to Plain String () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Object Collection ( fieldName : ĠString , ĠdefaultValue : ĠList < Any > ?, Ġfld Struct : ĠArray Schema , Ġrequired : ĠBoolean , Ġschema Writer : ĠSchema Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom . get Required Array ( fieldName , Ġrequired )?. let Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Message . addField ( fieldName , Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDecode JsonObject Visitor ( it . validate As Object ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Writer . traverse ( this , Ġfld Struct . items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. getResult () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Undefined Fields ( fields : ĠMutable Set < String >): ĠSet < String > Ġ= Ġfrom . field Names (). as Sequence (). filter Not Ġ{ Ġit Ġin Ġfields Ġ}. toSet () ĊĊĠĠĠ Ġoverride Ġfun Ġget Result (): ĠMessage . Builder Ġ= Ġroot Message ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObjectMapper (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Factory Ġ= ĠJsonNode Factory . with Exact BigDecimal s ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }