/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 , ĠTeam Dev . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand / or Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice Ġand Ġthe Ġfollowing Ċ Ġ* Ġdisclaimer . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ċ Ġ* Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR Ċ Ġ* ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT Ċ Ġ* ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , Ċ Ġ* ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ Ġ* ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ Ġ* Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ Ġ* ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġio . sp ine . prot odata . renderer Ċ Ċ import Ġcom . google . common . collect . Immutable Set . to Immutable Set Ċ import Ġio . sp ine . prot odata . the Only Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġkotlin . io . path . is Regular File Ċ import Ġkotlin . text . Charsets . UTF _ 8 Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġof Ġsource Ġfiles . Ċ Ġ*/ Ċ public Ġclass ĠSource Set Ċ internal Ġconstructor ( ĊĠĠĠ Ġfiles : ĠSet < SourceFile >, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcommon Ġroot Ġdirectory Ġfor Ġall Ġthe Ġfiles Ġin Ġthis Ġsource Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPaths Ġof Ġthe Ġfiles Ġmust Ġbe Ġeither Ġabsolute Ġor Ġrelative Ġto Ġthis Ġdirectory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġroot Dir : ĠPath Ċ ) Ġ: ĠIterable < SourceFile > Ġby Ġfiles Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfiles : ĠMutable Map < Path , ĠSource File > ĊĠĠĠ Ġprivate Ġval Ġdeleted Files Ġ= Ġmutable Set Of < Path >() ĊĠĠĠ Ġprivate Ġval Ġpre Read Actions Ġ= Ġmutable ListOf <( SourceFile ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < Path , ĠSource File >( files . size ) ĊĠĠĠĠĠĠĠ Ġthis . files Ġ= Ġfiles . associate By To ( map ) Ġ{ Ġit . path Ġ} ĊĠĠĠĠĠĠĠ Ġthis . files . values . forEach Ġ{ Ġit . attach To ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCollect s Ġa Ġsource Ġset Ġfrom Ġa Ġgiven Ġroot Ġdirectory . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġfrom Contents Of ( directory : ĠPath ): ĠSource Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠFiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. walk ( directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Regular File () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠSource File . read ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( to Immutable Set ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSource Set ( files , Ġdirectory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLooks Ġup Ġa Ġfile Ġby Ġits Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ[ path ] Ġmay Ġbe Ġa Ġrelative Ġor Ġan Ġabsolute Ġpath Ġthe Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġfile ( path : ĠPath ): ĠSource File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġfiles [ path ] ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġfiles . filter Keys Ġ{ Ġit . endsWith ( path ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( filtered . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" File Ġnot Ġfound : Ġ`$ path `. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiltered . values . the Only () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġsource Ġfile Ġat Ġthe Ġgiven Ġ[ path ] Ġand Ġcontains Ġthe Ġgiven Ġ[ code ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcreate File ( path : ĠPath , Ġcode : ĠString ): ĠSource File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠSource File . from Code ( path , Ġcode ) ĊĠĠĠĠĠĠĠ Ġfiles [ file . path ] Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġfile . attach To ( this ) ĊĠĠĠĠĠĠĠ Ġpre Read Actions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . when Read ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġthe Ġgiven Ġ[ file ] Ġfrom Ġthe Ġsource Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDoes Ġnot Ġdelete Ġthe Ġfile Ġfrom Ġthe Ġfile Ġsystem . ĠAll Ġthe ĠFS Ġoperations Ġare Ġperformed Ġin ĊĠĠĠĠ Ġ* Ġthe Ġ[ write ] Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġdelete ( file : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfiles . remove ( file ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" File Ġ`$ value ` Ġnot Ġfound .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeleted Files . add ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrites Ġthis Ġsource Ġset Ġto Ġthe Ġfile Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġsources Ġexisting Ġon Ġthe Ġfile Ġsystem Ġat Ġthe Ġmoment Ġare Ġdeleted , Ġalong Ġwith Ġthe Ġwhole ĊĠĠĠĠ Ġ* Ġdirectory Ġstructure Ġand Ġthe Ġnew Ġfiles Ġare Ġwritten . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġwrite ( charset : ĠCharset Ġ= ĠUTF _ 8 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Dir File Ġ= Ġroot Dir . to File () ĊĠĠĠĠĠĠĠ Ġdeleted Files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . to File (). delete Re cursively () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot Dir File . mkdir s () ĊĠĠĠĠĠĠĠ Ġfiles . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ( charset , Ġroot Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġthe Ġgiven Ġ[ action ] Ġto Ġall Ġthe Ġcode Ġfiles Ġwhich Ġare Ġaccessed Ġby Ġa Ġ[ Renderer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġfile 's Ġcode Ġis Ġfirst Ġaccessed , Ġruns Ġthe Ġgiven Ġaction . ĠThe Ġaction Ġmay Ġchange Ġthe Ġcode ĊĠĠĠĠ Ġ* Ġif Ġnecessary , Ġfor Ġexample , Ġby Ġadding Ġinsertion Ġpoints . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġprepare Code ( action : Ġ( SourceFile ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . when Read ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpre Read Actions . add ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro duces Ġan Ġintersection Ġof Ġthis Ġsource Ġset Ġand Ġthe Ġ[ other ] Ġsource Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġintersection ( other : ĠSource Set ): ĠSource Set Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rootDir Ġ!= Ġother . rootDir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCannot Ġintersect Ġsource Ġsets Ġwith Ġdifferent Ġroot Ġdirectories : ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ rootDir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ other . rootDir } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠSource Set ( set Of (), Ġroot Dir ) ĊĠĠĠĠĠĠĠ Ġresult . files . put All ( files ) ĊĠĠĠĠĠĠĠ Ġresult . files . put All ( other . files ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġthe Ġother Ġsource Ġset Ġinto Ġthis Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġmerge Back ( other : ĠSource Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . put All ( other . files ) ĊĠĠĠĠĠĠĠ Ġdeleted Files . addAll ( other . deleted Files ) ĊĠĠĠĠĠĠĠ Ġother . deleted Files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . remove ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġto List (). join ToString () Ċ } Ċ