/** Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠRo yal ĠBank Ġof ĠS co tl and Ċ Ġ* Ċ Ġ* Ġ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 Ġio . blue bank . bra id . cord a . rest . docs . v 3 Ċ Ċ import Ġio . blue bank . bra id . cord a . rest . Swagger Info Ċ import Ġio . blue bank . bra id . cord a . rest . docs . Docs Handler Ċ import Ġio . blue bank . bra id . cord a . rest . to Swagger Path Ċ import Ġio . netty . handler . codec . http . Http Header Values . APPLICATION _ JSON Ċ import Ġio . netty . handler . codec . http . HttpResponse Status Ċ import Ġio . swagger . v 3 . core . util . Json Ċ import Ġio . swagger . v 3 . o as . models . Components Ċ import Ġio . swagger . v 3 . o as . models . Open API Ċ import Ġio . swagger . v 3 . o as . models . Path Item Ċ import Ġio . swagger . v 3 . o as . models . info . Contact Ċ import Ġio . swagger . v 3 . o as . models . info . Info Ċ import Ġio . swagger . v 3 . o as . models . security . Security Scheme Ċ import Ġio . swagger . v 3 . o as . models . servers . Server Ċ import Ġio . vertx . core . http . HttpHeaders Ċ import Ġio . vertx . core . http . HttpMethod Ċ import Ġio . vertx . core . http . HttpMethod .* Ċ import Ġio . vertx . ext . web . Routing Context Ċ import Ġnet . cord a . core . utilities . context Logger Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . net . URI Ċ import Ġjava . net . URL Ċ import Ġkotlin . reflect . K Callable Ċ Ċ class ĠDocs Handler V 3 ( ĊĠ Ġprivate Ġval Ġswagger Info : ĠSwagger Info Ġ= ĠSwagger Info (), ĊĠ Ġprivate Ġval Ġauth : ĠSecurity Scheme ? Ġ= Ġnull , ĊĠ Ġprivate Ġval ĠbasePath : ĠString Ġ= Ġ" http :// localhost : 8 0 8 0 ", ĊĠ Ġprivate Ġval Ġdebug Mode : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠDocs Handler Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġcontext Logger () ĊĠĠĠ Ġinternal Ġconst Ġval ĠSECURITY _ DEFINITION _ NAME Ġ= Ġ" Authorization " ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġcurrent GroupName : ĠString Ġ= Ġ"" ĊĠ Ġprivate Ġval Ġendpoints Ġ= Ġmutable ListOf < EndPoint V 3 >() ĊĠ Ġprivate Ġvar Ġopen API : ĠOpenAPI ? Ġ= Ġnull Ġ// Ġthis Ġwill Ġbe Ġthread - safe Ġbecause Ġof Ġthe Ġway Ġvert x Ġworks ĊĠ Ġprivate Ġval Ġmodel Context Ġ= ĠModel Context V 3 () ĊĊĠ Ġoverride Ġfun Ġhandle ( context : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġoutput Ġ= Ġget Swagger String ( context ) ĊĠĠĠ Ġcontext . response () ĊĠĠĠĠĠ Ġ. set StatusCode ( HttpResponse Status . OK . code ()) ĊĠĠĠĠĠ Ġ. put Header ( HttpHeaders . CONTENT _ TYPE , ĠAP PLICATION _ JSON ) Ċ // ĠĠĠĠĠ Ġ. put Header ( HttpHeaders . CONTENT _ LENGTH , Ġoutput . length . toString ()) ĊĠĠĠĠĠ Ġ. set Chunk ed ( true ) ĊĠĠĠĠĠ Ġ. end ( output ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Swagger String ( context : ĠRouting Context ?): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠJson . pretty (). writeValue AsString ( create Or Get Open API ( context )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Or Get Open API ( context : ĠRouting Context ? Ġ= Ġnull ): ĠOpenAPI Ġ{ ĊĠĠĠ Ġif Ġ( open API Ġ== Ġnull Ġ|| Ġdebug Mode ) Ġ{ ĊĠĠĠĠĠ Ġopen API Ġ= Ġcreate Open API ( context ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġopen API !! ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġcreate Open API ( context : ĠRouting Context ? Ġ= Ġnull ): ĠOpenAPI Ġ{ ĊĠĠĠ Ġval Ġbase URL Ġ= ĠURL ( basePath ) ĊĠĠĠ Ġval Ġserver URI Ġ= Ġwhen Ġ( context ) Ġ{ ĊĠĠĠĠĠ Ġnull Ġ-> Ġbase URL ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠURI ( context . request (). absolute URI ()) ĊĠĠĠĠĠĠĠ ĠURL ( uri . scheme , Ġuri . host , Ġuri . port , Ġbase URL . path ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠOpenAPI () ĊĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo ( create Swagger Info ()) ĊĠĠĠĠĠĠĠ Ġadd Servers Item ( Server (). url ( server URI . toString ())) ĊĠĠĠĠĠĠĠ Ġ// Ġhopefully Ġunder Ġserver Ġabove Ġ. basePath ( url . path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( auth Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġget OrCreate Components (). security Schemes Ġ= Ġmap Of ( SECURITY _ DEFINITION _ NAME Ġto Ġauth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġmay Ġbe Ġcovered Ġunder Ġserver ? Ġ. schema ( scheme ) ĊĠĠĠĠĠĠĠ Ġmodel Context . addTo Swagger ( this ) ĊĠĠĠĠĠĠĠ Ġendpoints . forEach Ġ{ Ġadd Endpoint ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Swagger Info () Ġ= ĠInfo (). apply Ġ{ ĊĠĠĠ Ġversion ( swagger Info . version ) ĊĠĠĠ Ġtitle ( swagger Info . serviceName ) ĊĠĠĠ Ġdescription ( swagger Info . description ) ĊĠĠĠ Ġcontact ( Contact (). apply Ġ{ ĊĠĠĠĠĠ Ġname ( swagger Info . contact . name ) ĊĠĠĠĠĠ Ġemail ( swagger Info . contact . email ) ĊĠĠĠĠĠ Ġurl ( swagger Info . contact . url ) ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠOpenAPI . add Endpoint ( endpoint : ĠEnd Point V 3 ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġswagger Path Ġ= Ġendpoint . path . to Swagger Path () ĊĠĠĠĠĠ Ġval Ġpath Ġ= Ġif Ġ( this . paths Ġ!= Ġnull Ġ&& Ġthis . paths . contains ( swagger Path )) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaths [ swagger Path ] !! ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath Item () ĊĠĠĠĠĠĠĠ Ġthis . path ( swagger Path , Ġpath ) ĊĠĠĠĠĠĠĠ Ġpath ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġoperation Ġ= Ġendpoint . to Operation () ĊĠĠĠĠĠ Ġwhen Ġ( endpoint . method ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGET Ġ-> Ġpath . get ( operation ) ĊĠĠĠĠĠĠĠ ĠPOST Ġ-> Ġpath . post ( operation ) ĊĠĠĠĠĠĠĠ ĠPUT Ġ-> Ġpath . put ( operation ) ĊĠĠĠĠĠĠĠ ĠDELETE Ġ-> Ġpath . delete ( operation ) ĊĠĠĠĠĠĠĠ ĠP ATCH Ġ-> Ġpath . patch ( operation ) ĊĠĠĠĠĠĠĠ ĠOPTIONS , ĠHEAD , ĠTRACE , ĠCONNECT , ĠOTHER Ġ-> Ġerror (" HTTP Ġmethod Ġnot Ġimplemented : Ġ${ endpoint . method . name }") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġlog . warn (" Unable Ġto Ġadd Ġendpoint Ġ$ endpoint Ġ: Ġ${ e . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< Response > Ġadd ( ĊĠĠĠ ĠgroupName : ĠString , ĊĠĠĠ Ġprotected : ĠBoolean , ĊĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġhandler : ĠK Callable < Response > ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġendpoint Ġ= ĠEnd Point V 3 . create ( ĊĠĠĠĠĠ ĠgroupName , ĊĠĠĠĠĠ Ġprotected , ĊĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠ Ġpath , ĊĠĠĠĠĠ Ġhandler . name , ĊĠĠĠĠĠ Ġhandler . parameters , ĊĠĠĠĠĠ Ġhandler . returnType , ĊĠĠĠĠĠ Ġhandler . annotations , ĊĠĠĠĠĠ Ġmodel Context ĊĠĠĠ Ġ) ĊĠĠĠ Ġadd ( endpoint ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd ( ĊĠĠĠ ĠgroupName : ĠString , ĊĠĠĠ Ġprotected : ĠBoolean , ĊĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġhandler : Ġ( Routing Context ) Ġ-> ĠUnit ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġendpoint Ġ= ĠEnd Point V 3 . create ( groupName , Ġprotected , Ġmethod , Ġpath , Ġhandler , Ġmodel Context ) ĊĠĠĠ Ġadd ( endpoint ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd ( endpoint : ĠEnd Point V 3 ) Ġ{ ĊĠĠĠ Ġendpoints . add ( endpoint ) ĊĠ Ġ} ĊĊĠ Ġfun Ġgroup ( groupId : ĠString , Ġfn : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . current GroupName Ġ= ĠgroupId ĊĠĠĠ Ġfn () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Type ( type : ĠType ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġmodel Context . add Type ( type ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog . error (" Unable Ġto Ġadd Ġroot Ġtype : Ġ$ type Ġerror : Ġ${ e . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠOpenAPI . get OrCreate Components (): ĠComponents Ġ{ ĊĠ Ġif Ġ( components Ġ== Ġnull ) Ġ{ ĊĠĠĠ Ġcomponents Ġ= ĠComponents () ĊĠ Ġ} ĊĠ Ġreturn Ġcomponents Ċ } ĊĊ