package Ġlang . tax i . generators . java . extensions Ċ Ċ import Ġlang . tax i . Type Names Ċ import Ġlang . tax i . annotations . Http Operation Ċ import Ġlang . tax i . annotations . HttpRequest Body Ċ import Ġlang . tax i . generators . java . Operation Mapper Extension Ċ import Ġlang . tax i . generators . java . Service Mapper Extension Ċ import Ġlang . tax i . generators . java . Type Mapper Ċ import Ġlang . tax i . services . Operation Ċ import Ġlang . tax i . services . Service Ċ import Ġlang . tax i . types . Annotation Ċ import Ġlang . tax i . types . Annotation Provider Ċ import Ġlang . tax i . types . Type Ċ import Ġorg . springframework . cloud . open fe ign . support . Spring Mvc Contract Ċ import Ġjava . lang . reflect . Method Ċ Ċ interface ĠHttp Service Address Provider Ġ: ĠAnnotation Provider Ġ{ Ċ Ċ } Ċ Ċ class ĠService Discovery Address Provider ( private Ġval Ġapplication Name : String ): Http Service Address Provider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġto Annotation (): ĠAnnotation Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlang . tax i . types . Annotation (" Service Discovery Client ", Ġmap Of (" serviceName " Ġto Ġapplication Name )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSpring Mvc Http Service Extension ( val Ġaddress Provider : ĠHttp Service Address Provider ) Ġ: ĠService Mapper Extension Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġupdate ( service : ĠService , Ġtype : ĠClass <* >, Ġtype Mapper : ĠType Mapper , Ġmapped Types : ĠMutable Set < Type >): ĠService Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservice . copy ( annotations Ġ= Ġservice . annotations Ġ+ Ġaddress Provider . to Annotation ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSpring Mvc Http Operation Extension ( val Ġspring Mvc Contract : ĠSpring Mvc Contract Ġ= ĠSpring Mvc Contract ()) Ġ: ĠOperation Mapper Extension Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġupdate ( operation : ĠOperation , Ġtype : ĠClass <* >, Ġmethod : ĠMethod , Ġtype Mapper : ĠType Mapper , Ġmapped Types : ĠMutable Set < Type >): ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġi 'm Ġusing ĠFe ign Ġhere Ġfor Ġparsing , Ġas Ġit Ġseems Ġlike Ġa Ġgood Ġnormal izer Ġ- Ġa Ġwide Ġrange Ġof Ġsupport Ġof Ġdifferent Ġframeworks ĊĠĠĠĠĠĠĠ Ġ// Ġwhich Ġshould Ġall Ġbe Ġre es olvable Ġback Ġto ĠFe ign 's Ġlibrary . Ġ ĠIf Ġthis Ġturns Ġout Ġnot Ġto Ġbe Ġtrue , Ġre visit Ġthis Ġdecision ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġspring Mvc Contract . parse And Validate Metadata ( type , Ġmethod ) ĊĠĠĠĠĠĠĠ Ġvar Ġurl Ġ= Ġmetadata . template (). url () ĊĠĠĠĠĠĠĠ Ġmetadata . index To Name (). forEach Ġ{ Ġindex , Ġnames Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġthe Ġplaceholder Ġin Ġthe Ġurl Ġ( which Ġuses Ġparam Ġnames ) Ġwith Ġtypes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠThis Ġis Ġa Ġna ieve Ġfirst Ġimpl . Ġ ĠNeed Ġto Ġmake Ġuse Ġof Ġparam Ġnames Ġhere Ġsens ibly , Ġand Ġinline Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġprincipal Ġof Ġfavour ing Ġdescriptive Ġtypes Ġover Ġparameter Ġnames ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġmethod . parameters [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdefault Namespace Ġwas : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġtype Mapper . get Tax i Type ( type , mapped Types ). to QualifiedName (). namespace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Namespace Ġ= ĠType Names . derive Namespace ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Tax i Type Ġ= Ġtype Mapper . get Tax i Type ( parameter , Ġmapped Types , Ġdefault Namespace , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames . forEach Ġ{ Ġname Ġ-> Ġurl Ġ= Ġurl . replace (" {$ name }", Ġ"{ ${ param Tax i Type . qualified Name }} ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Params Ġ= Ġif Ġ( metadata . body Index () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Param Ġ= Ġoperation . parameters [ metadata . body Index ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam With Annotation Ġ= Ġoriginal Param . copy ( annotations Ġ= Ġoriginal Param . annotations Ġ+ ĠHttp RequestBody . to Annotation ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġ@ RequestBody Ġannotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . parameters . repl acing ( metadata . body Index (), Ġparam With Annotation ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġoperation . parameters ĊĠĠĠĠĠĠĠ Ġreturn Ġoperation . copy ( annotations Ġ= Ġoperation . annotations Ġ+ ĠHttp Operation ( metadata . template (). method (), Ġurl ). to Annotation (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġupdated Params ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. repl acing ( index : ĠInt , Ġvalue : ĠT ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġcopy Ġ= Ġthis . to Mutable List () ĊĠĠĠ Ġcopy . set ( index , Ġvalue ) ĊĠĠĠ Ġreturn Ġcopy . toList () Ċ } Ċ