/* Ċ Ġ* Ġ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 Ċ Ċ import Ġcom . exact pro . th 2 . codec . Codec Exception Ċ import Ġcom . exact pro . th 2 . codec . openapi . utils . get EndPoint Ċ import Ġcom . exact pro . th 2 . codec . openapi . writer . visitor s . Schema Visitor Ċ import Ġio . swagger . v 3 . o as . models . Open API Ċ import Ġio . swagger . v 3 . o as . models . media . Array Schema Ċ import Ġio . swagger . v 3 . o as . models . media . Schema Ċ import Ġio . swagger . v 3 . parser . util . Schema Type Util . BOOLEAN _ TYPE Ċ import Ġio . swagger . v 3 . parser . util . Schema Type Util . INTEGER _ TYPE Ċ import Ġio . swagger . v 3 . parser . util . Schema Type Util . NUMBER _ TYPE Ċ import Ġio . swagger . v 3 . parser . util . Schema Type Util . OBJECT _ TYPE Ċ import Ġio . swagger . v 3 . parser . util . Schema Type Util . STRING _ TYPE Ċ import Ġjava . math . BigDecimal ĊĊ Ċ class ĠSchema Writer Ġconstructor ( private Ġval Ġopen Api : ĠOpenAPI , Ġprivate Ġval Ġfail On Undefined : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠ Ġfun Ġtraverse ( ĊĠĠĠĠĠĠĠ Ġschema Visitor : ĠSchema Visitor < *, Ġ* >, ĊĠĠĠĠĠĠĠ Ġmsg Structure : ĠSchema < *> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġopen Api . get EndPoint ( msg Structure ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( schema . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠARRAY _ TYPE Ġ-> Ġprocess Property ( schema , Ġschema Visitor , ĠARRAY _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOBJECT _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( schema . properties ) Ġ{" Properties Ġin Ġobject Ġare Ġrequired : Ġ$ schema "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fail On Undefined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Visitor . get Undefined Fields ( schema . properties . keys )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( it . isEmpty ()) Ġ{ Ġ" Undefined Ġfields Ġwere Ġfound Ġinside Ġof Ġ${ schema . name }: Ġ${ it . join ToString () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema . properties . forEach Ġ{ Ġ( name , Ġproperty ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Property ( open Api . get EndPoint ( property ), Ġschema Visitor , Ġname , Ġschema . required ?. contains ( name ) Ġ?: Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Property ( property : ĠSchema <* >, Ġvisitor : ĠSchema Visitor < *, Ġ* >, Ġname : ĠString , Ġrequired : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( property . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠARRAY _ TYPE Ġ-> Ġprocess Array Property ( property Ġas ĠArray Schema , Ġvisitor , Ġname , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTEGER _ TYPE Ġ-> Ġwhen Ġ( property . format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" int 6 4 " Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠLong , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ"", Ġ" int 3 2 " Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠInt , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġformat Ġof Ġ'$ INTEGER _ TYPE ' Ġproperty Ġ$ name : Ġ${ property . format }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOOLEAN _ TYPE Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠBoolean , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNUMBER _ TYPE Ġ-> Ġwhen Ġ( property . format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠFloat , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠDouble , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-" Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠBigDecimal , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ"" Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠString , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġformat Ġof Ġ'$ NUMBER _ TYPE ' Ġproperty Ġ$ name : Ġ${ property . format }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING _ TYPE Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠString , Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOBJECT _ TYPE Ġ-> Ġvisitor . visit ( name , Ġproperty . default Ġas ? ĠSchema <* >, Ġproperty , Ġrequired , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġtype Ġof Ġproperty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCodec Exception (" Cannot Ġparse Ġfield Ġ[$ name ] Ġinside Ġof Ġschema Ġwith Ġtype Ġ${ property . type }", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġprocess Array Property ( property : ĠArray Schema , Ġvisitor : ĠSchema Visitor < *, Ġ* >, Ġname : ĠString , Ġrequired : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( property . items . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTEGER _ TYPE Ġ-> Ġwhen Ġ( property . items . format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" int 6 4 " Ġ-> Ġvisitor . visit Long Collection ( name , Ġproperty . default Ġas ? ĠList < Long >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ"", Ġ" int 3 2 " Ġ-> Ġvisitor . visit Integer Collection ( name , Ġproperty . default Ġas ? ĠList < Int >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġformat Ġof Ġ'$ INTEGER _ TYPE ' Ġproperty : Ġ${ property . format }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOOLEAN _ TYPE Ġ-> Ġvisitor . visit Boolean Collection ( name , Ġproperty . default Ġas ? ĠList < Boolean >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNUMBER _ TYPE Ġ-> Ġwhen Ġ( property . items . format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġvisitor . visit Float Collection ( name , Ġproperty . default Ġas ? ĠList < Float >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġvisitor . visit Double Collection ( name , Ġproperty . default Ġas ? ĠList < Double >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ"" Ġ-> Ġvisitor . visit String Collection ( name , Ġproperty . default Ġas ? ĠList < String >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-" Ġ-> Ġvisitor . visit BigDecimal Collection ( name , Ġproperty . default Ġas ? ĠList < BigDecimal >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġformat Ġof Ġ'$ NUMBER _ TYPE ' Ġproperty : Ġ${ property . format }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING _ TYPE Ġ-> Ġvisitor . visit String Collection ( name , Ġproperty . default Ġas ? ĠList < String >, Ġproperty , Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOBJECT _ TYPE Ġ-> Ġvisitor . visit Object Collection ( name , Ġproperty . default Ġas ? ĠList < Any >, Ġproperty , Ġrequired , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġtype Ġof Ġproperty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCodec Exception (" Cannot Ġparse Ġarray Ġfield Ġ[$ name ] Ġinside Ġof Ġschema Ġwith Ġtype Ġ${ property . type }", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARRAY _ TYPE Ġ= Ġ" array " ĊĠĠĠ Ġ} Ċ }