/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠSeb astian ĠE rives Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . github . ser ives me j ia . e oc v sim . workspace Ċ Ċ import Ġcom . github . ser ives me j ia . e oc v sim . E OC VS im Ċ import Ġcom . github . ser ives me j ia . e oc v sim . pipeline . compiler . Compiled Pipeline Manager Ċ import Ġcom . github . ser ives me j ia . e oc v sim . util . event . EventHandler Ċ import Ġcom . github . ser ives me j ia . e oc v sim . util . File Watcher Ċ import Ġcom . github . ser ives me j ia . e oc v sim . util . Log Ċ import Ġcom . github . ser ives me j ia . e oc v sim . util . Sys Util Ċ import Ġcom . github . ser ives me j ia . e oc v sim . workspace . config . Workspace Config Ċ import Ġcom . github . ser ives me j ia . e oc v sim . workspace . config . Workspace Config Loader Ċ import Ġcom . github . ser ives me j ia . e oc v sim . workspace . util . Workspace Template Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Paths Ċ Ċ class ĠWorkspace Manager ( val Ġe oc v Sim : ĠE OC VS im ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Workspace Manager " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġworkspace Config Loader Ġby Ġlazy Ġ{ ĠWorkspace Config Loader ( workspace File ) Ġ} ĊĊĠĠĠ Ġvar Ġworkspace File Ġ= ĠFile (".") ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Ġ!= Ġworkspace File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace Config Loader . workspace File Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe oc v Sim . config . workspace Path Ġ= Ġvalue . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe oc v Sim . config Manager . save ToFile () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info ( TAG , Ġ" Set Ġcurrent Ġworkspace Ġto Ġ${ value . absolute Path }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (:: file Watcher . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Watcher . stop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Watcher Ġ= ĠFile Watcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources AbsolutePath . to File (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources AbsolutePath . to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġnull , Ġ" Workspace " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Watcher . init () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Workspace Change . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Work sp Config Ġ= Ġworkspace Config Loader . load Workspace Config () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cached Work sp Config Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Work sp Config Ġ= ĠWorkspace Config () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( workspace Config Loader . workspace ConfigFile . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . warn ( TAG , Ġ" Re creating Ġworkspace Ġconfig Ġfile , Ġold Ġone Ġfailed Ġto Ġparse ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info ( TAG , Ġ" Creating Ġworkspace Ġconfig Ġfile ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace Config Loader . save Workspace Config ( workspace Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info ( TAG , Ġ" Loaded Ġworkspace Ġconfig Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcached Work sp Config : ĠWorkspace Config ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġworkspace Config : ĠWorkspace Config ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info ( TAG , Ġ" Saving Ġworkspace Ġconfig Ġfile Ġof Ġ${ workspace File . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace Config Loader . save Workspace Config ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Work sp Config Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cached Work sp Config Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: workspace File . set ( workspace File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached Work sp Config !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsources RelativePath Ġget () Ġ= Ġworkspace Config . sources Path !! ĊĠĠĠ Ġval Ġsources AbsolutePath Ġget () Ġ= ĠPaths . get ( workspace File . absolute Path , Ġsources RelativePath ). normalize () !! ĊĊĠĠĠ Ġval Ġresources RelativePath Ġget () Ġ= Ġworkspace Config . resources Path !! ĊĠĠĠ Ġval Ġresources AbsolutePath Ġget () Ġ= ĠPaths . get ( workspace File . absolute Path , Ġresources RelativePath ). normalize () !! ĊĊĠĠĠ Ġval Ġexcluded Relative Paths Ġget () Ġ= Ġworkspace Config . excluded Paths ĊĠĠĠ Ġval Ġexcluded Absolute Paths Ġget () Ġ= Ġexcluded Relative Paths . map Ġ{ ĊĠĠĠĠĠĠĠ ĠPaths . get ( workspace File . absolute Path , Ġit ). normalize () !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexcluded File Extensions Ġget () Ġ= Ġworkspace Config . excluded File Extensions ĊĊĠĠĠ Ġ// ĠTODO : ĠEx cluding Ġignored Ġpaths ĊĠĠĠ Ġval Ġsource Files Ġget () Ġ= ĠSys Util . files Under ( sources AbsolutePath . to File ()) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠ Ġfile . name . endsWith (". java ") Ġ&& Ġexcluded Absolute Paths . stream (). none Match Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . startsWith ( it . to File (). absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresource Files Ġget () Ġ= ĠSys Util . files Under ( resources AbsolutePath . to File ()) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠ Ġfile . name . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! endsWith (". java ") Ġ&& Ġ! endsWith (". class ") Ġ&& Ġthis Ġ!= Ġ" e oc v sim _ workspace . json " ĊĠĠĠĠĠĠĠ Ġ} Ġ&& Ġexcluded Absolute Paths . stream (). none Match Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . startsWith ( it . to File (). absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġ&& Ġexcluded File Extensions . stream (). none Match Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . name . endsWith (" .$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġon Workspace Change Ġ= ĠEventHandler (" Workspace Manager - OnChange ") ĊĊĠĠĠ Ġlateinit Ġvar Ġfile Watcher : ĠFile Watcher ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġstop File Watcher () Ġ{ ĊĠĠĠĠĠĠĠ Ġif (:: file Watcher . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Watcher . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Workspace With Template ( folder : ĠFile , Ġtemplate : ĠWorkspace Template ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! folder . isDirectory ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif (! template . extract To If Empty ( folder )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġworkspace File Ġ= Ġfolder ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Workspace With Template Async ( folder : ĠFile , Ġtemplate : ĠWorkspace Template ) Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! folder . isDirectory ) Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġif (! template . extract To If Empty ( folder )) Ġreturn @ launch ĊĊĠĠĠĠĠĠĠ Ġe oc v Sim . on Main Update . do Once Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace File Ġ= Ġfolder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe oc v Sim . visual izer . async Compile P ipelines () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Workspace Change Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Watcher . onChange Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe oc v Sim . pipeline Manager . compiled Pipeline Manager . async Compile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( e oc v Sim . config . workspace Path ) ĊĠĠĠĠĠĠĠ Ġif ( file . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace File Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace File Ġ= ĠComp iled Pipeline Manager . DEF _ WORK SPACE _ FOLDER ĊĊĠĠĠĠĠĠĠ ĠLog . blank () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Current Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġ:: workspace Config . set ( workspace Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreload Config (): ĠWorkspace Config Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Work sp Config Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġworkspace Config ĊĠĠĠ Ġ} Ċ Ċ } Ċ