@ file : Jvm Name (" Gr av iton ") Ċ package Ġapp . grav iton . shell Ċ Ċ import Ġjavafx . beans . property . Simple Boolean Property Ċ import Ġjavafx . scene . effect . Effect Ċ import Ġjavafx . scene . image . Image Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġpic oc li . CommandLine Ċ import Ġt orn ad of x .* Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġkotlin . concurrent . thread Ċ Ċ // Ċ // ĠThe Ġmain Ġmethod , Ġargument Ġparsing , Ġfirst Ġrun Ġchecks , Ġlast Ġrun Ġhandling Ġ( uninstall ), Ġconsole Ġsetup . Ċ // Ċ Ċ // region ĠGlobal Ġvariables Ċ class ĠBootstrap per Env Vars Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbase Ġdirectory Ġin Ġwhich Ġthe Ġversion ed Ġsub directories Ġare Ġfound : Ġ$ GR AV IT ON _ PATH /$ GR AV IT ON _ VERSION Ġwill Ġcontain Ġthe ĊĠĠĠĠ Ġ* Ġversion ed Ġinstallation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġgrav iton Path : ĠPath Ġ= ĠPaths . get ( System . getenv (" GR AV IT ON _ PATH ")) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPath Ġto Ġthe Ġactual Ġversion ed Ġbinary Ġthe Ġboot str apped Ġinvoked Ġ( if Ġwe Ġwere Ġrun Ġvia Ġthe Ġbootstrap per ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġgrav iton Exe Path : ĠPath Ġ= ĠPaths . get ( System . getenv (" GR AV IT ON _ EXE ")) ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġversion , Ġas Ġdiscovered Ġby Ġthe Ġbootstrap per . Ġ*/ ĊĠĠĠ Ġval Ġgrav iton Version : ĠInt Ġ= ĠSystem . getenv (" GR AV IT ON _ VERSION ") !!. toInt () Ċ } Ċ Ċ val Ġenv Vars : ĠBootstrap per Env Vars ? Ġ= Ġif Ġ( System . getenv (" GR AV IT ON _ PATH ") Ġ!= Ġnull ) ĠBootstrap per Env Vars () Ġelse Ġnull Ċ Ċ /** ĠThe Ġtop Ġlevel Ġlogger Ġfor Ġthe Ġapp . Ġ*/ Ċ val Ġmain Log : ĠLogger Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger (" main ") Ġ} Ċ Ċ /** ĠGlobal Ġaccess Ġto Ġparsed Ġcommand Ġline Ġflags . Ġ*/ Ċ var Ġcommand Line Arguments Ġ= ĠGr av iton CLI ( array Of ("")) Ċ Ċ /** ĠControls Ġwhether Ġthe Ġspinner Ġanimation Ġis Ġactive Ġor Ġnot . Ġ*/ Ċ val Ġis Working Ġby Ġlazy Ġ{ ĠSimple Boolean Property () Ġ} Ċ Ċ // ĠAllow Ġfor Ġminimal Ġre brand ing Ġin Ġfuture . Ċ const Ġval Ġapp Brand Name Ġ= Ġ" Gr av iton " Ċ /** ĠShould Ġthe Ġname Ġbe Ġput Ġnext Ġto Ġthe Ġlogo , Ġor , Ġshould Ġwe Ġjust Ġuse Ġthe Ġlogo Ġalone Ġ( i . e . Ġit Ġis Ġthe Ġname ) Ġ*/ Ċ const Ġval Ġapp Brand Logo Is Name Ġ= Ġfalse Ċ /** ĠIf Ġset , Ġan Ġeffect Ġto Ġapply Ġto Ġthe Ġlogo Ġimage . Ġ*/ Ċ val Ġapp Logo Effect : ĠEffect ? Ġ= Ġnull Ċ /** ĠThe Ġlogo Ġimage Ġto Ġuse Ġon Ġthe ĠUI ;. Ġ*/ Ċ val ĠComponent . app Brand Logo Ġget () Ġ= ĠImage ( resources [" art / icons 8 - rocket - take - off - 1 2 8 . png "]) Ċ // endregion Ċ Ċ fun Ġmain ( arguments : ĠArray < String >) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġmain 1 ( arguments ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Log . error (" Failed Ġto Ġstart Ġup ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Operating System Ġ== ĠOperating System . WIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindows Alert Box (" Failed Ġto Ġstart Ġup ", Ġe . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġnot Ġour Ġday Ġtoday ..... ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmain 1 ( arguments : ĠArray < String >) Ġ{ ĊĠĠĠ Ġ// ĠThe Ġshell Ġmay Ġrequest Ġthat Ġwe Ġjust Ġimmediately Ġrun Ġa Ġprogram Ġwith Ġa Ġprovided Ġclasspath , Ġas Ġpart Ġof Ġstarting ĊĠĠĠ Ġ// Ġup Ġa Ġnon - Gr av iton Ġapp Ġoutside Ġthe Ġshell Ġprocess . ĊĠĠĠ Ġif Ġ( immediate ly Invoke Application ( arguments )) ĊĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠ Ġvar Ġforce Ansi Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( current Operating System Ġ== ĠOperating System . WIN ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWindows Ġhas Ġmanaged Ġto Ġscre w Ġup Ġits Ġconsole Ġhandling Ġreally , Ġreally Ġbad ly . ĠWe Ġneed Ġsome Ġhack s Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline Ġapps Ġand ĠGUI Ġapps Ġwork Ġfrom Ġthe Ġsame Ġ( ish ) Ġbinary . ĠSee Ġthe Ġconfigure Windows Console ĊĠĠĠĠĠĠĠ Ġ// Ġfunction Ġfor Ġthe Ġg ory Ġdetails . ĊĠĠĠĠĠĠĠ Ġforce Ansi Ġ= Ġconfigure Windows Console () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcommand Line Arguments Ġ= ĠGr av iton CLI ( arguments ) ĊĠĠĠ Ġval Ġcli Ġ= ĠCommandLine ( command Line Arguments ) ĊĠĠĠ Ġcli . is Stop At Position al Ġ= Ġtrue ĊĠĠĠ Ġcli . usage Help Width Ġ= Ġif Ġ( arguments . isNotEmpty ()) Ġget Term Width () Ġelse Ġ 8 0 Ġ Ġ// ĠDon 't Ġcare ĊĊĠĠĠ Ġ// ĠForce ĠANSI Ġon Ġbecause Ġwe Ġenable Ġit Ġon ĠWindows Ġ 1 0 Ġnow . ĊĠĠĠ Ġval Ġhandler Ġ= ĠCommandLine . Run Last () ĊĠĠĠ Ġif Ġ( force Ansi ) ĊĠĠĠĠĠĠĠ Ġhandler . use Ansi ( CommandLine . Help . Ansi . ON ) ĊĊĠĠĠ Ġ// ĠThis Ġcall Ġwill Ġpass Ġcontrol Ġto ĠGr av iton CLI . run Ġ( as Ġthat 's Ġthe Ġobject Ġin Ġcommand Line Arguments ). ĊĠĠĠ Ġcli . parse With Handlers ( handler , ĠCommandLine . Default ExceptionHandler < List < Any >> (), Ġ* arguments ) Ċ } Ċ Ċ private Ġfun Ġimmediately Invoke Application ( arguments : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠThis Ġis Ġonly Ġcalled Ġwhen Ġan Ġapp Ġis Ġinvoked Ġfrom Ġthe ĠGr av iton ĠGUI , Ġso Ġwe Ġdon 't Ġcare Ġabout ĠANSI Ġor Ġconsole Ġstuff Ġhere . ĊĠĠĠ Ġ// ĠUse Ġenvironment Ġvariables Ġto Ġallow Ġus Ġto Ġkeep Ġthe Ġarguments Ġlist Ġclean , Ġand Ġto Ġstop Ġanyone Ġfrom Ġbeing Ġable Ġto ĊĠĠĠ Ġ// Ġdiv ert Ġus Ġonto Ġthis Ġcode path Ġin Ġcase Ġof ĠURL Ġhandler Ġbugs Ġ( URLs Ġcannot Ġset Ġenvironment Ġvariables ). ĊĠĠĠ Ġval Ġrun CP : ĠString Ġ= ĠSystem . getenv (" GR AV IT ON _ RUN _ CP ") Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġrun ClassName : ĠString Ġ= ĠSystem . getenv (" GR AV IT ON _ RUN _ CLASS NAME ") Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġcl Ġ= ĠGr av iton ClassLoader . build ( run CP ) ĊĠĠĠ Ġval Ġclazz Ġ= Ġcl . load Class ( run ClassName ) ĊĠĠĠ Ġ// ĠThis Ġthread Ġwill Ġkick Ġoff Ġand Ġstart Ġrunning Ġthe Ġprogram . ĠIt Ġwon 't Ġbe Ġable Ġto Ġsee ĠGr av iton 's Ġclasses Ġbecause Ġit 's ĊĠĠĠ Ġ// Ġin Ġa Ġseparate Ġclass loader Ġthat Ġdoesn 't Ġchain Ġto Ġthe Ġone Ġthat Ġloaded Ġus . ĠThis Ġisn 't Ġperfectly Ġcompatible Ġ( a Ġfew ĊĠĠĠ Ġ// Ġbig / complex Ġapps Ġexpect Ġthe Ġclass loader Ġto Ġbe Ġa Ġsun . misc . App ClassLoader ) Ġbut Ġit 'll Ġdo Ġfor Ġnow . ĠThis Ġthread Ġwill ĊĠĠĠ Ġ// Ġcontinue , Ġdie , Ġand Ġthe Ġnew Ġthread Ġwill Ġbe Ġthe Ġonly Ġone Ġleft . ĠEvent ually Ġthe ĠGC Ġshould Ġclear Ġout Ġthe Ġcode Ġin ĊĠĠĠ Ġ// Ġthis Ġfile Ġfrom Ġmemory , Ġand Ġthe Ġnew Ġapp Ġwill Ġhave Ġa Ġrelatively Ġclean Ġstack Ġtrace . ĊĠĠĠ Ġthread ( name Ġ= Ġ" main ", Ġcontext ClassLoader Ġ= Ġcl ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Main ( clazz , Ġarguments ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġfun Ġget Term Width (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( current Operating System ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperating System . MAC , ĠOperating System . LINUX Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproc Ġ= ĠProcess Builder (" st ty ", Ġ" size "). redirect Input ( Process Builder . Redirect . IN HER IT ). start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproc . waitFor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 2 Ġ= ĠString ( proc . inputStream . read Bytes ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġo 2 . split (' Ġ' )[ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 8 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠ 8 0 ĊĠĠĠ Ġ} Ċ }