package Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model Ċ Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model . instance .* Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model . property . Expression Resolver Context Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model . resolved . Resolved Node Template Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model . resolved . Resolved Relationship Template Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model . resolved . type . is Subtype Of Ċ Ċ data Ġclass ĠCompleted Relationship ( ĊĠĠĠ Ġval Ġsource : ĠString , ĊĠĠĠ Ġval Ġtarget : ĠString , ĊĠĠĠ Ġval Ġrequirement : ĠString , ĊĠĠĠ Ġval Ġcapability : ĠString , ĊĠĠĠ Ġval Ġrelationship Template : ĠResolved Relationship Template Ċ ) Ċ Ċ data Ġclass ĠCompleted Node ( ĊĠĠĠ Ġval Ġhost : ĠString ?, ĊĠĠĠ Ġval Ġnode Template : ĠResolved Node Template Ċ ) Ċ Ċ fun Ġcomplete Topology ( ĊĠĠĠ Ġresolved Node Templates : ĠMap < String , ĠResolved Node Template >, ĊĠĠĠ Ġresolved Relationship Templates : ĠMap < String , ĠResolved Relationship Template >, ĊĠĠĠ Ġre usable Types : ĠRe usable Types , ĊĠĠĠ Ġexpression Resolver Context : ĠExpression Resolver Context Ċ ): ĠPair < List < Node Instance >, ĠList < Relationship Instance >> Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġresolved Node Templates . map Values Ġ{ Ġ( node Template Name , Ġnode Template ) Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelationships Ġ= Ġnode Template . requirements . flatMap Ġ{ Ġ( requirement Name , Ġrequirement ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminimum NumberOf Relations Ġ= Ġrequirement . occ urrences . lower _ bound . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. minimum NumberOf Relations ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( target Node Template , Ġtarget Capability Name ) Ġ= Ġget Target Node Template And Capability ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Node Templates , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelationship Template Ġ= Ġresolved Relationship Template ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Resolver Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Relationship Templates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompleted Relationship ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Template . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Capability Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelationship Template ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġrelationships . find Ġ{ Ġit . requirement Ġ== Ġ" host " Ġ} ?. target ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Completed Node ( host , Ġnode Template ), Ġrelationships ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can Ġnot Ġcreate ĠRel ations Ġfor Ġnode Ġtemplate : Ġ$ node Template Name ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnodes Ġ= Ġmap . map Ġ{ Ġit . value . first Ġ}. map Ġ{ ĠNode Instance . from ( it ) Ġ} ĊĠĠĠ Ġval Ġrelationships Ġ= Ġmap . flatMap Ġ{ Ġit . value . second Ġ}. map Ġ{ ĠRelationship Instance . from ( it ) Ġ} ĊĠĠĠ Ġreturn ĠPair ( nodes , Ġrelationships ) Ċ } ĊĊ Ċ private Ġfun Ġget Target Node Template And Capability ( ĊĠĠĠ Ġrequirement : ĠRequirement Instance , ĊĠĠĠ Ġrequirement Name : ĠString , ĊĠĠĠ Ġsource Node Template : ĠResolved Node Template , ĊĠĠĠ Ġresolved Node Templates : ĠMap < String , ĠResolved Node Template >, ĊĠĠĠ Ġre usable Types : ĠRe usable Types Ċ ): ĠPair < Resolved Node Template , ĠString > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( requirement . node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNode Ref . NodeType Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Node Templates . values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġnode Template Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Template . type Info . is Subtype Of ( reusable Types . node Types . get ( requirement . node . type ). type Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Empty Ġ{ Ġthrow ĠIllegalArgumentException (" No Ġmatching Ġnode Ġfound Ġin Ġtopology Ġtemplate Ġwith Ġtype Ġ${ requirement . node . type . name }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġtarget Node Template Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Capability Name Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Target Capability ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Node Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Capability Name ?. let Ġ{ Ġtarget Node Template Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. single () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠNode Ref . Node Template Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget NodeName Ġ= Ġrequirement . node . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Node Template Ġ= Ġ( resolved Node Templates [ target NodeName ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" no Ġtarget Ġnode Ġtemplate Ġfor Ġrequirement Ġ$ requirement Name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Capability Ġ= Ġget Target Capability ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Node Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template Ġto Ġtarget Capability ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Target Capability ( ĊĠĠĠ Ġrequirement : ĠRequirement Instance , ĊĠĠĠ Ġsource Node Template : ĠResolved Node Template , ĊĠĠĠ Ġtarget Node Template : ĠResolved Node Template , ĊĠĠĠ Ġre usable Types : ĠRe usable Types Ċ ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( requirement . capability ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCap ability Ref . Capability Type Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Template . capabilities . toList (). find Ġ{ Ġ(_, Ġcapability ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapability . type . is Subtype Of ( requirement . capability . type ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapability . valid Source Types . map Ġ{ Ġre usable Types . node Types . get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. any Ġ{ Ġsource Node Template . type Info . is Subtype Of ( it . type Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. first Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġmatching Ġcapability Ġfound Ġfor Ġrequirement Ġ$ requirement \ n \ non Ġtarget Ġnode : Ġ$ target Node Template " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠCap ability Ref . Capability Definition Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġrequirement . capability . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapability Ġ= Ġ( target Node Template . capabilities [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" target Ġnode Ġdoes Ġnot Ġhave Ġcapability Ġ${ requirement . capability } ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Source Types Ġ= Ġcapability . valid Source Types . map Ġ{ Ġre usable Types . node Types . get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Source Types . none Ġ{ Ġsource Node Template . type Info . is Subtype Of ( it . type Info ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Source ĠNode Ġis Ġnot Ġa Ġsubtype Ġof Ġany Ġvalid Ġsource Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġresolved Relationship Template ( ĊĠĠĠ Ġrequirement : ĠRequirement Instance , ĊĠĠĠ Ġsource Node Template : ĠResolved Node Template , ĊĠĠĠ Ġtarget Node Template : ĠResolved Node Template , ĊĠĠĠ Ġexpression Resolver Context : ĠExpression Resolver Context , ĊĠĠĠ Ġresolved Relationship Templates : ĠMap < String , ĠResolved Relationship Template > Ċ ): ĠResolved Relationship Template Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( requirement . relationship ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRelationship Ref . Relationship Type Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResolved Relationship Template . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ source Node Template . name }-${ target Node Template . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement . relationship . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Resolver Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠRelationship Ref . Relationship Template Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Relationship Templates [ requirement . relationship . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Relationship Ġtemplate Ġdoes Ġnot Ġexist : Ġ${ requirement . relationship }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ