/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 ĠV ic ĠL au Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . sw or de ss . common . lang . io Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Closed Watch ServiceException Ċ import Ġjava . nio . file . FileSystem s Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Standard Watch Event Kinds Ċ import Ġjava . nio . file . Watch Event Ċ import Ġjava . nio . file . Watch Service Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ class ĠDirectory Event Ġinternal Ġconstructor ( val Ġkind : ĠWatch Event . Kind < out ĠAny >, Ġval Ġdir : ĠPath , Ġval Ġchange : ĠPath ) Ċ Ċ class ĠDirectory Watcher ( dir : ĠString , Ġvar arg Ġval Ġevents : ĠWatch Event . Kind <* >) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġprivate Ġval Ġdir Ġ= ĠFile ( dir ). to Path () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwatch Service : ĠWatch Service ĊĠĠĠ Ġprivate Ġvar Ġhandlers : ĠMutable List <( Directory Event )-> Unit > Ġ= ĠCopy On Write ArrayList () ĊĠĠĠ Ġ// ĠTODO Ġsupport Ġcomma Ġseparated Ġstring ĊĠĠĠ Ġvar Ġfilename Extension Include : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġwatch Service Ġ= ĠFileSystem s . getDefault (). new Watch Service () ĊĠĠĠĠĠĠĠ Ġdir . register ( watch Service , Ġ* events ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġstop Ġthe Ġthread Ġmanually Ġvia Ġthe ĠServlet Context Listener Ġso Ġthat Ġits Ġpossible Ġto Ġreload Ġthe Ġapp ĊĠĠĠĠĠĠĠ Ġwith ( Thread ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Un caught ExceptionHandler Ġ{ Ġt , Ġe Ġ-> Ġlogger . warn ( e . message , Ġe ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" watcher Ġfor Ġ{} Ġhas Ġbeen Ġinitialized ", Ġdir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġwatch Service . close () ĊĠĠĠĠĠĠĠ Ġlogger . info (" watcher Ġfor Ġ{} Ġhas Ġbeen Ġdestroyed ", Ġdir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwatch Service . take () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" inter rupted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClosed Watch ServiceException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" watch Ġservice Ġis Ġclosed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġkey . poll Events ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan ĠOVER FLOW Ġevent Ġcan Ġoccur Ġregardless Ġif Ġevents Ġare Ġlost Ġor Ġdiscarded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . kind () Ġ=== ĠStandard Watch Event Kinds . OVER FLOW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġevent . context () Ġas ĠPath ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassume Ġthere Ġis Ġno Ġmodification Ġafter Ġnull Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filename Extension Include Ġ== Ġnull Ġ|| Ġfilename . toString (). endsWith ( filename Extension Include Ġas ĠString )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Event ( event . kind (), Ġdir . resolve ( filename )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Ġ= Ġkey . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfire Event ( kind : ĠWatch Event . Kind < out ĠAny >, Ġfile : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . forEach Ġ{ Ġit ( Directory Event ( kind , Ġdir , Ġfile )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Handler ( handler : Ġ( Directory Event ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . add ( handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Handler ( handler : Ġ( Directory Event ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . remove ( handler ) ĊĠĠĠ Ġ} Ċ Ċ }