/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠJ oh ann es ĠDon ath Ġ< jo h ann es d @ torch mind . com > Ċ Ġ* Ġand Ġother Ġcopyright Ġowners Ġas Ġdocumented Ġin Ġthe Ġproject 's ĠIP Ġlog . Ċ Ġ* Ċ Ġ* Ġ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 Ġtv . dot start . beacon . ui Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . parameters . options .* Ċ import Ġjavafx . application . Application Ċ import Ġjavafx . application . Platform Ċ import Ġorg . apache . logging . log 4 j . Level Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . k oin . core . context . start K oin Ċ import Ġorg . k oin . core . qual ifier . named Ċ import Ġorg . k oin . dsl . module Ċ import Ġtv . dot start . beacon . core . cache . Cache Provider Ċ import Ġtv . dot start . beacon . core . cache . No op Cache Provider Ċ import Ġtv . dot start . beacon . core . cache . filesystem . FileSystem Cache Ċ import Ġtv . dot start . beacon . core . cache . filesystem . path . M urm ur 3 Path Provider Ċ import Ġtv . dot start . beacon . core . util . Banner Ċ import Ġtv . dot start . beacon . core . util . Operating System Ċ import Ġtv . dot start . beacon . core . version . Version Ċ import Ġtv . dot start . beacon . core . version . update . GitHub Update Provider Ċ import Ġtv . dot start . beacon . core . version . update . Update Provider Ċ import Ġtv . dot start . beacon . github . GitHub Ċ import Ġtv . dot start . beacon . ui . config . Configuration Ċ import Ġtv . dot start . beacon . ui . config . config Module Ċ import Ġtv . dot start . beacon . ui . ex posure . ex posure Module Ċ import Ġtv . dot start . beacon . ui . preload . Loader Ċ import Ġtv . dot start . beacon . ui . preload . Pre loader Ċ import Ġtv . dot start . beacon . ui . preload . Update Check Loader Ċ import Ġtv . dot start . beacon . ui . repository . repository Module Ċ import Ġtv . dot start . beacon . ui . tray . tray Module Ċ import Ġtv . dot start . beacon . ui . util . Localization Ċ import Ġtv . dot start . beacon . ui . util . configure Log Storage Ċ import Ġtv . dot start . beacon . ui . util . detailed Error Dialog Ċ import Ġtv . dot start . beacon . ui . util . root Level Ċ import Ġjava . net . URI Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Duration Ċ import Ġjavax . swing . JOptionPane Ċ import Ġkotlin . system . exit Process ĊĊ Ċ /** Ċ Ġ* ĠProvides Ġa ĠCLI Ġentry Ġpoint Ġwhich Ġpermit s Ġthe Ġcustomization Ġof Ġapplication Ġparameters . Ċ Ġ*/ Ċ object ĠBe acon Cli Ġ: ĠCli kt Command ( name Ġ= Ġ" Beacon ") Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDefines Ġa Ġlisting Ġof Ġdefault Ġsystem Ġrepositories Ġwhich Ġare Ġqueried Ġwhen Ġno Ġcustom Ġoverrides Ġare ĊĠĠ Ġ* Ġgiven . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġdefault System Repositories Ġ= ĠlistOf ( ĊĠĠĠ ĠURI . create (" github :// dot Start / Beacon # ind ie . dat "), ĊĠĠĠ ĠURI . create (" github :// dot Start / Beacon # steam . dat "), ĊĠĠĠ ĠURI . create (" github :// dot Start / Beacon # tools . dat ") ĊĠ Ġ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSpecifies Ġa Ġlisting Ġof Ġsystem Ġrepositories Ġwhich Ġare Ġto Ġbe Ġqueried . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġvalue Ġis Ġtypically Ġhardcoded Ġbut Ġmay Ġbe Ġoverridden Ġfor Ġdevelopment Ġpurposes Ġ( e . g . Ġto Ġtest ĊĠĠ Ġ* Ġan Ġun published Ġsystem Ġrepository ). ĊĠĠ Ġ*/ ĊĠ Ġval Ġsystem Repositories : ĠList < URI > Ġby Ġoption ( ĊĠĠĠ Ġnames Ġ= ĠarrayOf ("-- repository ", Ġ"- r "), ĊĠĠĠ Ġhelp Ġ= Ġ" Specifies Ġa Ġcustom Ġsystem Ġrepository Ġ( Overrides Ġany Ġdefault Ġsystem Ġrepositories )" ĊĠ Ġ) ĊĠĠĠ Ġ. convert Ġ{ ĠURI . create ( it ) Ġ} ĊĠĠĠ Ġ. multiple ( default System Repositories ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWhen Ġenabled , Ġthis Ġflag Ġcauses Ġall Ġcache Ġchecks Ġto Ġfail Ġ( e . g . Ġfiles Ġsuch Ġas Ġrepositories Ġand ĊĠĠ Ġ* Ġicons Ġwill Ġbe Ġre loaded Ġimmediately ). ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġdisable Cache : ĠBoolean Ġby Ġoption ( ĊĠĠĠ Ġ"-- disable - cache ", ĊĠĠĠ Ġhelp Ġ= Ġ" Dis ables Ġall Ġcaching Ġmeasures " ĊĠ Ġ) ĊĠĠĠ Ġ. flag () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDefines Ġthe Ġminimum Ġamount Ġof Ġtime Ġthat Ġhas Ġto Ġpass Ġbetween Ġrepository Ġcache Ġref res hes . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġcache Duration : ĠDuration Ġby Ġoption ( ĊĠĠĠ Ġ"-- cache - duration ", ĊĠĠĠ Ġhelp Ġ= Ġ" Specifies Ġthe Ġduration Ġfor Ġwhich Ġrepositories Ġwill Ġbe Ġcached Ġlocally " ĊĠ Ġ) ĊĠĠĠ Ġ. convert Ġ{ ĠDuration . parse ( it ) Ġ} ĊĠĠĠ Ġ. default ( Duration . of Days ( 1 )) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDefines Ġthe Ġlocation Ġin Ġwhich Ġlog Ġfiles Ġshall Ġbe Ġplaced Ġby Ġthe Ġapplication . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠDefaults Ġto Ġthe Ġoperating Ġsystem Ġdependent Ġstorage Ġdirectory Ġ( e . g . ĠAPP DATA Ġon ĠWindows , ĠHome Ġon ĊĠĠ Ġ* ĠN IX Ġbased Ġsystems , Ġetc ). ĊĠĠ Ġ*/ ĊĠ Ġval Ġlog Directory : ĠPath Ġby Ġoption ( ĊĠĠĠ Ġ"-- log - dir ", ĊĠĠĠ Ġhelp Ġ= Ġ" Specifies Ġthe Ġlog Ġstorage Ġdirectory " ĊĠ Ġ) ĊĠĠĠ Ġ. convert Ġ{ ĠPaths . get ( it ) Ġ} ĊĠĠĠ Ġ. default Lazy Ġ{ ĊĠĠĠĠĠ ĠOperating System . current . resolve Application Directory ( application Name ). resolve (" log ") ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠEnables Ġglobal Ġdebug Ġlogging . ĊĠĠ Ġ*/ ĊĠ Ġval Ġdebug : ĠBoolean Ġby Ġoption ( ĊĠĠĠ Ġ"-- debug ", ĊĠĠĠ Ġhelp Ġ= Ġ" Enable s Ġdebug Ġlogging " ĊĠ Ġ) ĊĠĠĠ Ġ. flag () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠEnables Ġglobal Ġtrace Ġlogging . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġverbose : ĠBoolean Ġby Ġoption ( ĊĠĠĠ Ġ"-- verbose ", ĊĠĠĠ Ġhelp Ġ= Ġ" Enable s Ġverbose Ġlogging " ĊĠ Ġ) ĊĠĠĠ Ġ. flag () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġversion Option ( Beacon Ui Metadata . version ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠ Ġ// Ġst ash Ġthe Ġdesired Ġlogging Ġpath Ġas Ġearly Ġas Ġpossible Ġto Ġmake Ġsure ĠLogger Ġconstruction Ġdoes Ġnot ĊĠĠĠ Ġ// Ġfail Ġdue Ġto Ġmissing Ġsystem Ġproperties ĊĠĠĠ Ġconfigure Log Storage ( log Directory ) ĊĊĠĠĠ Ġval Ġlogger Ġ= ĠLog Manager . getLogger ( Beacon Application :: class . java ) ĊĊĠĠĠ Ġval Ġbytecode Version Ġ= ĠSystem . getProperty (" java . class . version ", Ġ""). toFloat OrNull () Ġ?: Ġ 0 f ĊĠĠĠ Ġlogger . info (" Detected Ġnative ĠByte code Ġversion : Ġ$ byte code Version ") ĊĊĠĠĠ Ġif Ġ( byte code Version Ġ< Ġ 6 1 ) Ġ{ ĊĠĠĠĠĠ Ġlogger . error (" Detected Ġnative ĠByte code Ġversion Ġis Ġincompatible ") ĊĠĠĠĠĠ Ġlogger . error (" Launch Ġhas Ġbeen Ġaborted Ġ- ĠCannot Ġrecover ") ĊĊĠĠĠĠĠ ĠJOptionPane . showMessageDialog ( ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġ" You Ġare Ġrunning Ġan Ġoutdated Ġversion Ġof ĠJava \ n You Ġwill Ġneed ĠJava Ġ 1 7 Ġor Ġnewer Ġto Ġrun Ġthis Ġapplication ", ĊĠĠĠĠĠĠĠ Ġ" Out dated ĠJava ĠVersion ", ĊĠĠĠĠĠĠĠ ĠJOptionPane . ERROR _ MESSAGE ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠBanner () ĊĊĠĠĠ ĠThread . setDefault Un caught ExceptionHandler Ġ{ Ġthread , Ġex Ġ-> ĊĠĠĠĠĠ Ġlogger . error (" Un caught Ġexception Ġon Ġthread Ġ\" ${ thread . name }\" Ġ(# ${ thread . id })", Ġex ) ĊĊĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠ Ġdetailed Error Dialog ( ĊĠĠĠĠĠĠĠĠĠ ĠLocalization (" error . unknown . title "), ĊĠĠĠĠĠĠĠĠĠ ĠLocalization (" error . unknown . body "), Ġex ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 2 8 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlogger . info (" Application ĠVersion : Ġ${ Beacon Ui Metadata . version }") ĊĠĠĠ Ġlogger . info (" Native ĠByte code ĠVersion : Ġ$ byte code Version ") ĊĠĠĠ Ġlogger . info (" Operating ĠSystem : Ġ${ Operating System . current }") ĊĠĠĠ Ġlogger . info (" Persistence ĠDirectory : Ġ${ Operating System . current . storage Directory }") ĊĊĠĠĠ Ġif Ġ( default System Repositories Ġ!= Ġsystem Repositories ) Ġ{ ĊĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠ Ġ" System Ġrepositories Ġhave Ġbeen Ġoverridden Ġ- ĠSome Ġstandard Ġservices Ġmay Ġbe Ġmissing " ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠ Ġ" System ĠRe positories Ġ(${ system Repositories . size }): Ġ${ system Repositories . join ToString () }" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġif Ġ( verbose Ġ|| Ġdebug Ġ|| Ġdebug Cookie ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlevel Ġ= Ġif Ġ( verbose ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLevel . ALL ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Cookie ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Logging Ġlevel Ġwill Ġbe Ġadjusted Ġdue Ġto Ġdebug Ġcookie Ġfile Ġat Ġ$ debug Cookie Path ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLevel . DEBUG ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġroot Level Ġ= Ġlevel ĊĠĠĠĠĠ Ġlogger . info (" Adjust ed Ġthe Ġapplication Ġlog Ġlevel Ġto Ġ$ level ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( disable Cache ) Ġ{ ĊĠĠĠĠĠ Ġlogger . warn (" Caching Ġhas Ġbeen Ġdisabled Ġ- ĠPerformance Ġmay Ġbe Ġde graded ") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġlogger . info (" Cache Ġduration Ġhas Ġbeen Ġset Ġto Ġ$ cache Duration ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġui Module Ġ= Ġmodule Ġ{ ĊĠĠĠĠĠ Ġsingle ( named (" system Repositories ")) Ġ{ Ġsystem Repositories Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( disable Cache ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle < Cache Provider > Ġ{ ĠNo op Cache Provider Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle < Cache Provider > Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcache Path Ġ= Ġget < Path >( storage Path Qualifier ). resolve (" cache ") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġget < Configuration >() ĊĊĠĠĠĠĠĠĠĠĠ ĠFileSystem Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Path , Ġcache Duration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Provider Ġ= ĠM urm ur 3 Path Provider ( 4 2 4 2 4 2 L ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . migration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Migr ating Ġbetween Ġversions Ġ- ĠPur ging Ġall Ġcache Ġentries ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . purge All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġsingle Ġ{ ĠVersion . parse ( Beacon Ui Metadata . version ) Ġ} ĊĊĠĠĠĠĠ Ġsingle Ġ{ ĠGitHub . with Defaults () Ġ} ĊĠĠĠĠĠ Ġsingle < Update Provider > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġget < Version >() ĊĠĠĠĠĠĠĠ Ġval Ġgit Hub Ġ= Ġget < GitHub >() ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġversion . inst ability Type ĊĊĠĠĠĠĠĠĠ ĠGitHub Update Provider ( ĊĠĠĠĠĠĠĠĠĠ Ġversion , ĊĠĠĠĠĠĠĠĠĠ Ġchannel , ĊĠĠĠĠĠĠĠĠĠ Ġgit Hub . for Repository (" dot Start ", Ġ" Beacon ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġsingle < Loader >( named (" update Loader ")) Ġ{ ĠUpdate Check Loader ( get ()) Ġ} ĊĊĠĠĠĠĠ Ġsingle Ġ{ ĠPre loader ( getAll ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġstart K oin Ġ{ ĊĠĠĠĠĠ Ġmodules ( environment Module ) ĊĠĠĠĠĠ Ġmodules ( config Module ) ĊĊĠĠĠĠĠ Ġmodules ( ex posure Module ) ĊĠĠĠĠĠ Ġmodules ( repository Module ) ĊĠĠĠĠĠ Ġmodules ( tray Module ) ĊĊĠĠĠĠĠ Ġmodules ( ui Module ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġpass Ġany Ġof Ġour Ġarguments Ġto ĠJava FX Ġsince Ġthere 's Ġnothing Ġspecial Ġto Ġhandle Ġhere ĊĠĠĠ ĠApplication . launch ( Beacon Application :: class . java ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠJVM ĠEntry ĠPoint Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġmethod Ġwill Ġimmediately Ġinitialize ĠJava FX Ġbefore Ġany Ġother Ġservices Ġare Ġreferenced Ċ Ġ* Ġin Ġorder Ġto Ġgive Ġthe Ġframework Ġa Ġchance Ġto Ġinitialize Ġits Ġthreads Ġand Ġtake Ġcontrol Ġof Ġthe ĠJVM Ċ Ġ* Ġmain Ġthread . Ċ Ġ* Ċ Ġ* ĠAll Ġfollowing Ġlogic Ġwill Ġbe Ġinvoked Ġfrom ĠJ FX Ġmanaged Ġthreads . Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠ Ġ// Ġregister ĠLog 4 j Ġas Ġthe ĠJDK Ġlogging Ġmanager Ġas Ġearly Ġas Ġpossible Ġfor Ġthird Ġparty Ġlibrary ĊĠ Ġ// Ġlogging Ġsupport ĊĠ ĠSystem . setProperty (" java . util . logging . manager ", Ġ" org . apache . logging . log 4 j . jul . Log Manager ") ĊĊĠ ĠBe acon Cli . main ( args ) Ċ } Ċ