// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . configuration Store . scheme Manager Ċ Ċ import Ġcom . intellij . configuration Store . LOG Ċ import Ġcom . intellij . configuration Store . Store Reload Manager Ċ import Ġcom . intellij . configuration Store . Store Reload ManagerImpl Ċ import Ġcom . intellij . openapi . diagnostic . debug Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . new vfs . Bulk File Listener Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V FileContent ChangeEvent Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V File Create Event Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V File Delete Event Ċ import Ġcom . intellij . openapi . vfs . new vfs . events . V File Event Ċ import Ġcom . intellij . util . Smart List Ċ import Ġcom . intellij . util . io . system In dependent Path Ċ Ċ internal Ġclass ĠScheme File Tracker ( private Ġval Ġscheme Manager : ĠScheme ManagerImpl < Any , ĠAny >, Ġprivate Ġval Ġproject : ĠProject ) Ġ: ĠBulk File Listener Ġ{ ĊĠ Ġprivate Ġval Ġapplic ator Ġ= ĠScheme Change Applic ator ( scheme Manager ) ĊĊĠ Ġoverride Ġfun Ġafter ( events : ĠMutable List < out ĠV File Event >) Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= ĠSmart List < Scheme ChangeEvent >() ĊĠĠĠ Ġfor Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( event . request or Ġis ĠScheme ManagerImpl < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠV FileContent ChangeEvent Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġevent . file ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is My File Without Parent Check ( file ) Ġ&& Ġis My Directory ( file . parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" CHANGED Ġ${ file . path }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Update Scheme ( file )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠV File Create Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Directory Created ( event , Ġlist ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( scheme Manager . can Read ( event . child Name ) Ġ&& Ġis My Directory ( event . parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġevent . file ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" CREATED Ġ${ event . path } Ġ( virtual File : Ġ${ if Ġ( virtual File Ġ== Ġnull ) Ġ" not Ġ" Ġelse Ġ"" } found )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual File ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Add Scheme ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠV File Delete Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġevent . file ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Directory Deleted ( file , Ġlist ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is My File Without Parent Check ( file ) Ġ&& Ġis My Directory ( file . parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" DELETED Ġ${ file . path }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Remove Scheme ( file . name )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( list . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ( Store Reload Manager . getInstance () Ġas ĠStore Reload ManagerImpl ). register Changed Schemes ( list , Ġapplic ator , Ġproject ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis My File Without Parent Check ( file : ĠVirtual File ) Ġ= Ġscheme Manager . can Read ( file . name Sequence ) ĊĊĠ Ġ@ Suppress (" Move Variable Declaration Into When ") ĊĠ Ġprivate Ġfun Ġis My Directory ( parent : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġvirtual Directory Ġ= Ġscheme Manager . cached Virtual Directory ĊĠĠĠ Ġreturn Ġwhen Ġ( virtual Directory ) Ġ{ ĊĠĠĠĠĠ Ġnull Ġ-> Ġscheme Manager . io Directory . system In dependent Path Ġ== Ġparent . path ĊĠĠĠĠĠ Ġelse Ġ-> Ġvirtual Directory Ġ== Ġparent ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Directory Deleted ( file : ĠVirtual File , Ġlist : ĠSmart List < Scheme ChangeEvent >) Ġ{ ĊĠĠĠ Ġif Ġ(! StringUtil . equals ( file . name Sequence , Ġscheme Manager . io Directory . fileName . toString ())) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ ĠLOG . debug Ġ{ Ġ" DIR ĠDE LETED Ġ${ file . path }" Ġ} ĊĠĠĠ Ġif Ġ( file Ġ== Ġscheme Manager . virtual Directory ) Ġ{ ĊĠĠĠĠĠ Ġlist . add ( RemoveAll Schemes ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Directory Created ( event : ĠV File Create Event , Ġlist : ĠMutable List < Scheme ChangeEvent >) Ġ{ ĊĠĠĠ Ġif Ġ( event . child Name Ġ!= Ġscheme Manager . io Directory . fileName . toString ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdir Ġ= Ġscheme Manager . virtual Directory ĊĠĠĠ Ġval Ġvirtual File Ġ= Ġevent . file ĊĠĠĠ Ġif Ġ( virtual File Ġ!= Ġdir ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLOG . debug Ġ{ Ġ" DIR ĠCRE ATED Ġ${ virtual File ?. path }" Ġ} ĊĊĠĠĠ Ġfor Ġ( file Ġin Ġdir !!. children ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is My File Without Parent Check ( file )) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add ( Add Scheme ( file )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠUpdate Scheme ( override Ġval Ġfile : ĠVirtual File ) Ġ: ĠScheme ChangeEvent , ĠScheme Add OrUpdate Event Ġ{ ĊĠ Ġoverride Ġfun Ġexecute ( schema Loader : ĠLazy < Scheme Loader < Any , ĠAny >>, Ġscheme Manager : ĠScheme ManagerImpl < Any , ĠAny >) Ġ{ ĊĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠAdd Scheme ( override Ġval Ġfile : ĠVirtual File ) Ġ: ĠScheme ChangeEvent , ĠScheme Add OrUpdate Event Ġ{ ĊĠ Ġoverride Ġfun Ġexecute ( schema Loader : ĠLazy < Scheme Loader < Any , ĠAny >>, Ġscheme Manager : ĠScheme ManagerImpl < Any , ĠAny >) Ġ{ ĊĠĠĠ Ġif Ġ(! file . isValid ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġread Scheme Ġ= Ġread Scheme FromFile ( file , Ġschema Loader . value , Ġscheme Manager ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġread Scheme Key Ġ= Ġscheme Manager . processor . get Scheme Key ( read Scheme ) ĊĠĠĠ Ġval Ġexisting Scheme Ġ= Ġscheme Manager . find Scheme ByName ( read Scheme Key ) Ġ?: Ġreturn ĊĠĠĠ Ġif Ġ( scheme Manager . scheme List Manager . readOnly External izable Schemes . get ( ĊĠĠĠĠĠĠĠ Ġscheme Manager . processor . get Scheme Key ( existing Scheme )) Ġ!== Ġexisting Scheme ) Ġ{ ĊĠĠĠĠĠ ĠLOG . warn (" Ignore Ġincorrect ĠV FS Ġcreate Ġscheme Ġevent : Ġschema Ġ${ read Scheme Key } Ġis Ġalready Ġexists ") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠRemove Scheme ( val ĠfileName : ĠString ) Ġ: ĠScheme ChangeEvent Ġ{ ĊĠ Ġoverride Ġfun Ġexecute ( schema Loader : ĠLazy < Scheme Loader < Any , ĠAny >>, Ġscheme Manager : ĠScheme ManagerImpl < Any , ĠAny >) Ġ{ ĊĠĠĠ ĠLOG . assertTrue (! schema Loader . isInitialized ()) ĊĊĠĠĠ Ġ// Ġdo Ġnot Ġschedule Ġscheme Ġfile Ġremoving Ġbecause Ġfile Ġwas Ġalready Ġremoved ĊĠĠĠ Ġval Ġscheme Ġ= Ġscheme Manager . remove First Scheme ( is Schedule ToDelete Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠ ĠfileName Ġ== Ġget Scheme FileName ( scheme Manager , Ġit ) ĊĠĠĠ Ġ} Ġ?: Ġreturn ĊĠĠĠ Ġscheme Manager . processor . on Scheme Deleted ( scheme ) ĊĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠRemove All Schemes Ġ: ĠScheme ChangeEvent Ġ{ ĊĠ Ġoverride Ġfun Ġexecute ( schema Loader : ĠLazy < Scheme Loader < Any , ĠAny >>, Ġscheme Manager : ĠScheme ManagerImpl < Any , ĠAny >) Ġ{ ĊĠĠĠ ĠLOG . assertTrue (! schema Loader . isInitialized ()) ĊĊĠĠĠ Ġscheme Manager . cached Virtual Directory Ġ= Ġnull ĊĠĠĠ Ġ// Ġdo Ġnot Ġschedule Ġscheme Ġfile Ġremoving Ġbecause Ġfiles Ġwere Ġalready Ġremoved ĊĠĠĠ Ġscheme Manager . remove External izable Schemes From Runtime State () ĊĠ Ġ} Ċ }