/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġem u fog Ġcontributors Ċ Ġ* Ċ Ġ* Ġ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 Ġem u fog . graph Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġrepresents Ġan Ġaut onomous Ġsystem Ġof Ġthe Ġnetwork Ġgraph . ĠHence Ġit 's Ġa Ġsub Ġgraph Ġof Ġthe Ġtotal Ġgraph Ġproviding Ċ Ġ* Ġaccess Ġto Ġits Ġnodes . Ċ Ġ* Ċ Ġ* Ġ@ property Ġid Ġunique Ġidentifier Ġof Ġthe Ġaut onomous Ġsystem Ċ Ġ* Ġ@ property Ġedge Nodes Ġall Ġedge Ġnodes Ġin Ġthis Ġaut onomous Ġsystem Ċ Ġ* Ġ@ property Ġback bone Nodes Ġall Ġback bone Ġnodes Ġin Ġthis Ġaut onomous Ġsystem Ċ Ġ* Ġ@ property Ġedge Device Nodes Ġall Ġedge Ġdevice Ġnodes Ġin Ġthis Ġaut onomous Ġsystem Ċ Ġ*/ Ċ class ĠAS Ġinternal Ġconstructor ( val Ġid : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġedges : ĠMutable Map < Int , ĠEdge Node > Ġ= ĠHashMap () ĊĊĠĠĠ Ġprivate Ġval Ġback bones : ĠMutable Map < Int , ĠBackbone Node > Ġ= ĠHashMap () ĊĊĠĠĠ Ġprivate Ġval Ġedge Devices : ĠMutable Map < Int , ĠEdge Device Node > Ġ= ĠHashMap () ĊĊĠĠĠ Ġval Ġedge Nodes : ĠCollection < Edge Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġedges . values ĊĊĠĠĠ Ġval Ġback bone Nodes : ĠCollection < Back bone Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġback bones . values ĊĊĠĠĠ Ġval Ġedge Device Nodes : ĠCollection < Edge Device Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġedge Devices . values ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġedge Ġnode Ġassociated Ġwith Ġthe Ġgiven ĠID Ġfrom Ġthe ĠAS . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġthe Ġedge Ġnode 's ĠID ĊĠĠĠĠ Ġ* Ġ@ return Ġnode Ġobject Ġor Ġ` null ` Ġif Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Edge Node ( id : ĠInt ): ĠEdge Node ? Ġ= Ġedges [ id ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġback bone Ġnode Ġassociated Ġwith Ġthe Ġgiven ĠID Ġfrom Ġthe ĠAS . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġthe Ġback bone Ġnode 's ĠID ĊĠĠĠĠ Ġ* Ġ@ return Ġnode Ġobject Ġor Ġ` null ` Ġif Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Back bone Node ( id : ĠInt ): ĠBackbone Node ? Ġ= Ġback bones [ id ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġedge Ġdevice Ġnode Ġassociated Ġwith Ġthe Ġgiven ĠID Ġfrom Ġthe ĠAS . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġthe Ġedge Ġdevice Ġnode 's ĠID ĊĠĠĠĠ Ġ* Ġ@ return Ġnode Ġobject Ġor Ġ` null ` Ġif Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Edge Device Node ( id : ĠInt ): ĠEdge Device Node ? Ġ= Ġedge Devices [ id ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnode Ġassociated Ġwith Ġthe Ġgiven ĠID Ġfrom Ġthe ĠAS . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġthe Ġnode 's ĠID ĊĠĠĠĠ Ġ* Ġ@ return Ġnode Ġobject Ġor Ġ` null ` Ġif Ġnot Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetNode ( id : ĠInt ): ĠNode ? Ġ= Ġedges [ id ] Ġ?: Ġback bones [ id ] Ġ?: Ġedge Devices [ id ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġgiven Ġnode Ġinstance Ġand Ġreplaces Ġit Ġwith Ġan Ġedge Ġnode . ĠThe Ġnewly Ġcreated Ġedge Ġnode Ġcontains Ġthe Ġsame ĊĠĠĠĠ Ġ* Ġproperties Ġas Ġthe Ġgiven Ġnode . ĠThe Ġnode Ġhas Ġto Ġbe Ġpart Ġof Ġthis Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġnode Ġto Ġreplace Ġby Ġan Ġedge Ġnode ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnewly Ġcreated Ġedge Ġnode Ġwith Ġthe Ġsame Ġproperties ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġnode 's Ġsystem Ġdoes Ġnot Ġequal Ġthis Ġobject ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġnode Ġis Ġnot Ġpart Ġof Ġthis Ġsystem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreplace By Edge Node ( node : ĠNode ): ĠEdge Node Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Node For Replacement ( node ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Edge Node ( node . id , Ġnode . edges , Ġnode . em ulation Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġgiven Ġnode Ġinstance Ġand Ġreplaces Ġit Ġwith Ġa Ġback bone Ġnode . ĠThe Ġnewly Ġcreated Ġedge Ġnode Ġcontains Ġthe ĊĠĠĠĠ Ġ* Ġsame Ġproperties Ġas Ġthe Ġgiven Ġnode . ĠThe Ġnode Ġhas Ġto Ġbe Ġpart Ġof Ġthis Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġnode Ġto Ġreplace Ġby Ġa Ġback bone Ġnode ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnewly Ġcreated Ġback bone Ġnode Ġwith Ġthe Ġsame Ġproperties ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġnode 's Ġsystem Ġdoes Ġnot Ġequal Ġthis Ġobject ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġnode Ġis Ġnot Ġpart Ġof Ġthis Ġsystem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreplace By Back bone Node ( node : ĠNode ): ĠBackbone Node Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Node For Replacement ( node ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Back bone Node ( node . id , Ġnode . edges , Ġnode . em ulation Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġgiven Ġnode Ġinstance Ġand Ġreplaces Ġit Ġwith Ġan Ġedge Ġdevice Ġnode . ĠThe Ġnewly Ġcreated Ġedge Ġnode Ġcontains ĊĠĠĠĠ Ġ* Ġthe Ġsame Ġproperties Ġas Ġthe Ġgiven Ġnode Ġand Ġalso Ġhas Ġthe Ġgiven Ġedge Ġem ulation Ġassociated Ġto Ġit . ĠThe Ġnode Ġhas Ġto Ġbe ĊĠĠĠĠ Ġ* Ġpart Ġof Ġthis Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġnode Ġto Ġreplace Ġby Ġan Ġedge Ġdevice Ġnode ĊĠĠĠĠ Ġ* Ġ@ param Ġem ulation Node Ġthe Ġedge Ġem ulation Ġnode Ġthis Ġdevice Ġwill Ġneed ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnewly Ġcreated Ġedge Ġdevice Ġnode Ġwith Ġthe Ġsame Ġproperties ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġnode 's Ġsystem Ġdoes Ġnot Ġequal Ġthis Ġobject ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġnode Ġis Ġnot Ġpart Ġof Ġthis Ġsystem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreplace By Edge Device Node ( node : ĠNode , Ġem ulation Node : ĠEdge Em ulation Node ): ĠEdge Device Node Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Node For Replacement ( node ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Edge Device Node ( node . id , Ġnode . edges , Ġem ulation Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġand Ġreturns Ġa Ġnew Ġedge Ġnode Ġin Ġthe Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġid Ġof Ġthe Ġnew Ġnode ĊĠĠĠĠ Ġ* Ġ@ return Ġnewly Ġcreated Ġedge Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġcreate Edge Node ( id : ĠInt ): ĠEdge Node Ġ= Ġcreate Edge Node ( id , Ġempty List (), Ġnull ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġand Ġreturns Ġa Ġnew Ġback bone Ġnode Ġin Ġthe Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġid Ġof Ġthe Ġnew Ġnode ĊĠĠĠĠ Ġ* Ġ@ return Ġnewly Ġcreated Ġback bone Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġcreate Back bone Node ( id : ĠInt ): ĠBackbone Node Ġ= Ġcreate Back bone Node ( id , Ġempty List (), Ġnull ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġand Ġreturns Ġa Ġnew Ġedge Ġdevice Ġnode Ġin Ġthe Ġaut onomous Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġid Ġof Ġthe Ġnew Ġnode ĊĠĠĠĠ Ġ* Ġ@ return Ġnewly Ġcreated Ġedge Ġdevice Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġcreate Edge Device Node ( id : ĠInt , Ġem ulation Node : ĠEdge Em ulation Node ): ĠEdge Device Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Edge Device Node ( id , Ġempty List (), Ġem ulation Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġif Ġthis Ġinstance Ġof Ġan Ġaut onomous Ġsystem Ġcontains Ġthe Ġgiven Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġnode Ġto Ġcheck Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġas Ġcontains Ġthis Ġnode , Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġcontains Node ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġback bones . containsKey ( node . id ) Ġ|| Ġedges . containsKey ( node . id ) Ġ|| Ġedge Devices . containsKey ( node . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Node For Replacement ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( node . system Ġ== Ġthis ) Ġ{ Ġ" The Ġnode : Ġ${ node . id } Ġto Ġreplace Ġis Ġnot Ġassigned Ġto Ġthe Ġas : Ġ$ id " Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! remove Node ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" The Ġnode : Ġ${ node . id } Ġto Ġreplace Ġcannot Ġbe Ġdeleted Ġfrom Ġthe Ġaut onomous Ġsystem ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Edge Device Node ( id : ĠInt , Ġedges : ĠList < Edge >, Ġem ulation Node : ĠEdge Em ulation Node ): ĠEdge Device Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġedge Device Node Ġ= ĠEdge Device Node ( id , Ġthis , Ġedges , Ġem ulation Node ) ĊĠĠĠĠĠĠĠ Ġedge Devices [ edge Device Node . id ] Ġ= Ġedge Device Node ĊĊĠĠĠĠĠĠĠ Ġreturn Ġedge Device Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Back bone Node ( id : ĠInt , Ġedges : ĠList < Edge >, Ġem ulation Node : ĠEm ulation Node ?): ĠBackbone Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġback bone Node Ġ= ĠBackbone Node ( id , Ġthis , Ġedges , Ġem ulation Node ) ĊĠĠĠĠĠĠĠ Ġback bones [ backbone Node . id ] Ġ= Ġback bone Node ĊĊĠĠĠĠĠĠĠ Ġreturn Ġback bone Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Edge Node ( id : ĠInt , Ġedges : ĠList < Edge >, Ġem ulation Node : ĠEm ulation Node ?): ĠEdge Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġedge Node Ġ= ĠEdge Node ( id , Ġthis , Ġedges , Ġem ulation Node ) ĊĠĠĠĠĠĠĠ Ġthis . edges [ edge Node . id ] Ġ= Ġedge Node ĊĊĠĠĠĠĠĠĠ Ġreturn Ġedge Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Node ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġedges . remove ( node . id ) Ġ!= Ġnull Ġ|| Ġback bones . remove ( node . id ) Ġ!= Ġnull Ġ|| Ġedge Devices . remove ( node . id ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠAS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġid Ġ== Ġother . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġid ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" AS : Ġ$ id " Ċ }