package Ġcom . s yle im an . my foot prints . business Layer . local Db Service . repositories Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . active android . Model Ċ Ċ import Ġcom . active android . query . Select Ċ import Ġcom . active android . util . SQLite Utils Ċ import Ġcom . s yle im an . my foot prints . common . Log Tags Ċ import Ġcom . s yle im an . my foot prints . business Layer . local Db Service . Transaction Wrapper Ċ import Ġcom . s yle im an . my foot prints . model Layer . dto . Sync Log Dto Ċ import Ġcom . s yle im an . my foot prints . model Layer . db Entities . Db Sync Log Data Ċ import Ġcom . s yle im an . my foot prints . model Layer . db Entities . Db Sync Log Header Ċ Ċ import Ġjava . sql . SQLException Ċ import Ġjava . util . ArrayList Ċ Ċ /** ĠRepository Ġfor Ġsync Ġlog Ġ Ġ*/ Ċ class ĠSync Log Repository Ġ: ĠIS ync Log Repository Internal , ĠIS ync Log Repository External Ċ { ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInsert Ġdata Ġfrom ĠD to ĊĠĠĠĠ Ġ* Ġ@ return Ġid Ġof Ġheader Ġrecord ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinsert Log Data ( dto : ĠSync Log Dto ): ĠLong ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader To Insert Ġ= ĠDb Sync Log Header ( dto ) ĊĠĠĠĠĠĠĠ Ġheader To Insert . save () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata To Insert Ġ= ĠDb Sync Log Data ( dto ) ĊĠĠĠĠĠĠĠ Ġdata To Insert . header Ġ= Ġheader To Insert ĊĠĠĠĠĠĠĠ Ġdata To Insert . save () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġheader To Insert . id !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġdata Ġrecord Ġfor Ġheader Ġrecord Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetData ( header Id : ĠLong ): ĠDb Sync Log Data Ġ= ĠSelect (). from ( Db Sync Log Data :: class . java ). where (" Sync Log Data Header Ġ= Ġ?", Ġheader Id ). execute Single < Db Sync Log Data >() ĊĊĠĠĠ Ġ/** ĠInsert Ġdata Ġinto Ġlog Ġ( internal Ġmethod , Ġexecuted Ġin Ġexternal Ġtransaction ) Ġ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġinsert ( dto : ĠSync Log Dto ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Log . d ( Log Tags . Sync , Ġdto . to Log String (" INPUT : Ġ")); ĊĠĠĠĠĠĠĠ Ġif Ġ( dto . operation Type Ġ== ĠSync Log Dto . Operation Create Ġ|| Ġdto . operation Type Ġ== ĠSync Log Dto . Operation Delete ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Id Ġ= Ġinsert Log Data ( dto ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Log Tags . SYNC _ PROCESS , Ġ" Insert Ġinput Ġlog Ġrecord . ĠId Ġis : Ġ" Ġ+ Ġheader Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġnot Ġprocessed Ġdata 's Ġheaders Ġfor Ġour Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Headers Ġ= ĠSelect (). from ( Db Sync Log Header :: class . java ). where (" Entity Uid Ġ= Ġ? ĠAND ĠIs Processing Ġ= Ġ?", Ġ* array Of ( dto . entity Uid , Ġ" 0 ")). orderBy (" id "). execute < Db Sync Log Header >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Data Ġ= Ġdb Headers . map Ġ{ ĠgetData ( it . id !! ) Ġ} ĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġdata Ġfor Ġheaders ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db Headers . size Ġ== Ġ 0 ) ĠĠĠĠĠĠĠ Ġ// ĠNo Ġdata Ġ- Ġno Ġmerge Ġneeded Ġ- Ġadd Ġrecord Ġto Ġsync Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Id Ġ= Ġinsert Log Data ( dto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Log Tags . SYNC _ PROCESS , Ġ" No Ġdata Ġto Ġmerge Ġ- Ġinsert Ġinput Ġlog Ġrecord . ĠId Ġis : Ġ" Ġ+ Ġheader Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata To Merge Ġ= ĠArrayList < Sync Log Dto >( db Headers . size Ġ+ Ġ 1 ) ĠĠĠĠĠĠĠĠ Ġ// ĠCreate ĠD TO s Ġfor Ġmerging ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Headers . indices . map To ( data To Merge ) Ġ{ ĠSync Log Dto ( db Headers [ it ], Ġdb Data [ it ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata To Merge . add ( dto ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSource Ġlist Ġfor Ġmerge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Log Tags . SYNC _ PROCESS , Ġ" Total Ġrecords Ġto Ġmerge : Ġ" Ġ+ Ġdata To Merge . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMer ging ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerge To Ġ= Ġdata To Merge [ 0 ] ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmerge Ġto Ġfirst Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d ( Log Tags . Sync , Ġmerge To . to Log String (" TARGET ĠREC ORD : Ġ")); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. data To Merge . size Ġ- Ġ 1 ) ĠĠĠĠĠ Ġ// ĠSkip Ġmerge To Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmergeFrom Ġ= Ġdata To Merge [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d ( Log Tags . Sync , ĠmergeFrom . to Log String (" RECORD ĠTO ĠMER GE : Ġ")); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin ĠmergeFrom . str Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge To . str Values . put ( key , Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin ĠmergeFrom . bin Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge To . bin Values . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġall Ġintermediate Ġrecords ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. data To Merge . size Ġ- Ġ 1 Ġ- Ġ 1 ) ĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġfirst Ġ( Merge To ) Ġand Ġlast Ġ(@ dto Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġdata To Merge [ i ]. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel . delete ( Db Sync Log Header :: class . java , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Log Tags . SYNC _ PROCESS , Ġ" Delete Ġmerged Ġrecord Ġwith Ġid : Ġ" Ġ+ Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġmerged Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d ( Log Tags . Sync , Ġmerge To . to Log String (" RESULT ĠIS : Ġ")); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader ToUpdate Ġ= Ġdb Headers [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ToUpdate . update Fields From Dto ( merge To ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ToUpdate . save () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata ToUpdate Ġ= Ġdb Data [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ToUpdate . update Fields From Dto ( merge To ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ToUpdate . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet ĠId Ġof Ġlog Ġrecords Ġto Ġprocess Ġ Ġ*/ ĊĠĠĠ Ġ@ Throws ( SQLException :: class ) ĊĠĠĠ Ġoverride Ġfun ĠgetData To Process (): ĠList < Long > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransaction Wrapper . process In Transaction < List < Long >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSQLite Utils . raw Query < Model >( Db Sync Log Header :: class . java , Ġ" UPDATE ĠSync Log Header ĠSET ĠIs Processing Ġ= Ġ?", ĠarrayOf (" 1 ")) ĠĠĠĠĠĠĠ Ġ// ĠSet Ġprocessing Ġflag Ġ- Ġwithout Ġcondition ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect (" id "). from ( Db Sync Log Header :: class . java ). orderBy (" id "). execute < Db Sync Log Header >(). map Ġ{ Ġit . id Ġ} ĠĠĠĠĠ Ġ// ĠGet Ġand Ġreturn Ġdata ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġlog Ġrecord Ġby ĠId ĊĠĠĠĠ Ġ* Ġ@ return Ġnull Ġif Ġrecord Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( SQLException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Record ( id : ĠLong ): ĠSync Log Dto ? Ġ= ĊĠĠĠĠĠĠĠ ĠTransaction Wrapper . process Without Transaction < Sync Log Dto ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelect (). from ( Db Sync Log Header :: class . java ). where (" id Ġ= Ġ?", Ġid ). execute Single < Db Sync Log Header >() ?. let { Sync Log Dto ( it , Ġthis . getData ( id ))} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemove Ġall Ġlocks Ġon Ġlog Ġrecords Ġ Ġ*/ ĊĠĠĠ Ġ@ Throws ( SQLException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġreset All Locks () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠTransaction Wrapper . process In Transaction Ġ{ ĠSQLite Utils . raw Query < Model >( Db Sync Log Header :: class . java , Ġ" UPDATE ĠSync Log Header ĠSET ĠIs Processing Ġ= Ġ?", ĠarrayOf (" 0 ")) Ġ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemove Ġlog Ġrecord Ġ Ġ*/ ĊĠĠĠ Ġ@ Throws ( SQLException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġremove Log Record ( id : ĠLong ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠTransaction Wrapper . process In Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . getData ( id ). delete () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel . delete ( Db Sync Log Header :: class . java , Ġid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }