package Ġcom . time path . launcher . data Ċ Ċ import Ġcom . time path . Swing Utils Ċ import Ġcom . time path . class loader . Composite ClassLoader Ċ import Ġcom . time path . launcher . Launcher Ċ import Ġcom . time path . maven . Package Ċ import Ġcom . time path . maven . Update Checker Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . net .* Ċ import Ġjava . util . HashSet Ċ import Ġjava . util . concurrent . ExecutionException Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Logger Ċ import Ġjavax . swing . J Editor Pane Ċ import Ġjavax . swing . JPanel Ċ import Ġjavax . swing . Swing Worker Ċ Ċ public Ġclass ĠProgram ( public Ġval Ġ` package `: ĠPackage , Ġpublic Ġval Ġtitle : ĠString , Ġprivate Ġval Ġnews feed URL : ĠString ?, Ġpublic Ġval Ġmain : ĠString , Ġargs : ĠList < String > ?) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġargs : ĠList < String > ĊĠĠĠ Ġpublic Ġval Ġid : ĠInt Ġ= Ġauto Id . get And Increment () ĊĠĠĠ Ġprivate Ġvar Ġstar red : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdaemon : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpanel : ĠJPanel ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . args Ġ= Ġargs Ġ?: ĠlistOf < String >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġis Star red (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstar red ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġset Star red ( star red : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . star red Ġ= Ġstar red ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtitle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġstart ( context : ĠLaunch er ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . update ( this ) ĊĠĠĠĠĠĠĠ Ġcontext . start ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġrun ( cl : ĠComposite ClassLoader ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . log ( Level . INFO , Ġ" Starting Ġ{ 0 } Ġ({ 1 })", ĠarrayOf ( this , Ġmain )) ĊĠĠĠĠĠĠĠ Ġval Ġargv Ġ= Ġargs . to Typed Array () ĊĠĠĠĠĠĠĠ Ġval Ġcp Ġ= ĠgetClass Path () ĊĠĠĠĠĠĠĠ Ġcl . start ( main , Ġargv , Ġcp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġdependencies , Ġflatten ed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetClass Path (): ĠSet < URL > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġ` package `. get Downloads () ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠHashSet < URL >( all . size ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( download Ġin Ġall ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh . add ( Update Checker . getFile ( download ). to URI (). to URL ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . log ( Level . SEVERE , Ġnull , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġh ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġis Daemon (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdaemon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġset Daemon ( daemon : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . daemon Ġ= Ġdaemon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠURL . open Follow Redirect s ( proxy : ĠProxy Ġ= ĠProxy . NO _ PROXY ): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconn Ġ= Ġopen Connection ( proxy ) Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( conn . getResponse Code ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ MOVED _ PERM , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ MOVED _ TEMP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ SE E _ OTHER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI ( conn . getHeader Field (" Location ")). to URL (). open Follow Redirect s ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconn . getInputStream () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġget Panel (): ĠJPanel ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( panel Ġ!= Ġnull ) Ġreturn Ġpanel ĊĠĠĠĠĠĠĠ Ġpanel Ġ= ĠJPanel ( Border Layout ()) ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġplaceholder ĊĠĠĠĠĠĠĠ Ġval Ġinitial Ġ= ĠJ Editor Pane (" text ", Ġif Ġ(( news feed URL Ġ== Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġnews feed Ġavailable " ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Loading ...") ĊĠĠĠĠĠĠĠ Ġinitial . set Editable ( false ) ĊĠĠĠĠĠĠĠ Ġpanel !!. add ( initial ) ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġreal Ġfeed Ġin Ġbackground ĊĠĠĠĠĠĠĠ Ġif Ġ( news feed URL Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSw ing Worker < J Editor Pane , ĠVoid >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background (): ĠJ Editor Pane ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI ( news feed URL ). to URL (). open Follow Redirect s (). buffered Reader (). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Pane Ġ= ĠJ Editor Pane (" text / html ", Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor Pane . set Editable ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor Pane . add Hyper link Listener ( Swing Utils . HY PER LINK _ LIST ENER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġeditor Pane ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdone () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel !!. remove ( initial ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel !!. add ( get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel !!. update UI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . log ( Level . INFO , Ġ" Loaded Ġ{ 0 }", Ġnews feed URL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . log ( Level . SEVERE , Ġnull , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠExecution Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . log ( Level . SEVERE , Ġnull , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpanel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getLogger ( java Class < Program >(). getName ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġauto Id Ġ= ĠAtomicInteger () ĊĠĠĠ Ġ} Ċ } Ċ