/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . mode lix . model . area Ċ Ċ import Ġorg . mode lix . model . api .* Ċ Ċ class ĠArea With Mount s ( val Ġroot Area : ĠI Area , Ġmount s : ĠMap < IN ode , ĠI Area >) Ġ: ĠI Area Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmount s : ĠMap < IN ode , ĠI Area > ĊĠĠĠ Ġprivate Ġval Ġmounted Root 2 hidden Node : ĠMap < IN ode , ĠI Node > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . mount s Ġ= ĠHashMap ( mount s ) ĊĠĠĠĠĠĠĠ Ġthis . mounted Root 2 hidden Node Ġ= Ġmount s . entries . associate By ({ Ġit . value . getRoot () Ġ}, Ġ{ Ġit . key Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Concept ( ref : ĠI Concept Reference ): ĠI Concept ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetAll Areas (). map Ġ{ Ġit . resolve Concept ( ref ) Ġ}. find Ġ{ Ġit Ġ!= Ġnull Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Branch ( id : ĠString ): ĠI Branch ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( area Ġin ĠgetAll Areas ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġarea . resolve Branch ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ!= Ġnull ) Ġreturn Ġresolved ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcollect Areas (): ĠList < I Area > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( this ) Ġ+ Ġmount s . values . flatMap Ġ{ Ġit . collect Areas () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Hidden Node ( mounted Area Root : ĠI Node ): ĠI Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmount s . entries . find Ġ{ Ġit . value . getRoot () Ġ== Ġmounted Area Root Ġ} ?. key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mount ed Area ( hidden Root : ĠI Node ): ĠI Area ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmount s [ hidden Root ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mount ed Area Root ( hidden Root : ĠI Node ): ĠI Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Mount ed Area ( hidden Root )?. getRoot () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Root (): ĠI Node Ġ= ĠNode Wrapper ( root Area . getRoot ()) ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Node ( ref : ĠI Node Reference ): ĠI Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( area Ġin ĠgetAll Areas ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġarea . resolve Node ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ!= Ġnull Ġ&& Ġis Visible ( resolved )) Ġreturn ĠNode Wrapper ( resolved ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Original Node ( ref : ĠI Node Reference ): ĠI Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( area Ġin ĠgetAll Areas ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġarea . resolve Original Node ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ!= Ġnull Ġ&& Ġis Visible ( resolved )) Ġreturn Ġresolved ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Visible ( node : ĠI Node ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Root Ġ= Ġget Root () ĊĠĠĠĠĠĠĠ Ġvar Ġactual Root : ĠI Node Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠI Node ? Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Root Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġactual Root Ġ== Ġexpected Root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetAll Areas () Ġ= ĠlistOf ( root Area ) Ġ+ Ġmount s . values ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġexecute Read ( f : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Area . offer ( this ) Ġ{ ĠgetAll Areas (). fold ( f ) Ġ{ Ġf 2 : Ġ() Ġ-> ĠT , Ġa : ĠI Area Ġ-> Ġ{ Ġa . execute Read ( f 2 ) Ġ} Ġ} () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġexecute Write ( f : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Area . offer ( this ) Ġ{ ĠgetAll Areas (). fold ( f ) Ġ{ Ġf 2 : Ġ() Ġ-> ĠT , Ġa : ĠI Area Ġ-> Ġ{ Ġa . execute Write ( f 2 ) Ġ} Ġ} () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Read (): ĠBoolean Ġ= ĠgetAll Areas (). all Ġ{ Ġit . can Read () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Write (): ĠBoolean Ġ= ĠgetAll Areas (). all Ġ{ Ġit . can Write () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( l : ĠI Area Listener ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Listener ( l : ĠI Area Listener ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunwrap Node ( node : ĠI Node ): ĠI Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( node Ġis ĠNode Wrapper Ġ&& Ġnode . get Area () Ġ== Ġthis ) Ġnode . node Ġelse Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġthis :: class Ġ!= Ġother :: class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠArea With Mount s ĊĊĠĠĠĠĠĠĠ Ġif Ġ( root Area Ġ!= Ġother . root Area ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( mount s Ġ!= Ġother . mount s ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġroot Area . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġmount s . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Reference (): ĠI Area Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠArea Reference ( root Area . getReference (), Ġmount s . keys . map Ġ{ Ġit . reference Ġ}, Ġmount s . values . map Ġ{ Ġit . getReference () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Area ( ref : ĠI Area Reference ): ĠI Area ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getReference () Ġ== Ġref ) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġfor Ġ( area Ġin ĠlistOf ( root Area ) Ġ+ Ġmount s . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġarea . resolve Area ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ!= Ġnull ) Ġreturn Ġresolved ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠArea Reference ( ĊĠĠĠĠĠĠĠ Ġval Ġroot Area : ĠI Area Reference , ĊĠĠĠĠĠĠĠ Ġval Ġmount Keys : ĠList < IN ode Reference >, ĊĠĠĠĠĠĠĠ Ġval Ġmount Values : ĠList < I Area Reference > ĊĠĠĠ Ġ) Ġ: ĠI Area Reference ĊĊĠĠĠ Ġinner Ġclass ĠNode Wrapper ( val Ġnode : ĠI Node ) Ġ: ĠI Node , ĠI Node Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Wrapped Node (): ĠI Node Ġ= Ġnode ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Area (): ĠI Area Ġ= Ġthis @ Area With Mount s ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Children ( role : ĠString ?): ĠIterable < IN ode > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . getChildren ( role ). map Ġ{ ĠNode Wrapper ( get Mount ed Area ( it )?. getRoot () Ġ?: Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Child ( child : ĠI Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhidden Node Ġ= Ġget Hidden Node ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hidden Node Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . removeChild ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Cannot Ġdelete Ġa Ġmounted Ġnode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠisValid : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnode . isValid ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġreference : ĠI Node Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġconcept : ĠI Concept ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnode . concept ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġrole In Parent : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhidden Node Ġ= Ġget Hidden Node ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( hidden Node Ġ== Ġnull ) Ġnode . role In Parent Ġelse Ġhidden Node . role In Parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġparent : ĠI Node ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhidden Node Ġ= Ġget Hidden Node ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( if Ġ( hidden Node Ġ== Ġnull ) Ġnode . parent Ġelse Ġhidden Node . parent )?. let Ġ{ ĠNode Wrapper ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġall Children : ĠIterable < IN ode > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnode . all Children . map Ġ{ ĠNode Wrapper ( get Mount ed Area ( it )?. getRoot () Ġ?: Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove Child ( role : ĠString ?, Ġindex : ĠInt , Ġchild : ĠI Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . move Child ( role , Ġindex , Ġunwrap Node ( child )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd New Child ( role : ĠString ?, Ġindex : ĠInt , Ġconcept : ĠI Concept ?): ĠI Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNode Wrapper ( node . add New Child ( role , Ġindex , Ġconcept )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Reference Target ( role : ĠString ): ĠI Node ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . getReference Target ( role )?. let Ġ{ ĠNode Wrapper ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Reference Target ( role : ĠString , Ġtarget : ĠI Node ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . set Reference Target ( role , Ġtarget ?. let Ġ{ Ġunwrap Node ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget PropertyValue ( role : ĠString ): ĠString ? Ġ= Ġnode . getProperty Value ( role ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset PropertyValue ( role : ĠString , Ġvalue : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . setProperty Value ( role , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetProperty Roles (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . getProperty Roles () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Reference Roles (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . getReference Roles () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġthis :: class Ġ!= Ġother :: class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠNode Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġother . node ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Area () Ġ!= Ġother . get Area ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġnode . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġget Area (). hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ