package Ġdev . f rit z 2 . repository . rest Ċ Ċ import Ġdev . f rit z 2 . remote . Request Ċ import Ġdev . f rit z 2 . remote . Response Ċ import Ġdev . f rit z 2 . remote . http Ċ import Ġdev . f rit z 2 . repository . Entity Repository Ċ import Ġdev . f rit z 2 . repository . Query Repository Ċ import Ġdev . f rit z 2 . repository . Resource Ċ import Ġdev . f rit z 2 . repository . Resource NotFoundException ĊĊ Ċ /** Ċ Ġ* Ġprovides ĠCRUD - functions Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġurl Ġbase - url Ġof Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ*/ Ċ fun Ġ< T , ĠI > Ġrest Entity Of ( ĊĠĠĠ Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġinitial Id : ĠI , ĊĠĠĠ ĠcontentType : ĠString Ġ= Ġ" application / json ; Ġcharset = utf - 8 " Ċ ): ĠEntity Repository < T , ĠI > Ġ= ĊĠĠĠ ĠRest Entity ( resource , Ġinitial Id , ĠcontentType , Ġhttp ( url )) Ċ Ċ /** Ċ Ġ* Ġprovides Ġcr ud - functions Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġremote Ġbase Ġ[ Request ] Ġto Ġbe Ġused Ġby Ġall Ġsubsequent Ġrequests . ĠUse Ġit Ġto Ġconfigure Ġauthentication , Ġetc . Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ*/ Ċ fun Ġ< T , ĠI > Ġrest Entity Of ( ĊĠĠĠ Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġremote : ĠRequest , ĊĠĠĠ Ġinitial Id : ĠI , ĊĠĠĠ ĠcontentType : ĠString Ġ= Ġ" application / json ; Ġcharset = utf - 8 " Ċ ): ĠEntity Repository < T , ĠI > Ġ= ĊĠĠĠ ĠRest Entity ( resource , Ġinitial Id , ĠcontentType , Ġremote ) Ċ Ċ /** Ċ Ġ* Ġprovides Ġcr ud - functions Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġremote Ġbase Ġ[ Request ] Ġto Ġbe Ġused Ġby Ġall Ġsubsequent Ġrequests . ĠUse Ġit Ġto Ġconfigure Ġauthentication , Ġetc . Ċ Ġ*/ Ċ class ĠRest Entity < T , ĠI >( ĊĠĠĠ Ġprivate Ġval Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġval Ġinitial Id : ĠI , ĊĠĠĠ Ġval ĠcontentType : ĠString , ĊĠĠĠ Ġprivate Ġval Ġremote : ĠRequest Ċ ) Ġ: ĠEntity Repository < T , ĠI > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġloads Ġan Ġentity Ġby Ġa Ġget Ġrequest Ġto Ġ[ resource ] /{ id } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġof Ġthe Ġentity Ġto Ġload ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġentity Ġ( ident ified Ġby Ġ[ id ]) Ġloaded ĊĠĠĠĠ Ġ* Ġ@ throws ĠResource NotFoundException Ġwhen Ġresource Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( id : ĠI ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . deserialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote . accept ( contentType ). get ( resource . serialize Id ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResource NotFoundException ( resource . serialize Id ( id ), Ġthrowable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsends Ġa Ġpost -( for Ġadd ) Ġor Ġa Ġput -( for Ġupdate ) Ġrequest Ġto Ġ[ remote ] /{ id } ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġserialized Ġentity Ġin Ġit 's Ġbody . ĊĠĠĠĠ Ġ* ĠThe Ġ[ initial Id ] Ġis Ġused Ġto Ġdetermine Ġif Ġit Ġshould Ġadd Ġor Ġupdated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġsave ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġadded Ġor Ġsaved Ġentity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd OrUpdate ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġremote . contentType ( contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( resource . serialize ( entity )). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource . id Provider ( entity ) Ġ== Ġinitial Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . deserialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( contentType ). post (). body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( resource . serialize Id ( resource . id Provider ( entity ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġan Ġentity Ġby Ġa Ġdelete - request Ġto Ġ[ resource ]. url /{ id } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġempty Entity Ġdefined Ġat Ġ[ resource ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entity : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremote . delete ( resource . serialize Id ( resource . id Provider ( entity ))) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* Ġprovides Ġservices Ġto Ġdeal Ġwith Ġqueries Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġurl Ġbase - url Ġof Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġbuild Query Ġfunction Ġto Ġbuild Ġa Ġ[ Request ] Ġfor Ġa Ġgiven Ġobject Ġdefining Ġthe Ġquery Ċ Ġ*/ Ċ fun Ġ< T , ĠI , ĠQ > Ġrest Query Of ( ĊĠĠĠ Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġinitial Id : ĠI , ĊĠĠĠ ĠcontentType : ĠString Ġ= Ġ" application / json ; Ġcharset = utf - 8 ", ĊĠĠĠ Ġbuild Query : Ġsuspend ĠRequest .( Q ) Ġ-> ĠResponse Ġ= Ġ{ Ġaccept ( contentType ). get () Ġ} Ċ ): ĠQuery Repository < T , ĠI , ĠQ > Ġ= ĠRest Query ( resource , Ġinitial Id , ĠcontentType , Ġhttp ( url ), Ġbuild Query ) Ċ Ċ /** Ċ Ġ* Ġprovides Ġservices Ġto Ġdeal Ġwith Ġqueries Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġremote Ġbase Ġ[ Request ] Ġto Ġbe Ġused Ġby Ġall Ġsubsequent Ġrequests . ĠUse Ġit Ġto Ġconfigure Ġauthentication , Ġetc . Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġbuild Query Ġfunction Ġto Ġbuild Ġa Ġ[ Request ] Ġfor Ġa Ġgiven Ġobject Ġdefining Ġthe Ġquery Ċ Ġ*/ Ċ fun Ġ< T , ĠI , ĠQ > Ġrest Query Of ( ĊĠĠĠ Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġremote : ĠRequest , ĊĠĠĠ Ġinitial Id : ĠI , ĊĠĠĠ ĠcontentType : ĠString Ġ= Ġ" application / json ; Ġcharset = utf - 8 ", ĊĠĠĠ Ġbuild Query : Ġsuspend ĠRequest .( Q ) Ġ-> ĠResponse Ġ= Ġ{ Ġaccept ( contentType ). get () Ġ} Ċ ): ĠQuery Repository < T , ĠI , ĠQ > Ġ= ĠRest Query ( resource , Ġinitial Id , ĠcontentType , Ġremote , Ġbuild Query ) Ċ Ċ /** Ċ Ġ* Ġprovides Ġservices Ġto Ġdeal Ġwith Ġqueries Ġfor ĠREST - API Ġto Ġa Ġdefined Ġ[ Resource ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ċ Ġ* Ġ@ param Ġinitial Id Ġid Ġto Ġcompare Ġa Ġgiven Ġresource Ġfor Ġdifferent iation Ġof Ġadding Ġor Ġupdating Ċ Ġ* Ġ@ param ĠcontentType Ġto Ġbe Ġused Ġby Ġthe ĠREST - API Ċ Ġ* Ġ@ param Ġremote Ġbase Ġ[ Request ] Ġto Ġbe Ġused Ġby Ġall Ġsubsequent Ġrequests . ĠUse Ġit Ġto Ġconfigure Ġauthentication , Ġetc . Ċ Ġ* Ġ@ param Ġbuild Query Ġfunction Ġto Ġbuild Ġa Ġ[ Request ] Ġfor Ġa Ġgiven Ġobject Ġdefining Ġthe Ġquery Ċ Ġ*/ Ċ class ĠRest Query < T , ĠI , ĠQ >( ĊĠĠĠ Ġprivate Ġval Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġval Ġinitial Id : ĠI , ĊĠĠĠ Ġval ĠcontentType : ĠString , ĊĠĠĠ Ġprivate Ġval Ġremote : ĠRequest , ĊĠĠĠ Ġprivate Ġinline Ġval Ġbuild Query : Ġsuspend ĠRequest .( Q ) Ġ-> ĠResponse Ċ ) Ġ: ĠQuery Repository < T , ĠI , ĠQ > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġqueries Ġthe Ġresource Ġby Ġsending Ġthe Ġrequest Ġwhich Ġis Ġbuild Ġby Ġ[ build Query ] Ġusing Ġthe Ġ[ query ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġobject Ġdefining Ġthe Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġof Ġthe Ġquery ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġquery ( query : ĠQ ): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġresource . deserialize List ( remote . build Query ( query ). body ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġupdates Ġgiven Ġentities Ġin Ġthe Ġ[ entities ] Ġlist ĊĠĠĠĠ Ġ* Ġ( sending Ġa Ġput - request Ġto Ġthe Ġbase - url Ġof Ġthe Ġ[ resource ] Ġfor Ġevery Ġupdated Ġentity ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġcurrent Ġlist ĊĠĠĠĠ Ġ* Ġ@ param Ġentities ToUpdate Ġentities Ġwhich Ġgetting Ġupdated ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Many ( entities : ĠList < T >, Ġentities ToUpdate : ĠList < T >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġremote . contentType ( contentType ) ĊĠĠĠĠĠĠĠ Ġval Ġupdated : ĠMap < I , ĠT > Ġ= Ġ( entities Ġ+ Ġentities ToUpdate ). groupBy Ġ{ Ġresource . id Provider ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit . size Ġ> Ġ 1 Ġ}. map Values Ġ{ Ġ( id , Ġentities ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentities . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body ( resource . serialize ( entity )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( resource . serialize Id ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . map Ġ{ Ġupdated [ resource . id Provider ( it )] Ġ?: Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsends Ġa Ġpost -( for Ġadd ) Ġor Ġa Ġput -( for Ġupdate ) Ġrequest Ġto Ġ[ remote ] /{ id } ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġserialized Ġentity Ġin Ġit 's Ġbody . ĠThe Ġ[ initial Id ] Ġis Ġused Ġto ĊĠĠĠĠ Ġ* Ġdetermine Ġif Ġit Ġshould Ġsaved Ġor Ġupdated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġentity Ġlist ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġadd Ġor Ġupdate ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġadd Ġor Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd OrUpdate ( entities : ĠList < T >, Ġentity : ĠT ): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġremote . contentType ( contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( resource . serialize ( entity )). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource . id Provider ( entity ) Ġ== Ġinitial Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities Ġ+ Ġresource . deserialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( contentType ). post (). body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( resource . serialize Id ( resource . id Provider ( entity ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities . map Ġ{ Ġif ( resource . id Provider ( it ) Ġ== Ġresource . id Provider ( entity )) Ġentity Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdelete ById ( id : ĠI ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremote . delete ( resource . serialize Id ( id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġone Ġentity Ġfrom Ġthe Ġlist ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġlist Ġbefore Ġdeletion ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġidentifies Ġthe Ġentity Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġdeletion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entities : ĠList < T >, Ġid : ĠI ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete ById ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . filter Not Ġ{ Ġresource . id Provider ( it ) Ġ== Ġid Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġmultiple Ġentities Ġfrom Ġthe Ġlist ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġlist Ġbefore Ġdeletion ĊĠĠĠĠ Ġ* Ġ@ param Ġids Ġidentifies Ġthe Ġentities Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġdeletion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entities : ĠList < T >, Ġids : ĠList < I >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġids . forEach Ġ{ Ġdelete ById ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . filter Not Ġ{ Ġids . contains ( resource . id Provider ( it )) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ