package Ġcom . j mer anda . gl azy . lib . handler Ċ Ċ import Ġcom . j mer anda . gl azy . lib . exception . Bad Endpoint Ċ import Ġcom . j mer anda . gl azy . lib . objects .* Ċ import Ġcom . j mer anda . gl azy . lib . service . root Endpoints Ċ import Ġcom . j mer anda . gl azy . lib . service . write Ċ Ċ import Ġcom . fasterxml . jackson . databind . Json Mapping Exception Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . Property Naming Strategy Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . j mer anda . gl azy . lib . make Verbose Ċ Ċ import Ġjava . util . logging .* Ċ Ċ import Ġk http .* Ċ import Ġk http . responses . Response Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠRetrieve Ġroot Ġendpoints . Ċ Ġ* Ċ Ġ* Ġ@ param Ġroot Url ĠThe Ġtop most Ġapi Ġendpoint Ġurl . Ċ Ġ* Ġ@ param Ġmapper ĠThe Ġobject Ġmapper Ġto Ġuse Ġfor Ġde serialization . Ċ Ġ* Ġ@ return ĠAn Ġinstance Ġof Ġ[ com . j mer anda . gl azy . lib . objects . Root Endpoints ] Ċ Ġ*/ Ċ fun Ġget Root Endpoints ( root Url : ĠString , Ġmapper : ĠObjectMapper ): ĠRoot Endpoints Ġ{ ĊĠĠĠ Ġval Ġroot Endpoints : ĠRoot Endpoints ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġendpoints As Json : ĠString Ġ= Ġget ( root Url ). text ĊĠĠĠĠĠĠĠ Ġroot Endpoints Ġ= Ġmapper . readValue ( endpoints As Json ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠBad Endpoint ( root Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwrite ( root Endpoints ) ĊĊĠĠĠ Ġreturn Ġroot Endpoints Ċ } Ċ Ċ /** Ċ Ġ* ĠHandles Ġrequests Ġfor Ġresources . Ċ Ġ* Ċ Ġ* Ġ@ param Ġheader ĠThe Ġheader Ġfor Ġsending Ġrequests . Ċ Ġ* Ġ@ param Ġurl ĠThe Ġurl Ġfor Ġgenerating Ġendpoint Ġtargets . Ċ Ġ* Ġ@ param Ġclazz ĠThe Ġexpected Ġreturn Ġtype Ġfrom Ġrequests . Ċ Ġ*/ Ċ abstract Ġclass ĠHandler ( ĊĠĠĠ Ġprivate Ġval Ġheader : ĠG lazy Header , ĊĠĠĠ Ġprotected Ġval Ġurl : ĠString , ĊĠĠĠ Ġprivate Ġval Ġrequest : ĠRequest , ĊĠĠĠ Ġprivate Ġval Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠG lazy Header Ġby Ġheader Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSerialize Ġthe Ġapi Ġrequest Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġserialized Ġobject Ġor Ġnull Ġon Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġserialize Request (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . INFO ," Creating Ġapi Ġresponse .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . writeValue AsString ( this . request ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Mapping Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . WARNING , Ġ" Error Ġmapping Ġapi Ġrequest .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeserialize Ġa Ġstring Ġinto Ġthe Ġdesired Ġtype , Ġmust Ġbe Ġa Ġsubclass Ġof Ġ[ com . j mer anda . gl azy . lib . objects . Git Object ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠThe Ġdata Ġto Ġbe Ġdeserialized . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġdeserialized Ġobject , Ġor Ġnull Ġon Ġde serialization Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdeserialize ( data : ĠString ): ĠGit Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Parsing Ġapi Ġresponse .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . readValue ( data , Ġthis . clazz . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Mapping Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . WARNING , Ġ" Error Ġmapping Ġresponse Ġdue Ġto Ġbad Ġor Ġmissing Ġvalue Ġat Ġ'${ e . path Reference } ': Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeserialize Ġa Ġstring Ġinto Ġa Ġlist Ġof Ġthe Ġdesired Ġtype , Ġwhich Ġmust Ġbe Ġa Ġsubclass Ġof Ġ[ com . j mer anda . gl azy . lib . objects . Git Object ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠThe Ġdata Ġto Ġbe Ġdeserialized . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġdeserialized Ġobject , Ġor Ġnull Ġon Ġde serialization Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġdeserialize List ( data : ĠString ): ĠList < Git Object >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Parsing Ġapi Ġresponse .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this . clazz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIssue :: class Ġ-> Ġmapper . readValue < List < Issue >>( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRepo :: class Ġ-> Ġmapper . readValue < List < Repo >>( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel :: class Ġ-> Ġmapper . readValue < List < Label >>( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPull Request :: class Ġ-> Ġmapper . readValue < List < PullRequest >>( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser :: class Ġ-> Ġmapper . readValue < List < User >>( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Mapping Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . WARNING , Ġ" Error Ġparsing Ġapi Ġresponse .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapper : ĠObjectMapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setProperty Naming Strategy ( Property Naming Strategy . S NA KE _ CASE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġendpoints : ĠRoot Endpoints Ġ= Ġroot Endpoints () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġget Root Endpoints ( ROOT _ ENDPOINT , Ġmapper ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġlogger : ĠLogger Ġ= ĠLogger . getLogger ( Handler :: class . qualified Name ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġverbose Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . make Verbose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . level Ġ= ĠLevel . OFF ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠProvide Ġaccess Ġto Ġlogging Ġprogress Ġto Ġthe Ġconsole . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmsg ĠThe Ġmessage Ġto Ġbe Ġlogged . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġlog ( level : ĠLevel , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( level , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHandle Ġthe Ġrequest Ġresponse Ġto Ġdetermine Ġis Ġsuccess Ġor Ġfailure . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġresponse ĠThe Ġ[ k http . responses . Response ] Ġreceived . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġon Ġfailure ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġhandle Code ( response : ĠResponse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . statusCode Ġ>= Ġ 4 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Level . WARNING , Ġresponse . jsonObject [" message "] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse . statusCode Ġ< Ġ 4 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġhandlers Ġnot Ġexpecting Ġto Ġreceive Ġinformation . Ċ Ġ*/ Ċ interface ĠNo Response Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġrequests Ġexpect ong Ġno Ġresponse Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandle No Request () Ċ } Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġhandlers Ġexpecting Ġto Ġreceive Ġa Ġ Ġobject . Ċ Ġ*/ Ċ interface ĠSingle Response Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġrequests Ġexpecting Ġa Ġresponse Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandle Request (): ĠGit Object ? Ċ } Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġhandlers Ġexpecting Ġto Ġrece v ie Ġa Ġlist Ġof Ġobjects . Ċ Ġ*/ Ċ interface ĠList Response Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġrequests Ġexpecting Ġa Ġlist Ġof Ġresponse Ġobjects . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandle List Request (): ĠList < Git Object >? Ċ } Ċ Ċ /** Ċ Ġ* ĠHandler Ġfor ĠGET Ġstyle Ġrequests . Ċ Ġ* Ċ Ġ* Ġ@ see ĠHandler Ċ Ġ*/ Ċ class ĠGet Handler ( ĊĠĠĠ Ġheader : ĠG lazy Header , ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠHandler ( header , Ġurl , Ġrequest , Ġclazz ), ĠSingle Response , ĠList Response Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle List Request (): ĠList < Git Object >? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġget ( this . url , Ġheaders Ġ= Ġthis . headers ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġhandle Code ( response )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize List ( response . text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Request (): ĠGit Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġget ( this . url , Ġheaders Ġ= Ġthis . headers ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġhandle Code ( response )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize ( response . text ) ĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ /** Ċ Ġ* ĠHandler Ġfor ĠPOST Ġstyle Ġrequests . Ċ Ġ* Ċ Ġ* Ġ@ see ĠHandler Ċ Ġ*/ Ċ class ĠPost Handler ( ĊĠĠĠ Ġheader : ĠG lazy Header , ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠHandler ( header , Ġurl , Ġrequest , Ġclazz ), ĠSingle Response , ĠNo Response Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle No Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġpost ( this . url , Ġdata Ġ= Ġserialize Request (), Ġheaders Ġ= Ġthis . headers ) ĊĊĠĠĠĠĠĠĠ Ġhandle Code ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Request (): ĠGit Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġpost ( this . url , Ġdata Ġ= Ġserialize Request (), Ġheaders Ġ= Ġthis . headers ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġhandle Code ( response )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize ( response . text ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHandler Ġfor ĠPUT Ġstyle Ġrequests / Ċ Ġ* Ċ Ġ* Ġ@ see ĠHandler Ċ Ġ*/ Ċ class ĠPut Handler ( ĊĠĠĠ Ġheader : ĠG lazy Header , ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠHandler ( header , Ġurl , Ġrequest , Ġclazz ), ĠSingle Response , ĠNo Response Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle No Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġput ( this . url , Ġdata Ġ= Ġserialize Request (), Ġheaders Ġ= Ġthis . headers ) ĊĊĠĠĠĠĠĠĠ Ġhandle Code ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Request (): ĠGit Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġput ( this . url , Ġdata Ġ= Ġserialize Request (), Ġheaders Ġ= Ġthis . headers ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġhandle Code ( response )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize ( response . text ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHandler Ġfor ĠP ATCH Ġstyle Ġrequests . Ċ Ġ* Ċ Ġ* Ġ@ see ĠHandler Ċ Ġ*/ Ċ class ĠPatch Handler ( ĊĠĠĠ Ġheader : ĠG lazy Header , ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠHandler ( header , Ġurl , Ġrequest , Ġclazz ), ĠSingle Response Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle Request (): ĠGit Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġpatch ( this . url , Ġdata Ġ= Ġserialize Request (), Ġheaders Ġ= Ġthis . headers ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġhandle Code ( response )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize ( response . text ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHandler Ġfor ĠDELETE Ġstyle Ġrequests . Ċ Ġ* Ċ Ġ* Ġ@ see ĠHandler Ċ Ġ*/ Ċ class ĠDelete Handler ( ĊĠĠĠ Ġheader : ĠG lazy Header , ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġclazz : ĠK Class < out ĠGit Object > Ċ ) Ġ: ĠHandler ( header , Ġurl , Ġrequest , Ġclazz ), ĠNo Response Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle No Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Level . INFO , Ġ" Sending Ġrequest Ġto Ġ${ this . url }") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġdelete ( this . url , Ġheaders Ġ= Ġthis . headers ) ĊĊĠĠĠĠĠĠĠ Ġhandle Code ( response ) ĊĠĠĠ Ġ} Ċ } Ċ