package Ġe pp Ċ Ċ import Ġast . cc . interfaces . CC Visitor Ċ import Ġast . cc . interfaces . Ch oreo graphy Body Ċ import Ġast . cc . nodes .* Ċ import Ġast . sp . interfaces . Behaviour Ċ import Ġast . sp . nodes .* Ċ import Ġutil . ch oreo graphy Statistics . Used Processes Ċ import Ġjavax . naming . Operation NotSupportedException Ċ import Ġkotlin . collections . HashMap Ċ Ċ /** Ċ Ġ* Ġ@ author ĠF ab riz io ĠMont esi Ġ< fam ont esi @ gmail . com > Ċ Ġ* ĠFrom Ġch oreo graphy Ġproject Ġnetwork Ċ Ġ*/ Ċ class ĠBe haviour Projection Ġprivate Ġconstructor ( private Ġval Ġprocess Name : String , Ġprivate Ġval Ġused Processes : ĠMap < String , Set < String >>) Ġ: ĠCC Visitor < Behaviour > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠCommunication Selection ): ĠBe haviour Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġn . continu ation . accept ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġeta Ġ= Ġn . eta ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( eta ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommunication Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( process Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeta . sender Ġ-> ĠSend SP ( continu ation , Ġeta . receiver , Ġeta . expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeta . receiver Ġ-> ĠReceive SP ( continu ation , Ġeta . sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontinuation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelection Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( process Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeta . sender Ġ-> ĠSelection SP ( continu ation , Ġeta . receiver , Ġeta . label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeta . receiver Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= ĠHashMap < String , ĠBe haviour >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabels [ eta . label ] Ġ= Ġcontinuation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOffer ing SP ( eta . sender , Ġlabels ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontinuation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError () Ġ// ĠUn reachable Ġcode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠMult icom ): ĠBe haviour Ġ= Ġthrow ĠOperation NotSupportedException () Ġ// ĠTODO Ġ: Ġimplement Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠCondition ): ĠBe haviour Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( process Name Ġ== Ġn . process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCondition SP ( n . expression , Ġn . then Ch oreo graphy . accept ( this ), Ġn . else Ch oreo graphy . accept ( this )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMer ging . merge ( n . then Ch oreo graphy . accept ( this ), Ġn . else Ch oreo graphy . accept ( this )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠTermin ation ): ĠBe haviour Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTermin ation SP () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠProcedure Definition ): ĠBe haviour Ġ= Ġthrow ĠOperation NotSupportedException () ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠProcedure Invocation ): ĠBe haviour Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( used Processes [ n . procedure ] !!. contains ( process Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcedure Invocation SP ( n . procedure ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTermin ation SP () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠCh oreo graphy ): ĠBe haviour Ġ= Ġthrow ĠOperation NotSupportedException () ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( n : ĠProgram ): ĠBe haviour Ġ= Ġthrow ĠOperation NotSupportedException () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġproject ( body : ĠCh oreo graphy Body , Ġprocess Name : ĠString , Ġused Processes : ĠMap < String , Set < String >> ): ĠBe haviour Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbody . accept ( Behaviour Projection ( process Name , Ġused Processes )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġproject ( ch oreo graphy : ĠCh oreo graphy , Ġprocess Name : ĠString ): ĠProcess Term Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused Processes Ġ= ĠUsed Processes . used Processes ( ch oreo graphy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocedure Projection s Ġ= ĠHashMap < String , ĠBe haviour >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( procedure Ġin Ġch oreo graphy . procedures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġused Processes [ procedure . name ] !!. contains ( process Name ) Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocedure Projection s [ procedure . name ] Ġ= Ġproject ( procedure . body , Ġprocess Name , Ġused Processes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( Ġe : Mer ging . Mer ging Exception Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Exception Ġ= ĠMer ging . Mer ging Exception ( Ġ"( procedure Ġ${ procedure . name }): Ġ${ e . message !! }" Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Exception . stack Trace Ġ= Ġe . stack Trace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProcess Term ( procedure Projection s , Ġproject ( ch oreo graphy . main , Ġprocess Name , Ġused Processes )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }