/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠThe ĠHy ve Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . radar base . monitor . application Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . System Clock Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġorg . radar base . android . data . Data Cache Ċ import Ġorg . radar base . android . kafka . Server Status Listener Ċ import Ġorg . radar base . android . source . Abstract Source Manager Ċ import Ġorg . radar base . android . source . Source Service . Companion . CACHE _ RECORD S _ UN SENT _ NUMBER Ċ import Ġorg . radar base . android . source . Source Service . Companion . CACHE _ TOPIC Ċ import Ġorg . radar base . android . source . Source Service . Companion . SERVER _ RECORD S _ SENT _ NUMBER Ċ import Ġorg . radar base . android . source . Source Service . Companion . SERVER _ RECORD S _ SENT _ TOPIC Ċ import Ġorg . radar base . android . source . Source Service . Companion . SERVER _ STATUS _ CHANGED Ċ import Ġorg . radar base . android . source . Source Status Listener Ċ import Ġorg . radar base . android . util .* Ċ import Ġorg . radar base . monitor . application . Application Status Service . Companion . UPDATE _ RATE _ DEFAULT Ċ import Ġorg . rad arc ns . kafka . Observation Key Ċ import Ġorg . rad arc ns . monitor . application .* Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ import Ġkotlin . math . max Ċ Ċ class ĠApplication Status Manager ( ĊĠĠĠĠĠĠĠ Ġservice : ĠApplication Status Service Ċ ) Ġ: ĠAbstract Source Manager < Application Status Service , ĠApplication State >( service ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġserver Topic : ĠData Cache < Observation Key , ĠApplication Server Status > Ġ= Ġcreate Cache (" application _ server _ status ", ĠApplication Server Status ()) ĊĠĠĠ Ġprivate Ġval Ġrecord Counts Topic : ĠData Cache < Observation Key , ĠApplication Record Counts > Ġ= Ġcreate Cache (" application _ record _ counts ", ĠApplication Record Counts ()) ĊĠĠĠ Ġprivate Ġval Ġu ptime Topic : ĠData Cache < Observation Key , ĠApplication U ptime > Ġ= Ġcreate Cache (" application _ uptime ", ĠApplication U ptime ()) ĊĠĠĠ Ġprivate Ġval Ġn tp Topic : ĠData Cache < Observation Key , ĠApplication External Time > Ġ= Ġcreate Cache (" application _ external _ time ", ĠApplication External Time ()) ĊĠĠĠ Ġprivate Ġval Ġtime Zone Topic : ĠData Cache < Observation Key , ĠApplication TimeZone > Ġ= Ġcreate Cache (" application _ time _ zone ", ĠApplication TimeZone ()) ĊĠĠĠ Ġprivate Ġval Ġdevice Info Topic : ĠData Cache < Observation Key , ĠApplication DeviceInfo > Ġ= Ġcreate Cache (" application _ device _ info ", ĠApplication DeviceInfo ()) ĊĊĠĠĠ Ġprivate Ġval Ġprocessor : ĠOff line Processor ĊĠĠĠ Ġprivate Ġval Ġcreation TimeStamp : ĠLong Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠ Ġprivate Ġval Ġsn tp Client : ĠSn tp Client Ġ= ĠSn tp Client () ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠSharedPreferences Ġ= Ġservice . get SharedPreferences ( Application Status Manager :: class . java . name , ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġprivate Ġvar Ġtz Processor : ĠOff line Processor ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ get : Synchron ized ĊĠĠĠ Ġ@ set : Synchron ized ĊĠĠĠ Ġvar Ġis Processing Ip : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ get : Synchron ized ĊĠĠĠ Ġ@ set : Synchron ized ĊĠĠĠ Ġvar Ġn tp Server : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ?. take Trim med If NotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġprevious Inet Address : ĠInet Address ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtz Offset Cache : ĠChange Runner < Int > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Info Cache : ĠChange Runner < Application Info > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver Status Receiver : ĠBroadcast Registration ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver Records Receiver : ĠBroadcast Registration ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcache Receiver : ĠBroadcast Registration ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġservice . getString ( R . string . application Service DisplayName ) ĊĠĠĠĠĠĠĠ Ġthis . processor Ġ= ĠOff line Processor ( service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: process Server Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: process U ptime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: process Records Sent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: process Reference Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: process DeviceInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code Ġ= ĠAP PLICATION _ PROCESS OR _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Name Ġ= ĠAP PLICATION _ PROCESS OR _ REQUEST _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterval ( UPDATE _ RATE _ DEFAULT , ĠSE CON DS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwake Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( accept able Ids : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠSource Status Listener . Status . READY ĊĊĠĠĠĠĠĠĠ Ġprocessor . start Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġos Version Code : ĠInt Ġ= Ġthis . prefs . getInt (" operating System Version Code ", Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Version Code : ĠInt Ġ= Ġthis . prefs . getInt (" app Version Code ", Ġ- 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info Cache Ġ= ĠChange Runner ( Application Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prefs . getString (" manufacturer ", Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prefs . getString (" model ", Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prefs . getString (" operating System Version ", Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( os Version Code Ġ> Ġ 0 ) Ġos Version Code Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prefs . getString (" app Version ", Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Version Code Ġ> Ġ 0 ) Ġapp Version Code Ġelse Ġnull )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Info Ġ= Ġcurrent Application Info ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( name Ġ= Ġ" p R MT ", Ġattributes Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" manufacturer ", Ġdevice Info . manufacturer Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" model ", Ġdevice Info . model Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" operating System ", ĠOperating System . ANDROID . toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" operating System Version ", Ġdevice Info . os Version Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" app Version ", Ġdevice Info . app Version Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" app Version Code ", Ġdevice Info . app Version Code ?. toString () Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" appName ", Ġservice . application . packageName ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tz Offset Cache Ġ= ĠChange Runner ( this . prefs . getInt (" time Zone Offset ", Ġ- 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtz Processor ?. start () ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Starting ĠApplication Status Manager ") ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( service ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Status Receiver Ġ= Ġregister ( SERVER _ STATUS _ CHANGED ) Ġ{ Ġ_, Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . server Status Ġ= ĠServer Status Listener . Status . values ()[ intent . getInt Extra ( SERVER _ STATUS _ CHANGED , Ġ 0 )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Records Receiver Ġ= Ġregister ( SERVER _ RECORD S _ SENT _ TOPIC ) Ġ{ Ġ_, Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Records Sent Ġ= Ġintent . getLong Extra ( SERVER _ RECORD S _ SENT _ NUMBER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add Records Sent ( max ( numberOf Records Sent , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Receiver Ġ= Ġregister ( CACHE _ TOPIC ) Ġ{ Ġ_, Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtopic Ġ= Ġintent . getString Extra ( CACHE _ TOPIC ) Ġ?: Ġreturn @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġintent . getLong Extra ( CACHE _ RECORD S _ UN SENT _ NUMBER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . cached Records [ topic ] Ġ= Ġmax ( records , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠSource Status Listener . Status . CONNECTED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcurrent Application Info : ĠApplication Info ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Info Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . package Manager . get Package Info ( service . packageName , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġfind Ġpackage Ġinfo Ġfor Ġp R MT Ġapp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApplication Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MAN U FACT UR ER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MODEL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . RELEASE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Info ?. version Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Info ?. version Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġusing Ġversion Code ĊĠĠĠ Ġprivate Ġfun Ġprocess DeviceInfo () Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice Info Cache . apply If Changed ( current Application Info ) Ġ{ Ġdevice Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( device Info Topic , ĠApplication DeviceInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . manufacturer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperating System . ANDROID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . os Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . os Version Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . app Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Info . app Version Code )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString (" manufacturer ", Ġdevice Info . manufacturer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString (" model ", Ġdevice Info . model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString (" operating System Version ", Ġdevice Info . os Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int (" operating System Version Code ", Ġdevice Info . os Version Code Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString (" app Version ", Ġdevice Info . app Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int (" app Version Code ", Ġdevice Info . app Version Code Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Reference Time () Ġ{ ĊĠĠĠĠĠĠĠ Ġn tp Server ?. let Ġ{ Ġserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sn tp Client . request Time ( server , Ġ 5 0 0 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġsn tp Client . round Trip Time Ġ/ Ġ 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠcurrentTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn tp Time Ġ= Ġ( sn tp Client . ntp Time Ġ+ ĠSystem Clock . elapsed Realtime () Ġ- Ġsn tp Client . ntp Time Reference ) Ġ/ Ġ 1 0 0 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( ntp Topic , ĠApplication External Time ( time , Ġn tp Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver , ĠExternal Time Protocol . SN TP , Ġdelay )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Server Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠcurrentTime ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus : ĠServer Status Ġ= Ġwhen Ġ( state . server Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer Status Listener . Status . CONNECTED , ĠServer Status Listener . Status . READY , ĠServer Status Listener . Status . UPLOAD ING Ġ-> ĠServer Status . CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer Status Listener . Status . DIS CONNECTED , ĠServer Status Listener . Status . DISABLED , ĠServer Status Listener . Status . UPLOAD ING _ FAILED Ġ-> ĠServer Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠServer Status . UNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġip Address Ġ= Ġif Ġ( is Processing Ip ) Ġlookup IpAddress () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġlogger . info (" Server ĠStatus : Ġ{}; ĠDevice ĠIP : Ġ{}", Ġstatus , Ġip Address ) ĊĊĠĠĠĠĠĠĠ Ġsend ( server Topic , ĠApplication Server Status ( time , Ġstatus , Ġip Address )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFind ĠIp Ġvia ĠNetwork Interfaces . ĠWorks Ġvia Ġwifi , Ġe thernet Ġand Ġmobile Ġnetwork ĊĠĠĠ Ġ// ĠThis Ġfinds Ġboth Ġxx . xx . xx Ġip Ġand Ġrm net . ĠLast Ġone Ġis Ġalways Ġip . ĊĠĠĠ Ġprivate Ġfun Ġlookup IpAddress (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġprevious Inet Address Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Inet Address ?. take Unless Ġ{ ĠNetwork Interface . getBy Inet Address ( it ) Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠNetwork Interface . get Network Interfaces (). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . inet Addresses . as Sequence () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Last Ġ{ Ġ! it . is Loop back Address Ġ&& Ġ! it . is Link Local Address Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" No ĠIP ĠAddress Ġcould Ġbe Ġdetermined ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprevious Inet Address ?. host Address ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess U ptime () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠcurrentTime ĊĠĠĠĠĠĠĠ Ġval Ġu ptime Ġ= Ġ( System Clock . elapsed Realtime () Ġ- Ġcreation TimeStamp ) Ġ/ Ġ 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġsend ( uptime Topic , ĠApplication U ptime ( time , Ġu ptime )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Records Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠcurrentTime ĊĊĠĠĠĠĠĠĠ Ġvar Ġrecords Cached Un sent Ġ= Ġstate . cached Records . values . sum (). toInt C apped () ĊĠĠĠĠĠĠĠ Ġval Ġrecords Cached Sent Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( records Ġin Ġstate . cached Records . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( records Ġ!= ĠNUMBER _ UNKNOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Cached Un sent Ġ+= Ġrecords . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrecords Cached Ġ= Ġrecords Cached Un sent Ġ+ Ġrecords Cached Sent ĊĠĠĠĠĠĠĠ Ġval Ġrecords Sent Ġ= Ġstate . records Sent ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Number Ġof Ġrecords : Ġ{ sent : Ġ{}, Ġun sent : Ġ{}, Ġcached : Ġ{}} ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Sent , Ġrecords Cached Un sent , Ġrecords Cached ) ĊĠĠĠĠĠĠĠ Ġsend ( record Counts Topic , ĠApplication Record Counts ( time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Cached , Ġrecords Sent , Ġrecords Cached Un sent )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClose () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . processor . close () ĊĠĠĠĠĠĠĠ Ġcache Receiver . unregister () ĊĠĠĠĠĠĠĠ Ġserver Records Receiver . unregister () ĊĠĠĠĠĠĠĠ Ġserver Status Receiver . unregister () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtz Ġ= ĠTime Zone . getDefault () ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġtz Offset Cache . apply If Changed ( tz . get Offset ( now ) Ġ/ Ġ 1 0 0 0 ) Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( time Zone Topic , ĠApplication TimeZone ( now Ġ/ Ġ 1 0 0 0 . 0 , Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int (" time Zone Offset ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġset Tz Update Rate ( tz Update Rate : ĠLong , Ġunit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tz Update Rate Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġthis . tz Processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( processor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tz Processor Ġ= ĠOff line Processor ( service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Ġ= ĠlistOf ( this @ Application Status Manager :: process TimeZone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code Ġ= ĠAP PLICATION _ TZ _ PROCESS OR _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Name Ġ= ĠAP PLICATION _ TZ _ PROCESS OR _ REQUEST _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterval ( tz Update Rate , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwake Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . state . status Ġ== ĠSource Status Listener . Status . CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . interval ( tz Update Rate , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tz Processor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tz Processor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Application Status Update Rate ( period : ĠLong , Ġunit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . interval ( period , Ġunit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠApplication Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanufacturer : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġos Version : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġos Version Code : ĠInt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Version : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Version Code : ĠInt ?) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Application Status Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNUMBER _ UNKNOWN Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAP PLICATION _ PROCESS OR _ REQUEST _ CODE Ġ= Ġ 7 2 5 5 3 5 7 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAP PLICATION _ TZ _ PROCESS OR _ REQUEST _ CODE Ġ= Ġ 7 2 5 5 3 5 7 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAP PLICATION _ PROCESS OR _ REQUEST _ NAME Ġ= Ġ" org . radar base . monitor . application . Application Status Manager " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAP PLICATION _ TZ _ PROCESS OR _ REQUEST _ NAME Ġ= Ġ"$ APPLICATION _ PROCESS OR _ REQUEST _ NAME . time Zone " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠLong . toInt C apped (): ĠInt Ġ= Ġif Ġ( this Ġ<= ĠInt . MAX _ VALUE ) Ġto Int () Ġelse ĠInt . MAX _ VALUE ĊĠĠĠ Ġ} Ċ } Ċ