/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 9 ĠDjango ĠC ass Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ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 Ġdev . cast ive . jmp . service Ċ Ċ import Ġdev . cast ive . jmp . component . Socket Handler Ċ import Ġdev . cast ive . jmp . data . F SA Ċ import Ġdev . cast ive . jmp . data . Fav icon Payload Ċ import Ġdev . cast ive . jmp . prop . App Metadata Props Ċ import Ġdev . cast ive . jmp . repo . Jump Repo Ċ import Ġdev . cast ive . log 2 . log d Ċ import Ġdev . cast ive . log 2 . lo ge Ċ import Ġdev . cast ive . log 2 . log i Ċ import Ġdev . cast ive . log 2 . log v Ċ import Ġdev . dc as . util . extend . is ES Null Or Blank Ċ import Ġdev . dc as . util . extend . safe Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . engine . apache . Apache Ċ import Ġio . ktor . client . request . get Ċ import Ġio . ktor . client . statement . HttpResponse Ċ import Ġio . ktor . utils . io . core . use Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . net . URI Ċ Ċ @ Service Ċ class ĠMetadata Service ( Ċ ĉ private Ġval Ġjump Repo : ĠJump Repo , Ċ ĉ private Ġval Ġmetadata Props : ĠApp Metadata Props , Ċ ĉ private Ġval Ġsocket Handler : ĠSocket Handler Ċ ) Ġ{ Ċ ĉ private Ġval Ġtag Title Ġ= Ġ"< title >" ĊĊ ĉ /** Ċĉ Ġ* ĠGet Ġa Ġnew ĠHttpClient Ċĉ Ġ* ĠThis Ġis Ġmostly Ġhere Ġfor Ġeasy Ġtest Ġmock ing Ċĉ Ġ*/ Ċ ĉ internal Ġfun ĠgetClient (): ĠHttpClient Ġ= ĠHttpClient ( Apache ) ĊĊ ĉ internal Ġfun Ġget Prob able Url ( address : ĠString ): ĠString Ġ{ Ċĉ ĉ return Ġkotlin . run Catch ing Ġ{ Ċĉĉ ĉ val Ġuri Ġ= ĠURI ( address ) Ċĉĉ ĉ " https ://${ uri . host }" Ċĉ ĉ }. on Failure Ġ{ Ċĉĉ ĉ " Failed Ġto Ġm angle Ġaddress : Ġ$ address ". lo ge ( java Class , Ġit ) Ċĉ ĉ }. get OrNull () Ġ?: Ġaddress Ċ ĉ } ĊĊ ĉ internal Ġsuspend Ġfun Ġget Title ( address : ĠString ): ĠString ? Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ val Ġhost Ġ= Ġget Prob able Url ( address ) Ċĉĉ ĉ val Ġcontent Ġ= ĠgetClient (). use Ġ{ Ċĉĉĉ ĉ it . get < String >( host ) Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( content . is ES Null Or Blank ()) Ġ{ Ċĉĉĉ ĉ " Got Ġnull Ġor Ġblank Ġdata Ġfor Ġaddress : Ġ$ host ". log i ( MetadataService :: class . java ) Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ val Ġstart Ġ= Ġcontent . indexOf ( tag Title ) Ġ+ Ġtag Title . length Ċĉĉ ĉ val Ġend Ġ= Ġcontent . indexOf ("</ title >", Ġstart ) Ċĉĉ ĉ val Ġtitle Ġ= Ġcontent . substring ( start , Ġend ) Ċĉĉ ĉ if Ġ( title . is ES Null Or Blank ()) Ġ{ Ċĉĉĉ ĉ " Got Ġnull Ġor Ġblank Ġtitle Ġfor Ġaddress : Ġ$ host ". log i ( MetadataService :: class . java ) Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ " Got Ġtitle Ġfor Ġaddress : Ġ$ address , Ġ$ title ". log d ( MetadataService :: class . java ) Ċĉĉ ĉ return Ġtitle Ċĉ ĉ } Ċĉ ĉ catch Ġ( e : ĠException ) Ġ{ Ċĉĉ ĉ " Failed Ġto Ġload Ġtitle Ġmetadata Ġfor Ġaddress : Ġ$ address ". lo ge ( MetadataService :: class . java , Ġe ) Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġupdate Title ( address : ĠString ): ĠString ? Ġ{ Ċĉ ĉ if Ġ(! metadata Props . title . enabled ) Ġ{ Ċĉĉ ĉ " Ref using Ġto Ġsc rape Ġtitle Ġmetadata : Ġe gress Ġis Ġdisabled ". log v ( MetadataService :: class . java ) Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċĉ ĉ if Ġ(! address . startsWith (" https :// ")) Ġ{ Ċĉĉ ĉ " Ref using Ġto Ġprocess Ġnon - HTTPS Ġdomain : Ġ$ address ". log i ( MetadataService :: class . java ) Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċĉ ĉ // Ġattempt Ġto Ġget Ġthe Ġtitle Ġor Ġsilently Ġreturn Ġ( this :: getTitle Ġdoes Ġthe Ġlogging ) Ċĉ ĉ val Ġtitle Ġ= Ġrun Blocking Ġ{ Ċĉĉ ĉ getTitle ( address ) Ċĉ ĉ } Ġ?: Ġreturn Ġnull Ċĉ ĉ // Ġupdate Ġall Ġthe Ġjumps Ġwhich Ġuse Ġthis Ġurl Ċĉ ĉ " Updating Ġjumps Ġwith Ġaddress : Ġ$ address Ġto Ġuse Ġnew Ġtitle : Ġ'$ title ' ". log d ( MetadataService :: class . java ) Ċĉ ĉ jump Repo . update Title With Address ( address , Ġtitle ) Ċĉ ĉ jump Repo . findAll By Location ( address ). forEach Ġ{ Ċĉĉ ĉ if Ġ( it . title Ġ== Ġnull Ġ|| Ġit . title Ġ!= Ġtitle ) Ġ{ Ċĉĉĉ ĉ " Updating Ġtitle Ġfor Ġ${ it . name }, Ġwas : Ġ${ it . title }, Ġnow : Ġ$ title ". log v ( MetadataService :: class . java ) Ċĉĉ ĉ } Ċĉĉ ĉ socket Handler . broadcast ( F SA ( F SA . EVENT _ UPDATE _ TITLE , ĠF av icon Payload ( it . id , Ġtitle ))) Ċĉ ĉ } Ċĉ ĉ return Ġtitle Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠW arms Ġthe Ġimage Ġservice Ċĉ Ġ*/ Ċ ĉ fun Ġwarm Icon Service ( address : ĠString ): ĠJob Ġ= ĠGlobal Scope . launch Ġ{ Ċĉ ĉ if (! metadata Props . icon . enabled ) Ġ{ Ċĉĉ ĉ " Ref using Ġto Ġsc rape Ġimage Ġmetadata : Ġe gress Ġis Ġdisabled ". log v ( MetadataService :: class . java ) Ċĉĉ ĉ return @ launch Ċĉ ĉ } Ċĉ ĉ if ( metadata Props . icon . url . is ES Null Or Blank ()) Ġ{ Ċĉĉ ĉ " Cannot Ġsc rape Ġimage Ġmetadata : Ġblank Ġor Ġnull Ġurl Ġset ". log v ( MetadataService :: class . java ) Ċĉĉ ĉ return @ launch Ċĉ ĉ } Ċĉ ĉ val Ġdest Url Ġ= Ġ"${ metadata Props . icon . url }/ icon ? site =${ address . safe () }" Ċĉ ĉ kotlin . run Catch ing Ġ{ Ċĉĉ ĉ getClient (). use Ġ{ Ċĉĉĉ ĉ val Ġresponse Ġ= Ġit . get < HttpResponse >( dest Url ) Ċĉĉĉ ĉ " Got Ġresponse Ġwhen Ġwarm ing Ġicon Ġservice : Ġ${ response . status . description }". log v ( java Class ) Ċĉĉ ĉ } Ċĉ ĉ }. on Failure Ġ{ Ċĉĉ ĉ " Ca ught Ġexception Ġwhen Ġwarm ing Ġicon Ġservice : Ġ$ address , Ġ$ dest Url ". lo ge ( MetadataService :: class . java , Ġit ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ