package Ġco . om ise . android . api Ċ Ċ import Ġco . om ise . android . models . Model Ċ import Ġco . om ise . android . models . Serializer Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . RequestBody Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . util . Objects . requireNonNull Ċ Ċ /** Ċ Ġ* ĠRequest ĠBuilder Ġis Ġa Ġbase Ġclass , Ġany Ġclasses Ġthat Ġextends Ġfrom Ġit Ġwould Ġbe Ċ Ġ* Ġresponsible Ġfor Ġcreating Ġa Ġparticular Ġ[ Request ] Ġand Ġallows Ġfor Ġthe ĠRequest Ċ Ġ* Ġmethod , Ġpath , Ġpayload Ġand Ġclass Ġtype Ġto Ġbe Ġconfigured . Ċ Ġ* Ċ Ġ* Ġ@ param Ġ< T > Ġthe Ġgeneric Ġtype Ġfor Ġany ĠModel Ġthat Ġwould Ġneed Ġto Ġbe Ġreturned Ġby Ċ Ġ* Ġthe Ġ[ Client ] Ġwhen Ġthis Ġrequest Ġis Ġpassed Ġto Ġit . Ċ Ġ*/ Ċ abstract Ġclass ĠRequest Builder < T Ġ: ĠModel > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġrequest Ġwith Ġall Ġits Ġen closing Ġinformation Ġand Ġpayload Ġ( if Ġavailable ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġbuilt Ġ[ Request ] Ġof Ġtype Ġ[ Model ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild (): ĠRequest < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRequest ( method (), Ġpath (), Ġpayload (), Ġtype ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault ĠHTTP Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠHTTP Ġmethod Ġas Ġa Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġmethod (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAbstract Ġmethod Ġthat Ġneeds Ġto Ġbe Ġimplemented Ġby Ġall Ġchildren Ġof Ġthis Ġclass ĊĠĠĠĠ Ġ* Ġto Ġprovide ĠAPI Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠURL Ġpath Ġas Ġ[ Http Url ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġpath (): ĠHttp Url ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdditional Ġparameters Ġfor Ġthe Ġrequest , Ġwhich Ġis Ġnull Ġby Ġdefault Ġfor Ġrequests ĊĠĠĠĠ Ġ* Ġthat Ġdo Ġnot Ġaccept Ġparams Ġ( e . g . ĠGET ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġparams Ġas Ġa Ġ[ RequestBody ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġpayload (): ĠRequest Body ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Has Ġto Ġbe Ġnull Ġas Ġit Ġwould Ġfail Ġfor ĠGET Ġrequests ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAbstract Ġmethod Ġthat Ġneeds Ġto Ġbe Ġimplemented Ġby Ġall Ġchildren Ġof Ġthis Ġclass Ġto ĊĠĠĠĠ Ġ* Ġprovide Ġresponse Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠClass Ġtype Ġof Ġresponse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġtype (): ĠClass < T > ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġand Ġreturns Ġa Ġvalid Ġ[ Http Url ] Ġpointing Ġto Ġthe Ġgiven Ġ[ Endpoint ]' s Ġhost ĊĠĠĠĠ Ġ* Ġand Ġwith Ġall Ġthe Ġsupplied Ġsegments Ġconcaten ated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġendpoint ĠThe ĠOm ise ĠAPI Ġ[ Endpoint ] Ġto Ġpoint Ġto . ĊĠĠĠĠ Ġ* Ġ@ param Ġpath ĠThe Ġbase ĠAPI Ġpath . ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġ[ Http Url ] Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġbuild Url ( endpoint : ĠEndpoint , Ġpath : ĠString , Ġvar arg Ġsegments : ĠString ): ĠHttp Url Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHttp Url Builder ( endpoint , Ġpath , Ġsegments . asList ()). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSerial izes Ġall Ġthe Ġen closed Ġparameters Ġin Ġa Ġchild ĠRequest Builder . ĠThis Ġmethod Ġshould Ġbe Ġcalled ĊĠĠĠĠ Ġ* Ġin Ġthe Ġreturn Ġstatement Ġof Ġthe Ġoverridden Ġpayload () Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ RequestBody ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġthe ĠI / O Ġwhen Ġ[ Serializer ] Ġis Ġunable Ġto Ġcorrectly Ġserialize Ġthe Ġcontent Ġof ĊĠĠĠĠ Ġ* Ġthe Ġclass Ġusing ĠJack son . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprotected Ġfun Ġserialize (): ĠRequest Body Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠ Ġserializer (). serialize RequestBuilder ( stream , Ġthis ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRequest Body . create ( JSON _ MEDIA _ TYPE , Ġstream . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserializer (): ĠSerializer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSerializer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠHttp Url Builder ( private Ġval Ġendpoint : ĠEndpoint , Ġprivate Ġval Ġpath : ĠString , Ġprivate Ġval Ġsegments : ĠList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠHttp Url Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NonNull ( endpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NonNull ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠHttp Url . Builder Ġ= Ġendpoint . build Url (). add Path Segment ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegments . forEach Ġ{ Ġsegment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( segment . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Path Segment ( segment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPOST Ġ= Ġ" POST " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGET Ġ= Ġ" GET " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP ATCH Ġ= Ġ" PATCH " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDELETE Ġ= Ġ" DELETE " ĊĠĠĠĠĠĠĠ Ġval ĠJSON _ MEDIA _ TYPE Ġ= Ġ" application / json ; Ġcharset = utf - 8 ". to MediaType () ĊĠĠĠ Ġ} Ċ } Ċ