/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠNov ik au Ċ Ġ* Ċ Ġ* Ġ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 Ġb oring y uri . processor Ċ Ċ import Ġb oring y uri . api .* Ċ import Ġb oring y uri . api . constant . Boolean Param Ċ import Ġb oring y uri . api . constant . Double Param Ċ import Ġb oring y uri . api . constant . Long Param Ċ import Ġb oring y uri . api . constant . String Param Ċ import Ġb oring y uri . processor . base . B oring Processing Step Ċ import Ġb oring y uri . processor . base . Processing Session Ċ import Ġb oring y uri . processor . ext . create Param Spec Ċ import Ġb oring y uri . processor . ur ip art .* Ċ import Ġb oring y uri . processor . util . Annotation Handler Ċ import Ġb oring y uri . processor . type . Common TypeName .* Ċ import Ġb oring y uri . processor . util . Processor Options Ċ import Ġb oring y uri . processor . util . Processor Options . getType Adapter Factory Ċ import Ġb oring y uri . processor . type . Type Converter Ċ import Ġcom . google . common . collect . Immutable Set Ċ import Ġcom . google . common . collect . Immutable Set Multimap Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjava . util .* Ċ import Ġjavax . lang . model . element .* Ċ import Ġjavax . lang . model . util . Element Filter Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . Linked HashMap Ċ Ċ class ĠUri Factory Generator Step Ġinternal Ġconstructor ( ĊĠĠĠ Ġsession : ĠProcessing Session , ĊĠĠĠ Ġprivate Ġval Ġannotation Handler : ĠAnnotation Handler Ċ ) Ġ: ĠB oring Processing Step ( session ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtype Converter Ġ= ĠType Converter ( ĊĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠ ĠgetType Adapter Factory ( session ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġannotations (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠImmutable Set . of ( Uri Factory :: class . java . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġelements By Annotation : ĠImmutable Set Multimap < String , ĠElement > ĊĠĠĠ Ġ): ĠSet < Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotated Containers Ġ= ĠElement Filter . types In ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements By Annotation [ Uri Factory :: class . java . name ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= Ġhash Set Of < Element >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( container Ġin Ġannotated Containers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( container . kind Ġ!= ĠElement Kind . INTERFACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ % s Ġcan Ġonly Ġbe Ġapplied Ġto Ġan Ġinterface ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri Factory :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġcontainer . modifiers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( modifiers . contains ( Modifier . PRIVATE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ % s Ġcan Ġnot Ġbe Ġapplied Ġto Ġa Ġprivate Ġinterface ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri Factory :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Metadata Ġ= Ġobtain Container Metadata ( container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate Uri Builder Container Impl ( container , Ġcontainer Metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! generated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . add ( container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Container Metadata ( container Element : ĠType Element ): ĠList < Builder Metadata > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclared Methods Ġ= ĠElement Filter . methods In ( container Element . enc losed Elements ) ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= ĠArrayList < Builder Metadata >( declared Methods . size ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( method Element Ġin Ġdeclared Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Element . modifiers . contains ( Modifier . STATIC )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Ġ Ġ// Ġskip Ġstatic Ġmethods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Annotation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Element . getAnnotation ( Uri Builder :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontinue Ġ Ġ// Ġskip Ġnon - annotated Ġmethods ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= ĠClass Name . get ( method Element . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ANDROID _ URI Ġ!= ĠreturnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Uri Ġbuilder Ġmethod Ġmust Ġhave Ġ${ ANDROID _ URI . simple Name ()} Ġreturn Ġtype " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Ġ Ġ// Ġskip Ġthe Ġmethods Ġwith Ġinvalid Ġreturn Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( method Params , Ġsegments , ĠqueryParams ) Ġ= Ġobtain Builder Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Annotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . add ( Builder Metadata ( method Element , Ġmethod Params , Ġsegments , ĠqueryParams )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Builder Metadata ( ĊĠĠĠĠĠĠĠ Ġbuilder Annotation : ĠUri Builder , ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element ĊĠĠĠ Ġ): ĠTrip le < List < Parameter Spec >, ĠList < Path Segment >, ĠList < QueryParameter >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBase Ġpath Ġmay Ġcontain Ġconstant Ġsegments Ġand Ġtemplates Ġfor Ġmethod Ġparameters . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġreplace Ġthe Ġtemplates Ġwith Ġthe Ġpath Ġparameters Ġin Ġthe Ġnext Ġstep . ĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= Ġobtain BasePath Segments ( builder Annotation , Ġmethod Element ) ĊĊĠĠĠĠĠĠĠ Ġval ĠbasePath Ġ= Ġbuilder Annotation . value ĊĠĠĠĠĠĠĠ Ġval Ġmethod Parameters Ġ= Ġmethod Element . parameters ĊĠĠĠĠĠĠĠ Ġval Ġparameter Specs Ġ= Ġarray ListOf < Parameter Spec >() ĊĠĠĠĠĠĠĠ Ġval ĠqueryParams Ġ= Ġarray ListOf < QueryParameter >() ĊĠĠĠĠĠĠĠ Ġ// ĠIter ating Ġover Ġmethod Ġparameters Ġwe 'll Ġfind Ġall Ġthe Ġreplacement s Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġmethod Ġtemplates Ġfound Ġon Ġthe Ġprevious Ġstep Ġand Ġcreate Ġthe Ġparams Ġlist . ĊĠĠĠĠĠĠĠ Ġmethod Parameters . forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġparam . create Param Spec ( annotation Handler ). also Ġ{ Ġparameter Specs . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnullable Ġ= Ġannotation Handler . is Nullable ( spec . type , Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġparam . getAnnotation ( DefaultValue :: class . java )?. value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Annotation Ġ= Ġparam . getAnnotation ( Path :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nullable Ġ&& ĠdefaultValue Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( param , Ġ" Path Ġsegment Ġ'${ spec . name }' Ġmust Ġbe Ġexplicitly Ġnon - null " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġor Ġhave Ġa Ġ@ ${ DefaultValue :: class . simple Name }. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Name Ġ= Ġpath Annotation . value . if Empty Ġ{ Ġspec . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( segments [ path Name ] Ġ! is ĠTemplate Path Segment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Options . warn Ordered Segments Usage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri Builder :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrevious ly Ġsaved ĠVariable Name Segment Ġhelps Ġto Ġpreserve ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsegment Ġposition Ġof Ġthe Ġexpected ĠUri Ġpath . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegments [ path Name ] Ġ= ĠVariable Write Path Segment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Annotation . encoded , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Annotation Ġ= Ġparam . getAnnotation ( Param :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( param Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġparam Annotation . value . if Empty Ġ{ Ġspec . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠqueryParams . add ( Variable Write QueryParameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( param , Ġ" Parameter Ġ'${ spec . name }' Ġis Ġignored ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( parameter Specs , Ġsegments . values . toList (), ĠqueryParams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain BasePath Segments ( ĊĠĠĠĠĠĠĠ Ġbuilder Annotation : ĠUri Builder , ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element ĊĠĠĠ Ġ): ĠMutable Map < String , ĠPath Segment > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsegment Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder Annotation . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Empty Ġ{ Ġreturn ĠLinkedHashMap () Ġ} Ġ// Ġearly Ġexit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("/") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate To ( Linked HashMap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠPATH _ TEMPLATE _ REGEX . find ( it )?. run Ġ{ Ġgroup Values [ 1 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Name Ġ= Ġtemplate Ġ?: Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Ġ= Ġif Ġ( template Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Path Segment ( it , Ġbuilder Annotation . encoded , ĠURI _ BUILDER _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemplate Path Segment ( segment Index , Ġtemplate , Ġmethod Element , Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Index ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Name Ġto Ġsegment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Uri Builder Container Impl ( ĊĠĠĠĠĠĠĠ Ġcontainer Element : ĠType Element , ĊĠĠĠĠĠĠĠ Ġcontainer Metadata : ĠList < Builder Metadata > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Element Ġ= Ġelement Utils . get Package Of ( container Element ) ĊĠĠĠĠĠĠĠ Ġval Ġcontainer PackageName Ġ= Ġpackage Element . qualified Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Simple Name Ġ= Ġcontainer Element . simple Name . toString () Ġ+ ĠCON TAIN ER _ IMPL _ SUFFIX ĊĠĠĠĠĠĠĠ Ġval Ġcontainer ClassName Ġ= ĠClass Name . get ( container PackageName , Ġcontainer Simple Name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġgenerate Uri Builder Container Content ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Metadata ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġwrite SourceFile ( container ClassName , Ġcontent , Ġcontainer Element ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Uri Builder Container Content ( ĊĠĠĠĠĠĠĠ Ġcontainer Impl Name : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġcontainer Element : ĠType Element , ĊĠĠĠĠĠĠĠ Ġcontainer Metadata : ĠList < Builder Metadata > ĊĠĠĠ Ġ): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Content Ġ= ĠType Spec . class Builder ( container Impl Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( ClassName . get ( container Element )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Annotation Ġ= Ġcontainer Element . getAnnotation ( Uri Factory :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġscheme Ġ= Ġcontainer Annotation . scheme ĊĠĠĠĠĠĠĠ Ġval Ġauthority Ġ= Ġcontainer Annotation . authority ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( builder Metadata Ġin Ġcontainer Metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Element Ġ= Ġbuilder Metadata . builder Method ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġmethod Element . modifiers ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠMethod Spec . method Builder ( method Element . simple Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotations ( annotation Handler . to Annotation Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Element . annotation Mir rors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( ANDROID _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Linked HashSet ( modifiers ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( Modifier . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( builder Metadata . method Parameters ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ 1 T Ġ$ 2 L Ġ= Ġnew Ġ$ 1 T ()\ n . scheme ($ 3 S )\ n . authority ($ 4 S )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND ROID _ URI _ BUILDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscheme , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthority ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Code ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Uri Body ( builder Metadata , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Constant String Params ( method Element , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Constant Boolean Params ( method Element , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Constant Long Params ( method Element , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Constant Double Params ( method Element , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Code ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement (" return Ġ\$ L . build ()", ĠURI _ BUILDER _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Content . add Method ( method . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclass Content . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Uri Body ( ĊĠĠĠĠĠĠĠ Ġbuilder Metadata : ĠBuilder Metadata , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Metadata . path Segments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Code ( it . create Value Block ( type Converter )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder Metadata . parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Code ( it . create Value Block ( type Converter )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Constant String Params ( ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconst Params Ġ= Ġmethod Element . get Annotations ByType ( String Param :: class . java ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( const Param Ġin Ġconst Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L . append QueryParameter (\ $ S , Ġ\$ S )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Constant Long Params ( ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconst Params Ġ= Ġmethod Element . get Annotations ByType ( Long Param :: class . java ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( const Param Ġin Ġconst Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L . append QueryParameter (\ $ S , Ġ\$ T . valueOf (\ $ L )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Constant Double Params ( ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconst Params Ġ= Ġmethod Element . get Annotations ByType ( Double Param :: class . java ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( const Param Ġin Ġconst Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L . append QueryParameter (\ $ S , Ġ\$ T . valueOf (\ $ L )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Constant Boolean Params ( ĊĠĠĠĠĠĠĠ Ġmethod Element : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconst Params Ġ= Ġmethod Element . get Annotations ByType ( Boolean Param :: class . java ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( const Param Ġin Ġconst Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L . append QueryParameter (\ $ S , Ġ\$ T . valueOf (\ $ L )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI _ BUILDER _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Param . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠBuilder Metadata ( ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Method : ĠExec utable Element , ĊĠĠĠĠĠĠĠ Ġval Ġmethod Parameters : ĠList < Parameter Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġpath Segments : ĠList < Path Segment >, ĊĠĠĠĠĠĠĠ Ġval Ġparameters : ĠList < QueryParameter > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCON TAIN ER _ IMPL _ SUFFIX Ġ= Ġ" Impl " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠURI _ BUILDER _ NAME Ġ= Ġ" builder " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPATH _ TEMPLATE _ REGEX Ġ= Ġ"^ \\ { ([ a - zA - Z 0 - 9 _- ]+ )} $ ". to Regex () ĊĠĠĠ Ġ} Ċ }