/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . google . android . fhir . impl Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . google . android . fhir . Fhir Engine Ċ import Ġcom . google . android . fhir . Sync Download Context Ċ import Ġcom . google . android . fhir . db . Database Ċ import Ġcom . google . android . fhir . db . Resource NotFoundException Ċ import Ġcom . google . android . fhir . db . impl . dao . Local Change Token Ċ import Ġcom . google . android . fhir . db . impl . dao . S qu ashed Local Change Ċ import Ġcom . google . android . fhir . db . impl . entities . Sync ed Resource Entity Ċ import Ġcom . google . android . fhir . resource . getResource Type Ċ import Ġcom . google . android . fhir . search . Search Ċ import Ġcom . google . android . fhir . search . count Ċ import Ġcom . google . android . fhir . search . execute Ċ import Ġcom . google . android . fhir . to TimeZone String Ċ import Ġorg . hl 7 . fhir . r 4 . model . Resource Ċ import Ġorg . hl 7 . fhir . r 4 . model . ResourceType Ċ Ċ /** ĠImplementation Ġof Ġ[ Fhir Engine ]. Ġ*/ Ċ internal Ġclass ĠF hir Engine Impl Ċ constructor ( private Ġval Ġdatabase : ĠDatabase , Ġprivate Ġval Ġcontext : ĠContext ) Ġ: ĠF hir Engine Ġ{ ĊĠ Ġoverride Ġsuspend Ġfun Ġ< R Ġ: ĠResource > Ġsave ( var arg Ġresource : ĠR ) Ġ{ ĊĠĠĠ Ġdatabase . insert (* resource ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< R Ġ: ĠResource > Ġupdate ( resource : ĠR ) Ġ{ ĊĠĠĠ Ġdatabase . update ( resource ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Resource NotFoundException :: class ) ĊĠ Ġoverride Ġsuspend Ġfun Ġ< R Ġ: ĠResource > Ġload ( clazz : ĠClass < R >, Ġid : ĠString ): ĠR Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġdatabase . select ( clazz , Ġid ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠResource NotFoundException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠResource NotFoundException ( getResource Type ( clazz ). name , Ġid , Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< R Ġ: ĠResource > Ġremove ( clazz : ĠClass < R >, Ġid : ĠString ) Ġ{ ĊĠĠĠ Ġdatabase . delete ( clazz , Ġid ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< R Ġ: ĠResource > Ġsearch ( search : ĠSearch ): ĠList < R > Ġ{ ĊĠĠĠ Ġreturn Ġsearch . execute ( database ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġcount ( search : ĠSearch ): ĠLong Ġ{ ĊĠĠĠ Ġreturn Ġsearch . count ( database ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġsync Download ( download : Ġsuspend Ġ( Sync Download Context ) Ġ-> ĠList < Resource >) Ġ{ ĊĠĠĠ Ġval Ġresources Ġ= ĊĠĠĠĠĠ Ġdownload ( ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠSync Download Context Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Latest Timestamp For ( type : ĠResource Type ) Ġ= Ġdatabase . last Update ( type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġtime Stamp s Ġ= ĊĠĠĠĠĠ Ġresources . groupBy Ġ{ Ġit . resourceType Ġ}. entries . map Ġ{ ĊĠĠĠĠĠĠĠ ĠSync ed Resource Entity ( it . key , Ġit . value . max Of Ġ{ Ġit . meta . last Updated Ġ}. to TimeZone String ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġdatabase . insert Sync ed Resources ( time Stamp s , Ġresources ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġsync Upload ( ĊĠĠĠ Ġupload : Ġ( suspend Ġ( List < S qu ashed Local Change >) Ġ-> ĠList < Local Change Token >) ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġvar Ġlocal Changes Ġ= Ġdatabase . getAll Local Changes () ĊĠĠĠ Ġwhile Ġ( local Changes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġupload ( local Changes ). forEach Ġ{ Ġdatabase . delete Updates ( it ) Ġ} ĊĠĠĠĠĠ Ġlocal Changes Ġ= Ġdatabase . getAll Local Changes () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ