package Ġcom . t ng tech . demo . weather . resources . weather Ċ Ċ import Ġcom . merc ate o . common . rest . sche mag en . types . With Id Ċ import Ġcom . t ng tech . demo . weather . domain . Station Ċ import Ġcom . t ng tech . demo . weather . domain . gis . Point Ċ import Ġcom . t ng tech . demo . weather . domain . measurement . At mo spher ic Data Ċ import Ġcom . t ng tech . demo . weather . lib . Event Counter Ċ import Ġcom . t ng tech . demo . weather . lib . Geo Calcul ations Ċ import Ġcom . t ng tech . demo . weather . lib . Timestamp Factory Ċ import Ġcom . t ng tech . demo . weather . repositories . Station Repository Ċ import Ġcom . t ng tech . demo . weather . repositories . Weather Data Repository Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util .* Ċ Ċ @ Component Ċ class ĠWeather Controller ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstation Repository : ĠStation Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġweather Data Repository : ĠWeather Data Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtimestamp Factory : ĠTimestamp Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrequest Frequency : ĠEvent Counter < UUID >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġradius Frequency : ĠEvent Counter < Double >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgeo Calcul ations : ĠGeo Calcul ations Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġstatistics : ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put (" datas ize ", Ġcount Of Data Updated Since AD ay Ago ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put (" station _ freq ", Ġstation Fr actions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put (" radius _ freq ", Ġradius Histogram ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcount Of Data Updated Since AD ay Ago : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Day Ago Ġ= Ġtimestamp Factory . current Timestamp Ġ- ĠMIL LI SECONDS _ PER _ DAY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġweather Data Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. weather Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count Ġ{ Ġdata Ġ-> Ġdata . last UpdateTime Ġ> Ġone Day Ago Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstation Fr actions : ĠMap < UUID , ĠDouble > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfreq Ġ= ĠHashMap < UUID , ĠDouble >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstation Repository . stations . map Ġ{ Ġstation Ġ-> Ġstation . id Ġ}. forEach Ġ{ Ġstation Id Ġ-> Ġfreq . put ( station Id , Ġrequest Frequency . fraction Of ( station Id )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfreq ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġradius Histogram : ĠArray < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Range Ġ= Ġradius Frequency . events . max () Ġ?: Ġ 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Size Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Count Ġ= ĠMath . ceil ( max Range Ġ/ Ġbin Size Ġ+ Ġ 1 ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhist Ġ= Ġ( 1 .. bin Count ). map Ġ{ Ġ 0 Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Frequency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġtuple Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġtuple ._ 1 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Index Ġ= Ġradius !!. toInt () Ġ/ Ġ 1 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Frequency Ġ= Ġtuple ._ 2 (). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhist [ bin Index ] Ġ+= Ġradius Frequency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhist ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġthe Ġmost Ġup Ġto Ġdate Ġat mo spher ic Ġinformation Ġfrom Ġthe Ġgiven Ġstation Id Ġand Ġother Ġair ports Ġin Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġradius . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstation Id Ġthe Ġthree Ġletter Ġstation Id Ġcode ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠĠĠ Ġthe Ġradius , Ġin Ġkm , Ġfrom Ġwhich Ġto Ġcollect Ġweather Ġdata ĊĠĠĠĠ Ġ* Ġ@ return Ġan ĠHTTP ĠResponse Ġand Ġa Ġlist Ġof Ġ[ At mo spher ic Data ] Ġfrom Ġthe Ġrequested Ġstation Id Ġand ĊĠĠĠĠ Ġ* Ġair ports Ġin Ġthe Ġgiven Ġradius ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery Weather ( station Id : ĠUUID , Ġradius : ĠDouble ?): ĠList < At mo spher ic Data > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġupdate Request Frequency ( station Id , Ġradius ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( radius Ġ== Ġ 0 . 0 Ġ|| Ġradius Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather Data Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Weather Data For ( station Id )?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstation Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Station ById ( station Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġcenter Station Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap : ĠList < UUID > Ġ= Ġstation Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġother Station Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeo Calcul ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. calculate Distance ( other Station .` object `, Ġcenter Station .` object `) Ġ<= Ġradius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġstation Ġ-> Ġstation . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . flatMap Ġ{ Ġweather Data Repository . get Weather Data For ( it )?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: Ġempty List () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Weather ( location : ĠPoint , Ġradius : ĠDouble ?): ĠList < At mo spher ic Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Request Frequency ( station Id : ĠUUID , Ġradius : ĠDouble ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstation ById : ĠWith Id < Station >? Ġ= Ġstation Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Station ById ( station Id ) ĊĠĠĠĠĠĠĠ Ġstation ById ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġstation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Frequency . increment ( station . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( radius Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Frequency . increment ( radius ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMIL LI SECONDS _ PER _ DAY Ġ= Ġ 8 6 4 0 0 0 0 0 ĊĠĠĠ Ġ} Ċ } Ċ