// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 Ġ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 . workspace Model . storage . impl . indices Ċ Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . util . containers . Bid irectional Multi Map Ċ import Ġcom . intellij . util . containers . Collection Factory . create Small Memory Footprint Map Ċ import Ġcom . intellij . util . containers . Collection Factory . create Small Memory Footprint Set Ċ import Ġcom . intellij . workspace Model . storage . Workspace Entity Ċ import Ġcom . intellij . workspace Model . storage . bridge Entities . Library Root Ċ import Ġcom . intellij . workspace Model . storage . impl . Abstract Entity Storage Ċ import Ġcom . intellij . workspace Model . storage . impl . EntityId Ċ import Ġcom . intellij . workspace Model . storage . impl . Mod ifiable Workspace Entity Base Ċ import Ġcom . intellij . workspace Model . storage . impl . Workspace Entity Base Ċ import Ġcom . intellij . workspace Model . storage . impl . containers . copy Ċ import Ġcom . intellij . workspace Model . storage . impl . containers . put All Ċ import Ġcom . intellij . workspace Model . storage . url . Mutable Virtual File Url Index Ċ import Ġcom . intellij . workspace Model . storage . url . Virtual File Url Ċ import Ġcom . intellij . workspace Model . storage . url . Virtual File Url Index Ċ import Ġit . un imi . ds i . fast util . objects . Object 2 Object Open HashMap Ċ import Ġit . un imi . ds i . fast util . objects . Object Open HashSet Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ /** Ċ Ġ* ĠEntity Id 2 V fu Ġmay Ġcontains Ġthese Ġpossible Ġvariants , Ġdue Ġto Ġmemory Ġoptimization : Ċ Ġ* Ġ 1 ) ĠObject 2 Object Open HashMap < EntityId , ĠPair < String , ĠVirtual File Url >> Ċ Ġ* Ġ 2 ) ĠObject 2 Object Open HashMap < EntityId , ĠPair < String , ĠObject Open HashSet < Virtual File Url >>> Ċ Ġ* Ġ 3 ) ĠObject 2 Object Open HashMap < EntityId , ĠObject 2 Object Open HashMap < String , ĠVirtual File Url >> Ċ Ġ* Ġ 4 ) ĠObject 2 Object Open HashMap < EntityId , ĠObject 2 Object Open HashMap < String , ĠObject Open HashSet < Virtual File Url >>> Ċ Ġ*/ Ċ internal Ġtype alias ĠEntity Id 2 V fu Ġ= ĠObject 2 Object Open HashMap < EntityId , ĠAny > Ċ internal Ġtype alias ĠV fu 2 EntityId Ġ= ĠObject 2 Object Open HashMap < Virtual File Url , ĠObject 2 Object Open HashMap < String , ĠEntity Id >> Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ open Ġclass ĠVirtual File Index Ġinternal Ġconstructor ( ĊĠ Ġinternal Ġopen Ġval Ġentity Id 2 Virtual File Url : ĠEntity Id 2 V fu , ĊĠ Ġinternal Ġopen Ġval Ġv fu 2 EntityId : ĠV fu 2 EntityId , ĊĠ Ġinternal Ġopen Ġval Ġentity Id 2 Jar Dir : ĠBid irectional Multi Map < EntityId , ĠVirtual File Url > Ċ ): ĠVirtual File Url Index Ġ{ ĊĠ Ġprivate Ġlateinit Ġvar Ġentity Storage : ĠAbstract Entity Storage ĊĠ Ġconstructor () Ġ: Ġthis ( EntityId 2 V fu (), ĠV fu 2 EntityId (), ĠBid irectional Multi Map ()) ĊĊĠ Ġinternal Ġfun Ġget Virtual Files ( id : ĠEntity Id ): ĠSet < Virtual File Url > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Virtual File Url >() ĊĠĠĠ Ġentity Id 2 Virtual File Url [ id ]?. also Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġvalue . values . forEach Ġ{ Ġv fu Ġ-> Ġresult . addAll ( get Virtual File Url ( v fu )) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġresult . addAll ( get Virtual File Url ( value . second !! )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġget Virtual File Url Info By EntityId ( id : ĠEntity Id ): ĠMap < String , ĠMutable Set < Virtual File Url >> Ġ{ ĊĠĠĠ Ġval Ġproperty 2 V fu Map Ġ= Ġentity Id 2 Virtual File Url [ id ] Ġ?: Ġreturn Ġempty Map () ĊĠĠĠ Ġval Ġcopied V fu Map Ġ= ĠHashMap < String , ĠMutable Set < Virtual File Url >>() ĊĠĠĠ Ġadd Virtual File Urls ToMap ( copied V fu Map , Ġproperty 2 V fu Map ) ĊĠĠĠ Ġreturn Ġcopied V fu Map ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd Virtual File Urls ToMap ( result : ĠHashMap < String , ĠMutable Set < Virtual File Url >>, Ġvalue : ĠAny ) Ġ{ ĊĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġvalue . forEach Ġ{ Ġresult [ it . key Ġas ĠString ] Ġ= Ġget Virtual File Url ( it . value ) Ġ} ĊĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġresult [ value . first Ġas ĠString ] Ġ= Ġget Virtual File Url ( value . second !! ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Virtual File Url ( value : ĠAny ): ĠMutable Set < Virtual File Url > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠ Ġis ĠObject Open HashSet < *> Ġ-> ĠHashSet ( value Ġas ĠObject Open HashSet < Virtual File Url >) ĊĠĠĠĠĠ Ġelse Ġ-> Ġmutable Set Of ( value Ġas ĠVirtual File Url ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġfind Entities By Url ( file Url : ĠVirtual File Url ): ĠSequence < Pair < Workspace Entity , ĠString >> Ġ= ĊĠĠĠ Ġv fu 2 EntityId [ file Url ]?. as Sequence ()?. map NotNull Ġ{ ĊĠĠĠĠĠ Ġval Ġentity Data Ġ= Ġentity Storage . entity Data ById ( it . value ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠ Ġentity Data . create Entity ( entity Storage ) Ġto Ġit . key . substring ( it . value . toString (). length Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} Ġ?: Ġempty Sequence () ĊĊĠ Ġfun Ġget Indexed Jar Directories () Ġ= Ġentity Id 2 Jar Dir . values ĊĊĠ Ġinternal Ġfun Ġset Typed Entity Storage ( storage : ĠAbstract Entity Storage ) Ġ{ ĊĠĠĠ Ġentity Storage Ġ= Ġstorage ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġassert Consistency () Ġ{ ĊĠĠĠ Ġval Ġexisting V fu In First Map Ġ= ĠHashSet < Virtual File Url >() ĊĠĠĠ Ġthis . entityId 2 Virtual File Url . forEach Ġ{ Ġ( entityId , Ġproperty 2 V fu ) Ġ-> ĊĠĠĠĠĠ Ġfun Ġassert Property 2 V fu ( property : ĠString , Ġvf us : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv fu Set Ġ= Ġif Ġ( vf us Ġis ĠSet <* >) Ġ( vf us Ġas ĠObject Open HashSet < Virtual File Url >) Ġ Ġelse Ġmutable Set Of ( vf us Ġas ĠVirtual File Url ) ĊĠĠĠĠĠĠĠ Ġv fu Set . forEach Ġ{ Ġv fu Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġexisting V fu In First Map . add ( v fu ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproperty 2 EntityId Ġ= Ġthis . v fu 2 EntityId [ v fu ] ĊĠĠĠĠĠĠĠĠĠ Ġassert ( property 2 EntityId Ġ!= Ġnull ) Ġ{ Ġ" Virtual File Url : Ġ$ v fu Ġexists Ġin Ġthe Ġfirst Ġcollection Ġby ĠEntity Id : Ġ$ entityId Ġwith ĠProperty : Ġ$ property Ġbut Ġabsent Ġat Ġother " Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Key Ġ= Ġget Composite Key ( entityId , Ġproperty ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġexisting EntityId Ġ= Ġproperty 2 EntityId ! ![ composite Key ] ĊĠĠĠĠĠĠĠĠĠ Ġassert ( existing EntityId Ġ!= Ġnull ) Ġ{ Ġ" Virtual File Url : Ġ$ v fu Ġexist Ġin Ġboth Ġmaps Ġbut ĠEntity Id : Ġ$ entityId Ġwith ĠProperty : Ġ$ property Ġabsent Ġat Ġother " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġwhen Ġ( property 2 V fu ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġproperty 2 V fu . forEach Ġ{ Ġ( property , Ġvf us ) Ġ-> Ġassert Property 2 V fu ( property Ġas ĠString , Ġvf us ) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġassert Property 2 V fu ( property 2 V fu . first Ġas ĠString , Ġproperty 2 V fu . second !! ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġexisting V fu I Second Map Ġ= Ġthis . v fu 2 EntityId . keys ĊĠĠĠ Ġassert ( existing V fu In First Map . size Ġ== Ġexisting V fu I Second Map . size ) Ġ{ Ġ" Different Ġcount Ġof ĠVirtual File Urls ĠEntity Id 2 Virtual File Url : Ġ${ existing V fu In First Map . size } ĠV fu 2 EntityId : Ġ${ existing V fu I Second Map . size }" Ġ} ĊĠĠĠ Ġexisting V fu In First Map . removeAll ( existing V fu I Second Map ) ĊĠĠĠ Ġassert ( existing V fu In First Map . isEmpty ()) Ġ{ Ġ" Both Ġmaps Ġcontain Ġthe Ġsame Ġamount Ġof ĠVirtual File Urls Ġbut Ġthey Ġare Ġdifferent " Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġget Composite Key ( entityId : ĠEntity Id , ĠpropertyName : ĠString ) Ġ= Ġ"${ entityId }_ $ propertyName " ĊĊĠ Ġclass ĠMutable Virtual File Index Ġprivate Ġconstructor ( ĊĠĠĠ Ġ// ĠDo Ġnot Ġwrite Ġto Ġ[ entityId 2 Virtual File Url ] Ġ Ġand Ġ[ v fu 2 EntityId ] Ġdirectly ! ĠCreate Ġa Ġdedicated Ġmethod Ġfor Ġthat ĊĠĠĠ Ġ// Ġand Ġcall Ġ[ start Write ] Ġbefore Ġwrite . ĊĠĠĠ Ġoverride Ġvar Ġentity Id 2 Virtual File Url : ĠEntity Id 2 V fu , ĊĠĠĠ Ġoverride Ġvar Ġv fu 2 EntityId : ĠV fu 2 EntityId , ĊĠĠĠ Ġoverride Ġvar Ġentity Id 2 Jar Dir : ĠBid irectional Multi Map < EntityId , ĠVirtual File Url > ĊĠ Ġ) Ġ: ĠVirtual File Index ( entityId 2 Virtual File Url , Ġv fu 2 EntityId , Ġentity Id 2 Jar Dir ), ĠMutable Virtual File Url Index Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġfreezed Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġindex ( entity : ĠWorkspace Entity , ĠpropertyName : ĠString , Ġvirtual File Url : ĠVirtual File Url ?) Ġ{ ĊĠĠĠĠĠ Ġindex (( entity Ġas ĠWorkspace Entity Base ). id , ĠpropertyName , Ġvirtual File Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġindex ( id : ĠEntity Id , ĠpropertyName : ĠString , Ġvirtual File Urls : ĠSet < Virtual File Url >) Ġ{ ĊĠĠĠĠĠ Ġstart Write () ĊĠĠĠĠĠ Ġval Ġnew Virtual File Urls Ġ= ĠHashSet ( virtual File Urls ) ĊĠĠĠĠĠ Ġfun Ġclean Existing V fu ( existing V fu : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( existing V fu ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠSet < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting V fu Ġas ĠObject Open HashSet < Virtual File Url > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting V fu . remove If Ġ{ Ġv fu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Removed Ġ= Ġnew Virtual File Urls . remove ( v fu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element Removed ) Ġremove From V fu 2 EntityId Map ( id , ĠpropertyName , Ġv fu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ remove If Ġ! element Removed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing V fu . isEmpty ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting V fu Ġas ĠVirtual File Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Removed Ġ= Ġnew Virtual File Urls . remove ( existing V fu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element Removed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove From V fu 2 EntityId Map ( id , ĠpropertyName , Ġexisting V fu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġproperty 2 V fu Ġ= Ġentity Id 2 Virtual File Url [ id ] ĊĠĠĠĠĠ Ġif Ġ( property 2 V fu Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( property 2 V fu ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting V fu Ġ= Ġproperty 2 V fu [ propertyName ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing V fu Ġ!= Ġnull Ġ&& Ġclean Existing V fu ( existing V fu )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu . remove ( propertyName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property 2 V fu . isEmpty ()) Ġentity Id 2 Virtual File Url . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting PropertyName Ġ= Ġproperty 2 V fu . first Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing PropertyName Ġ== ĠpropertyName Ġ&& Ġclean Existing V fu ( property 2 V fu . second !! )) Ġentity Id 2 Virtual File Url . remove ( id ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġnew Virtual File Urls . forEach Ġ{ Ġindex Virtual File Url ( id , ĠpropertyName , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġindex Jar Directories ( id : ĠEntity Id , Ġvirtual File Urls : ĠSet < Virtual File Url >) Ġ{ ĊĠĠĠĠĠ Ġentity Id 2 Jar Dir . remove Key ( id ) ĊĠĠĠĠĠ Ġif Ġ( virtual File Urls . isEmpty ()) Ġreturn ĊĠĠĠĠĠ Ġvirtual File Urls . forEach Ġ{ Ġentity Id 2 Jar Dir . put ( id , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġindex ( id : ĠEntity Id , ĠpropertyName : ĠString , Ġvirtual File Url : ĠVirtual File Url ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġstart Write () ĊĠĠĠĠĠ Ġremove By Property From Indexes ( id , ĠpropertyName ) ĊĠĠĠĠĠ Ġif Ġ( virtual File Url Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠ Ġindex Virtual File Url ( id , ĠpropertyName , Ġvirtual File Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġupdate Index ( old Id : ĠEntity Id , Ġnew Id : ĠEntity Id , Ġold Index : ĠVirtual File Index ) Ġ{ ĊĠĠĠĠĠ Ġold Index . get Virtual File Url Info By EntityId ( old Id ). forEach Ġ{ Ġ( property , Ġvf us ) Ġ-> Ġindex ( new Id , Ġproperty , Ġvf us ) Ġ} ĊĠĠĠĠĠ Ġold Index . entityId 2 Jar Dir . getValues ( old Id ). apply Ġ{ Ġindex Jar Directories ( new Id , Ġthis . toSet ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġremove Records By EntityId ( id : ĠEntity Id ) Ġ{ ĊĠĠĠĠĠ Ġstart Write () ĊĠĠĠĠĠ Ġentity Id 2 Jar Dir . remove Key ( id ) ĊĠĠĠĠĠ Ġval Ġremoved Value Ġ= Ġentity Id 2 Virtual File Url . remove ( id ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġwhen Ġ( removed Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġremoved Value . forEach Ġ{ Ġ( property , Ġv fu ) Ġ-> Ġremove From V fu 2 EntityId Map ( id , Ġproperty Ġas ĠString , Ġv fu ) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġremove From V fu 2 EntityId Map ( id , Ġremoved Value . first Ġas ĠString , Ġremoved Value . second !! ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġinternal Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠ Ġstart Write () ĊĠĠĠĠĠ Ġentity Id 2 Virtual File Url . clear () ĊĠĠĠĠĠ Ġv fu 2 EntityId . clear () ĊĠĠĠĠĠ Ġentity Id 2 Jar Dir . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġinternal Ġfun Ġcopy From ( another : ĠVirtual File Index ) Ġ{ ĊĠĠĠĠĠ Ġstart Write () ĊĠĠĠĠĠ Ġentity Id 2 Virtual File Url . put All ( another . entityId 2 Virtual File Url ) ĊĠĠĠĠĠ Ġv fu 2 EntityId . put All ( another . v fu 2 EntityId ) ĊĠĠĠĠĠ Ġentity Id 2 Jar Dir . put All ( another . entityId 2 Jar Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Write () Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! free zed ) Ġreturn ĊĠĠĠĠĠ Ġfreezed Ġ= Ġfalse ĊĠĠĠĠĠ Ġentity Id 2 Virtual File Url Ġ= Ġcopy Entity Map ( entityId 2 Virtual File Url ) ĊĠĠĠĠĠ Ġv fu 2 EntityId Ġ= Ġcopy V fu Map ( v fu 2 EntityId ) ĊĠĠĠĠĠ Ġentity Id 2 Jar Dir Ġ= Ġentity Id 2 Jar Dir . copy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Immutable (): ĠVirtual File Index Ġ{ ĊĠĠĠĠĠ Ġfreezed Ġ= Ġtrue ĊĠĠĠĠĠ Ġreturn ĠVirtual File Index ( entityId 2 Virtual File Url , Ġv fu 2 EntityId , Ġentity Id 2 Jar Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġindex Virtual File Url ( id : ĠEntity Id , ĠpropertyName : ĠString , Ġvirtual File Url : ĠVirtual File Url ) Ġ{ ĊĠĠĠĠĠ Ġval Ġproperty 2 V fu Ġ= Ġentity Id 2 Virtual File Url [ id ] ĊĊĠĠĠĠĠ Ġfun Ġadd V fu To PropertyName ( v fu : ĠAny ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v fu Ġis ĠObject Open HashSet <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ( v fu Ġas ĠObject Open HashSet < Virtual File Url >). add ( virtual File Url ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġv fu ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcreate Small Memory Footprint Set < Virtual File Url >() ĊĠĠĠĠĠĠĠĠĠ Ġresult . add ( v fu Ġas ĠVirtual File Url ) ĊĠĠĠĠĠĠĠĠĠ Ġresult . add ( virtual File Url ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( property 2 V fu Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Property 2 V fu Ġ= Ġwhen Ġ( property 2 V fu ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu Ġas ĠObject 2 Object Open HashMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv fu Ġ= Ġproperty 2 V fu [ propertyName ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v fu Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu [ propertyName ] Ġ= Ġvirtual File Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu [ propertyName ] Ġ= Ġadd V fu To PropertyName ( v fu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty 2 V fu Ġas ĠPair < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property 2 V fu . first Ġ!= ĠpropertyName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcreate Small Memory Footprint Map < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ property 2 V fu . first ] Ġ= Ġproperty 2 V fu . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ propertyName ] Ġ= Ġvirtual File Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( propertyName , Ġadd V fu To PropertyName ( property 2 V fu . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Property 2 V fu Ġ!= Ġnull ) Ġentity Id 2 Virtual File Url [ id ] Ġ= Ġnew Property 2 V fu ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġentity Id 2 Virtual File Url [ id ] Ġ= ĠPair ( propertyName , Ġvirtual File Url ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġproperty 2 EntityId Ġ= Ġv fu 2 EntityId . get OrDefault ( virtual File Url , ĠObject 2 Object Open HashMap ()) ĊĠĠĠĠĠ Ġproperty 2 EntityId [ get Composite Key ( id , propertyName )] Ġ= Ġid ĊĠĠĠĠĠ Ġv fu 2 EntityId [ virtual File Url ] Ġ= Ġproperty 2 EntityId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove By Property From Indexes ( id : ĠEntity Id , ĠpropertyName : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġval Ġproperty 2 v fu Ġ= Ġentity Id 2 Virtual File Url [ id ] Ġ?: Ġreturn ĊĠĠĠĠĠ Ġwhen Ġ( property 2 v fu ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠObject 2 Object Open HashMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġproperty 2 v fu Ġas ĠObject 2 Object Open HashMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠ Ġval Ġv fu Ġ= Ġproperty 2 v fu . remove ( propertyName ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( property 2 v fu . isEmpty ()) Ġentity Id 2 Virtual File Url . remove ( id ) ĊĠĠĠĠĠĠĠĠĠ Ġremove From V fu 2 EntityId Map ( id , ĠpropertyName , Ġv fu ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġexisting PropertyName Ġ= Ġproperty 2 v fu . first Ġas ĠString ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing PropertyName Ġ!= ĠpropertyName ) Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġentity Id 2 Virtual File Url . remove ( id ) ĊĠĠĠĠĠĠĠĠĠ Ġremove From V fu 2 EntityId Map ( id , ĠpropertyName , Ġproperty 2 v fu . second !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove From V fu 2 EntityId Map ( id : ĠEntity Id , Ġproperty : ĠString , Ġvf us : ĠAny ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( vf us ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSet < *> Ġ-> Ġvf us . forEach Ġ{ Ġremove From V fu 2 EntityId Map ( id , Ġproperty , Ġit Ġas ĠVirtual File Url ) Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġremove From V fu 2 EntityId Map ( id , Ġproperty , Ġvf us Ġas ĠVirtual File Url ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove From V fu 2 EntityId Map ( id : ĠEntity Id , ĠpropertyName : ĠString , Ġv fu : ĠVirtual File Url ) Ġ{ ĊĠĠĠĠĠ Ġval Ġproperty 2 EntityId Ġ= Ġv fu 2 EntityId [ v fu ] ĊĠĠĠĠĠ Ġif Ġ( property 2 EntityId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . error (" The Ġrecord Ġfor Ġ$ id Ġ< => Ġ${ v fu } Ġshould Ġbe Ġavailable Ġin Ġboth Ġmaps ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġproperty 2 EntityId . remove ( get Composite Key ( id , propertyName )) ĊĠĠĠĠĠ Ġif Ġ( property 2 EntityId . isEmpty ()) Ġv fu 2 EntityId . remove ( v fu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Entity Map ( origin Map : ĠEntity Id 2 V fu ): ĠEntity Id 2 V fu { ĊĠĠĠĠĠ Ġval Ġcopied Map Ġ= ĠEntity Id 2 V fu () ĊĠĠĠĠĠ Ġfun Ġget Virtual File Url ( value : ĠAny ) Ġ= Ġif Ġ( value Ġis ĠSet <* >) ĠObject Open HashSet ( value Ġas ĠSet < Virtual File Url >) Ġelse Ġvalue ĊĊĠĠĠĠĠ Ġorigin Map . forEach { Ġ( entityId , Ġv fu Map ) Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v fu Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv fu Map Ġas ĠMap < String , Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied V fu Map Ġ= ĠObject 2 Object Open HashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv fu Map . forEach Ġ{ Ġcopied V fu Map [ it . key ] Ġ= Ġget Virtual File Url ( it . value !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Map [ entityId ] Ġ= Ġcopied V fu Map ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied V fu Pair Ġ= ĠPair ( v fu Map . first Ġas ĠString , Ġget Virtual File Url ( v fu Map . second !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Map [ entityId ] Ġ= Ġcopied V fu Pair ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġcopied Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy V fu Map ( origin Map : ĠV fu 2 EntityId ): ĠV fu 2 EntityId { ĊĠĠĠĠĠ Ġval Ġcopied Map Ġ= ĠV fu 2 EntityId () ĊĠĠĠĠĠ Ġorigin Map . forEach { Ġ( key , Ġvalue ) Ġ-> Ġcopied Map [ key ] Ġ= ĠObject 2 Object Open HashMap ( value ) Ġ} ĊĠĠĠĠĠ Ġreturn Ġcopied Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġlogger < Mutable Virtual File Index >() ĊĠĠĠĠĠ Ġconst Ġval ĠV IRTUAL _ FILE _ INDEX _ ENTITY _ SOURCE _ PROPERTY Ġ= Ġ" entity Source " ĊĠĠĠĠĠ Ġfun Ġfrom ( other : ĠVirtual File Index ): ĠMutable Virtual File Index Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠMutable Virtual File Index ) Ġother . free zed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn ĠMutable Virtual File Index ( other . entityId 2 Virtual File Url , Ġother . v fu 2 EntityId , Ġother . entityId 2 Jar Dir ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ //---------------------------------------------------------------- ----- Ċ class ĠVirtual File Url Property < T Ġ: ĠMod ifiable Workspace Entity Base < out ĠWorkspace Entity Base >> Ġ: ĠRead Write Property < T , ĠVirtual File Url > Ġ{ ĊĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠT , Ġproperty : ĠK Property < *> ): ĠVirtual File Url Ġ{ ĊĠĠĠ Ġreturn Ġ(( this Ref . original :: class . member Properties . first Ġ{ Ġit . name Ġ== Ġproperty . name Ġ}) Ġas ĠK Property 1 < Any , Ġ* >) ĊĠĠĠĠĠ Ġ. get ( this Ref . original ) Ġas ĠVirtual File Url ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠT , Ġproperty : ĠK Property <* >, Ġvalue : ĠVirtual File Url ) Ġ{ ĊĠĠĠ Ġif Ġ(! this Ref . modifiable . get ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Mod ifications Ġare Ġallowed Ġinside Ġ' add Entity ' Ġand Ġ' modify Entity ' Ġmethods Ġonly !") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfield Ġ= Ġthis Ref . original . java Class . getDeclared Field ( property . name ) ĊĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġfield . set ( this Ref . original , Ġvalue ) ĊĠĠĠ Ġthis Ref . diff . indexes . virtual File Index . index ( this Ref . id , Ġproperty . name , Ġvalue ) ĊĠ Ġ} Ċ } Ċ Ċ //---------------------------------------------------------------- ----- Ċ class ĠVirtual File Url Nullable Property < T Ġ: ĠMod ifiable Workspace Entity Base < out ĠWorkspace Entity Base >> Ġ: ĠRead Write Property < T , ĠVirtual File Url ?> Ġ{ ĊĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠT , Ġproperty : ĠK Property < *> ): ĠVirtual File Url ? Ġ{ ĊĠĠĠ Ġreturn Ġ(( this Ref . original :: class . member Properties . first Ġ{ Ġit . name Ġ== Ġproperty . name Ġ}) Ġas ĠK Property 1 < Any , Ġ* >) ĊĠĠĠĠĠ Ġ. get ( this Ref . original ) Ġas ĠVirtual File Url ? ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠT , Ġproperty : ĠK Property <* >, Ġvalue : ĠVirtual File Url ?) Ġ{ ĊĠĠĠ Ġif Ġ(! this Ref . modifiable . get ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Mod ifications Ġare Ġallowed Ġinside Ġ' add Entity ' Ġand Ġ' modify Entity ' Ġmethods Ġonly !") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfield Ġ= Ġthis Ref . original . java Class . getDeclared Field ( property . name ) ĊĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġfield . set ( this Ref . original , Ġvalue ) ĊĠĠĠ Ġthis Ref . diff . indexes . virtual File Index . index ( this Ref . id , Ġproperty . name , Ġvalue ) ĊĠ Ġ} Ċ } Ċ Ċ //---------------------------------------------------------------- ----- Ċ class ĠVirtual File Url List Property < T Ġ: ĠMod ifiable Workspace Entity Base < out ĠWorkspace Entity Base >> Ġ: ĠRead Write Property < T , ĠList < Virtual File Url >> Ġ{ ĊĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠT , Ġproperty : ĠK Property < *> ): ĠList < Virtual File Url > Ġ{ ĊĠĠĠ Ġreturn Ġ(( this Ref . original :: class . member Properties . first Ġ{ Ġit . name Ġ== Ġproperty . name Ġ}) Ġas ĠK Property 1 < Any , Ġ* >) ĊĠĠĠĠĠ Ġ. get ( this Ref . original ) Ġas ĠList < Virtual File Url > ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠT , Ġproperty : ĠK Property <* >, Ġvalue : ĠList < Virtual File Url >) Ġ{ ĊĠĠĠ Ġif Ġ(! this Ref . modifiable . get ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Mod ifications Ġare Ġallowed Ġinside Ġ' add Entity ' Ġand Ġ' modify Entity ' Ġmethods Ġonly !") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfield Ġ= Ġthis Ref . original . java Class . getDeclared Field ( property . name ) ĊĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġfield . set ( this Ref . original , Ġvalue ) ĊĠĠĠ Ġthis Ref . diff . indexes . virtual File Index . index ( this Ref . id , Ġproperty . name , Ġvalue . to HashSet ()) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġdelegate Ġwas Ġcreated Ġspecifically Ġfor Ġthe Ġhandling ĠVirtual File Urls Ġfrom ĠLibrary Root Ċ Ġ*/ Ċ class ĠVirtual File Url Library Root Property < T Ġ: ĠMod ifiable Workspace Entity Base < out ĠWorkspace Entity Base >> Ġ: ĠRead Write Property < T , ĠList < Library Root >> Ġ{ ĊĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠT , Ġproperty : ĠK Property < *> ): ĠList < Library Root > Ġ{ ĊĠĠĠ Ġreturn Ġ(( this Ref . original :: class . member Properties . first Ġ{ Ġit . name Ġ== Ġproperty . name Ġ}) Ġas ĠK Property 1 < Any , Ġ* >) ĊĠĠĠĠĠ Ġ. get ( this Ref . original ) Ġas ĠList < Library Root > ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠT , Ġproperty : ĠK Property <* >, Ġvalue : ĠList < Library Root >) Ġ{ ĊĠĠĠ Ġif Ġ(! this Ref . modifiable . get ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Mod ifications Ġare Ġallowed Ġinside Ġ' add Entity ' Ġand Ġ' modify Entity ' Ġmethods Ġonly !") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfield Ġ= Ġthis Ref . original . java Class . getDeclared Field ( property . name ) ĊĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġfield . set ( this Ref . original , Ġvalue ) ĊĊĠĠĠ Ġval Ġjar Directories Ġ= Ġmutable Set Of < Virtual File Url >() ĊĠĠĠ Ġthis Ref . diff . indexes . virtual File Index . index ( this Ref . id , Ġproperty . name , Ġvalue . map Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . in clusion Options Ġ!= ĠLibrary Root . In clusion Options . ROOT _ IT SELF ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjar Directories . add ( it . url ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġit . url ĊĠĠĠ Ġ}. to HashSet ()) ĊĠĠĠ Ġthis Ref . diff . indexes . virtual File Index . index Jar Directories ( this Ref . id , Ġjar Directories ) ĊĠ Ġ} Ċ }