package Ġcom . ish ub h ams ing h . jenkins . inter actor čĊč Ċ import Ġcom . google . gson . Gson č Ċ import Ġcom . ish ub h ams ing h . jenkins . core . exception . Failure č Ċ import Ġcom . ish ub h ams ing h . jenkins . core . functional . Either č Ċ import Ġcom . ish ub h ams ing h . jenkins . core . ret rofit . Network Handler č Ċ import Ġcom . ish ub h ams ing h . jenkins . inter actor . api . J enkins Api č Ċ import Ġcom . ish ub h ams ing h . jenkins . inter actor . api . J enkins Auth Api č Ċ import Ġcom . ish ub h ams ing h . jenkins . models . Error Body č Ċ import Ġkotlinx . coroutines . Dispatch ers č Ċ import Ġkotlinx . coroutines . Global Scope č Ċ import Ġkotlinx . coroutines . Job č Ċ import Ġkotlinx . coroutines . launch č Ċ import Ġokhttp 3 . ResponseBody č Ċ import Ġretrofit 2 . HttpException č Ċ import Ġru . g ild or . coroutines . ret rofit . Result č Ċ import Ġjava . io . IOException č Ċ import Ġjavax . inject . Inject čĊč Ċ /** čĊ Ġ* ĠCreated Ġby ĠSh ub ham ĠSing h Ġon Ġ 1 4 - 0 7 - 2 0 1 9 . čĊ Ġ*/ čĊč Ċ /** čĊ Ġ* ĠAbstract Ġclass Ġfor Ġa ĠUse ĠCase Ġ( Interactor Ġin Ġterms Ġof ĠClean ĠArchitecture ). čĊ Ġ* ĠThis Ġabstraction Ġrepresents Ġan Ġexecution Ġunit Ġfor Ġdifferent Ġuse Ġcases Ġ( this Ġmeans Ġthan Ġany Ġuse čĊ Ġ* Ġcase Ġin Ġthe Ġapplication Ġshould Ġimplement Ġthis Ġcontract ). čĊ Ġ* čĊ Ġ* ĠBy Ġconvention Ġeach Ġ[ UseCase ] Ġimplementation Ġwill Ġexecute Ġits Ġjob Ġin Ġa Ġbackground Ġthread čĊ Ġ* Ġ( kotlin Ġcoroutine ) Ġand Ġwill Ġpost Ġthe Ġresult Ġin Ġthe ĠUI Ġthread . čĊ Ġ*/ č Ċ abstract Ġclass ĠUse Case < out ĠType , Ġin ĠParams >() Ġwhere ĠType Ġ: ĠAny Ġ{ čĊĠĠĠ Ġprotected Ġvar Ġuser Identifier Ġ= Ġ"" čĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull čĊčĊĠĠĠ Ġ@ Inject čĊĠĠĠ Ġlateinit Ġvar Ġnetwork Handler : ĠNetwork Handler čĊčĊĠĠĠ Ġ@ Inject čĊĠĠĠ Ġlateinit Ġvar Ġjenkins Api : ĠJenkins Api čĊčĊĠĠĠ Ġ@ Inject čĊĠĠĠ Ġlateinit Ġvar Ġjenkins Auth Api : ĠJenkins Auth Api čĊčĊčĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġrun (): ĠEither < Failure , ĠType > čĊčĊčĊĠĠĠ Ġfun Ġexecute ( on Result : Ġ( Either < Failure , ĠType >) Ġ-> ĠUnit , Ġparams : ĠParams ) Ġ{ čĊčĊčĊĠĠĠĠĠĠĠ Ġjob Ġ= ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( network Handler . isConnected ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Result . invoke ( run ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġnull Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Result . invoke ( Either . Left ( Failure . Network Connection )) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprotected Ġfun Ġget Failure ( response : ĠResult . Error ): ĠFailure Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( response . exception . code ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 1 Ġ-> ĠFailure . Account Mis Match Exception ( user Identifier ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror Body Ġ= ĠError Body () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Body . code Ġ= Ġresponse . response . code . toString () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Body . message Ġ= Ġresponse . response . message čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġresponse . exception . response ()?. error Body ()?. char Stream () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Body Ġ= ĠGson (). fromJson ( error , ĠError Body :: class . java ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure . ServerError ( response . exception . code (), Ġerror Body ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprotected Ġfun Ġget Failure Error ( errorCode : ĠInt , Ġresponse : ĠResponse Body ?): ĠFailure Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġerror Body Ġ= ĠError Body () čĊĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Body Ġ= ĠGson (). fromJson ( it . char Stream (), ĠError Body :: class . java ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠFailure . ServerError ( errorCode , Ġerror Body ) čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprotected Ġfun Ġget FailureException ( throwable : ĠThrowable ): ĠFailure Ġ{ čĊĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( throwable ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> ĠFailure . Network Exception čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Exception Ġ-> ĠFailure . Http Error ( throwable ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFailure . Un Known Exception ( throwable ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġclass ĠNone čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠCancel s Ġthis Ġjob Ġwith Ġan Ġoptional Ġcancellation Ġ[ cause ] čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġcancel UseCase () Ġ{ čĊĠĠĠĠĠĠĠ Ġjob ?. run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġis UseCase Completed (): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġjob ?. is Completed Ġ?: Ġtrue čĊĠĠĠ Ġ} čĊčĊč Ċ }