package Ġme . n allen . mod ular code generation . description . h aml Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . data format . yaml . YAML Factory Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġme . n allen . mod ular code generation . codegen . Configuration Ċ import Ġme . n allen . mod ular code generation . description . Importer Ċ import Ġme . n allen . mod ular code generation . hybrid autom ata .* Ċ import Ġme . n allen . mod ular code generation . hybrid autom ata . Local ity Ċ import Ġme . n allen . mod ular code generation . logging . Logger Ċ import Ġme . n allen . mod ular code generation . par set ree .* Ċ import Ġme . n allen . mod ular code generation . utils . get RelativePath Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . util .* Ċ Ċ type alias ĠParse Tree Variable Type Ġ= Ġme . n allen . mod ular code generation . par set ree . Variable Type Ċ type alias ĠParse Tree Local ity Ġ= Ġme . n allen . mod ular code generation . par set ree . Local ity Ċ type alias ĠHy brid Location Ġ= Ġme . n allen . mod ular code generation . hybrid autom ata . Location Ċ Ċ /** Ċ Ġ* ĠAn ĠImport er Ġwhich Ġis Ġcapable Ġof Ġreading Ġin Ġa ĠH AML ĠDocument Ġspecification Ġand Ġcreating Ġthe Ġassociated ĠHy brid ĠItem Ċ Ġ* Ġas Ġdescribed Ġin Ġthe Ġdocument . Ċ Ġ*/ Ċ class ĠImport er Ġ{ ĊĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠImports Ġthe ĠH AML Ġdocument Ġat Ġthe Ġspecified Ġpath Ġand Ġconverts Ġit Ġto Ġa ĠHy brid ĠItem . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġconfiguration Ġsettings Ġstored Ġin Ġthe ĠH AML Ġdocuments Ġare Ġalso Ġparsed Ġand Ġreturned Ġas Ġa Ġseparate ĊĠĠĠĠĠĠĠĠ Ġ* ĠConfiguration Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġimport ( path : ĠString ): ĠPair < Hybrid Item , ĠConfiguration > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst ly Ġwe Ġwant Ġto Ġhandle Ġany Ġincludes Ġthat Ġmay Ġexist Ġin Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed File Ġ= Ġparse Includes ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġwant Ġto Ġread Ġthe Ġfile Ġas Ġa ĠYAML Ġfile ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObjectMapper ( YAML Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . register Module ( Kotlin Module ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . info (" Parsing ĠSchema ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... Ġand Ġconvert Ġit Ġinto Ġa ĠSchema Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġmapper . readValue ( parsed File , ĠSchema :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDep ending Ġon Ġwhat Ġtype Ġthe Ġschema Ġcontains , Ġwe 'll Ġgenerate Ġa Ġdifferent Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem : ĠHy brid Item Ġ= Ġwhen ( schema . system ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġa ĠNetwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Hybrid Network ( schema . name , Ġschema . system ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAutom ata Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġan ĠAutom ata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Hybrid Autom ata ( schema . name , Ġschema . system ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġconfiguration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġschema . codegen Config Ġ?: ĠConfiguration () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! item . validate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" One Ġor Ġmore Ġissues Ġwere Ġencountered Ġwith Ġthe Ġprovided Ġschema ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠPlease Ġfix Ġthese Ġbefore Ġre - try ing Ġcode Ġgeneration ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( item , Ġconfig ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠParses Ġthe Ġfile Ġat Ġthe Ġprovided Ġpath Ġfor Ġany Ġinclude Ġstatements Ġin Ġthe ĠYAML Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠInclude Ġstatements Ġconsist Ġof Ġa Ġ"! include " Ġfollowed Ġby Ġthe Ġpath Ġto Ġthe Ġincluded Ġfile . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠOnce Ġall Ġincludes Ġhave Ġbeen Ġparsed , Ġthe Ġfinal ĠYAML Ġdocument Ġstring Ġwill Ġbe Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Includes ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( contents , Ġis Url ) Ġ= ĠImport er . load From Path ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile : ĠFile ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! is Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( path ). absolute File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . info (" Reading Ġsource Ġfile Ġ${ file . get RelativePath () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . info (" Reading Ġremote Ġfile Ġ$ path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġcontents . lines () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġpair Ġof Ġregex Ġfor Ġdetect ing Ġinclude Ġstatements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinclude Regex Ġ= ĠRegex (" ! include \\ s + ([^ \\ s ]+ )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Regex Ġ= ĠRegex ("^ ([ \\ s ]*) [^ \\ s ]+ ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIterate Ġover Ġevery Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġwe Ġcan Ġfind Ġan Ġinclude Ġstatement Ġon Ġthis Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġinclude Regex . find ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( match Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfound Ġone ! ĠNow Ġtime Ġto Ġparse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst ly Ġwe Ġwant Ġto Ġopen Ġthe Ġincluded Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincluded File Ġ= Ġif ( file Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( file . parent File . absolute Path , Ġmatch . group Values [ 1 ]). absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unable Ġto Ġparse Ġincludes Ġfor Ġremote Ġfiles ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġneed Ġto Ġfigure Ġout Ġhow Ġmuch Ġof Ġan Ġindent Ġthere Ġwas Ġat Ġthe Ġstart Ġof Ġthis Ġline , Ġsince ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠYAML Ġis Ġwhitespace Ġsensitive Ġfor Ġindentation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindent Ġ= Ġindent Regex . find ( line )?. group Values ?. get ( 1 ) Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġinclude Ġthe Ġline Ġuntil Ġthe Ġinclude Ġstatement Ġas Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre text Ġ= Ġline . substring ( 0 Ġuntil Ġmatch . range . first ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġwas Ġany Ġtext Ġbefore Ġthe Ġinclude Ġstatement Ġthen Ġwe Ġwant Ġto Ġappend Ġthat , Ġand Ġnow Ġwe Ġneed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġindent Ġone Ġlevel Ġfurther Ġ( 2 Ġspaces Ġper Ġtab Ġin ĠYAML ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pre text . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ln ( pre text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent Ġ+= Ġ" Ġ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġincluded Ġfile Ġ( parsing Ġany Ġincludes Ġit Ġmay Ġhave Ġfirst ) Ġand Ġapply Ġthe Ġindent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ln ( parse Includes ( included File ). trim (). prepend Indent ( indent )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġinclude Ġstatement , Ġso Ġlet 's Ġjust Ġappend Ġthe Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ln ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġdone ! ĠCan Ġreturn Ġthe Ġfinal Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa ĠHy brid ĠAutom ata Ġfrom Ġa Ġdefinition , Ġwith Ġthe Ġgiven Ġname Ċ Ġ*/ Ċ private Ġfun Ġcreate Hybrid Autom ata ( name : ĠString , Ġdefinition : ĠAutom ata ): ĠHy brid Autom ata Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġthe Ġautom ata ĊĠĠĠ Ġval Ġautom ata Ġ= ĠHy brid Autom ata () ĊĊĠĠĠ Ġ// ĠLoad Ġthe Ġcommon Ġfeatures ĊĠĠĠ Ġautom ata . load Data ( name , Ġdefinition ) ĊĊĠĠĠ Ġ// ĠAdd Ġthe Ġlocations Ġ( transitions Ġare Ġwithin Ġlocations ) ĊĠĠĠ Ġautom ata . load Locations ( definition . locations ) ĊĊĠĠĠ Ġ// ĠSet Ġthe Ġinitial isation ĊĠĠĠ Ġautom ata . load Initial isation ( definition . initial isation ) ĊĊĠĠĠ Ġreturn Ġautom ata Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa ĠHy brid ĠNetwork Ġfrom Ġa Ġdefinition , Ġwith Ġthe Ġgiven Ġname . Ċ Ġ* ĠHy brid ĠNetworks Ġalso Ġcontain Ġreferences Ġto Ġtheir Ġparent Ġnetwork , Ġif Ġapplicable Ċ Ġ*/ Ċ private Ġfun Ġcreate Hybrid Network ( name : ĠString , Ġdefinition : ĠNetwork , Ġparent : ĠHy brid Network ? Ġ= Ġnull ): ĠHy brid Network Ġ{ ĊĠĠĠ Ġ// ĠNow Ġlet 's Ġcreate Ġthe ĠHy brid ĠNetwork ĊĠĠĠ Ġval Ġnetwork Ġ= ĠHy brid Network () ĊĠĠĠ Ġnetwork . parent Ġ= Ġparent ĊĊĠĠĠ Ġ// ĠLoad Ġthe Ġcommon Ġfeatures ĊĠĠĠ Ġnetwork . load Data ( name , Ġdefinition ) ĊĊĠĠĠ Ġ// ĠImport Ġthe Ġdefinitions ĊĠĠĠ Ġnetwork . import Items ( definition . definitions ) ĊĊĠĠĠ Ġ// ĠImport Ġthe Ġinstances ĊĠĠĠ Ġnetwork . import Instances ( definition . instances ) ĊĊĠĠĠ Ġ// ĠImport Ġthe Ġmappings ĊĠĠĠ Ġnetwork . import Mappings ( definition . mappings ) ĊĊĠĠĠ Ġreturn Ġnetwork Ċ } Ċ Ċ /** Ċ Ġ* ĠLoads Ġthe Ġproperties Ġthat Ġare Ġused Ġin Ġboth ĠNetworks Ġand ĠAutom ata Ġfrom Ġthe Ġdefinition Ċ Ġ*/ Ċ private Ġfun ĠHy brid Item . load Data ( name : ĠString , Ġdefinition : ĠDefinition Item ) Ġ{ ĊĠĠĠ Ġ// ĠLoad Ġthe Ġname ĊĠĠĠ Ġthis . name Ġ= Ġname ĊĊĠĠĠ Ġ// ĠLoad Ġall Ġinputs ĊĠĠĠ Ġthis . load Variables ( definition . inputs , ĠLoc ality . EXTERNAL _ INPUT ) ĊĊĠĠĠ Ġ// ĠAnd Ġall Ġoutputs ĊĠĠĠ Ġthis . load Variables ( definition . outputs , ĠLoc ality . EXTERNAL _ OUTPUT ) ĊĊĠĠĠ Ġ// ĠAnd Ġall Ġparameters ĊĠĠĠ Ġthis . load Variables ( definition . parameters , ĠLoc ality . PARAMETER ) ĊĊĠĠĠ Ġ// ĠAnd Ġthen Ġany Ġcustom Ġfunctions Ġthat Ġit Ġmay Ġcontain ĊĠĠĠ Ġthis . load Functions ( definition . functions ) Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġall ĠDefinitions Ġin Ġthe ĠH AML Ġspec Ġinto Ġtheir Ġrespective ĠHy brid Autom ata Ġrepresentations Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . import Items ( definitions : ĠMap < String , ĠDefinition Item > ?) Ġ{ ĊĠĠĠ Ġif ( definitions Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġadd Ġevery Ġdefinition , Ġso Ġiterate ! ĊĠĠĠĠĠĠĠ Ġfor (( name , Ġdefinition ) Ġin Ġdefinitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġwhen ( definition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAutom ata Ġ-> Ġthis . load Definition ( name , Ġdefinition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Ġ-> Ġthis . load Network ( name , Ġdefinition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . inst anti ates [ UUID . randomUUID ()] Ġ= ĠAutom ata Inst antiate ( uuid , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠLoads Ġthe Ġgiven ĠNetwork Ġdefinition Ġinto Ġthis ĠHy brid ĠNetwork Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . load Network ( name : ĠString , Ġdefinition : ĠNetwork ): ĠUUID Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġthe Ġnetwork ĊĠĠĠ Ġval Ġnetwork Ġ= Ġcreate Hybrid Network ( name , Ġdefinition , Ġthis ) ĊĊĠĠĠ Ġ// ĠAdd Ġit Ġwith Ġits Ġun qi ue ĠID ĊĠĠĠ Ġval Ġdefinition UUID Ġ= ĠUUID . randomUUID () ĊĠĠĠ Ġthis . definitions [ definition UUID ] Ġ= Ġnetwork ĊĊĠĠĠ Ġ// ĠReturn Ġthe ĠID Ġfor Ġuse Ġelsewhere ĊĠĠĠ Ġreturn Ġdefinition UUID Ċ } Ċ Ċ /** Ċ Ġ* ĠLoads Ġthe Ġgiven ĠAutom ata Ġdefinition Ġinto Ġthis ĠHy brid ĠNetwork Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . load Definition ( name : ĠString , Ġdefinition : ĠAutom ata ): ĠUUID Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġthe Ġautom ata ĊĠĠĠ Ġval Ġautom ata Ġ= Ġcreate Hybrid Autom ata ( name , Ġdefinition ) ĊĊĠĠĠ Ġ// ĠAdd Ġit Ġwith Ġits Ġun qi ue ĠID ĊĠĠĠ Ġval Ġdefinition UUID Ġ= ĠUUID . randomUUID () ĊĠĠĠ Ġthis . definitions [ definition UUID ] Ġ= Ġautom ata ĊĊĠĠĠ Ġ// ĠReturn Ġthe ĠID Ġfor Ġuse Ġelsewhere ĊĠĠĠ Ġreturn Ġdefinition UUID Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġeach ĠLocation Ġin Ġa ĠH AML ĠDefinition Ġinto Ġthe Ġgiven ĠHy brid Autom ata Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Autom ata . load Locations ( locations : ĠMap < String , ĠLocation > ?) Ġ{ ĊĠĠĠ Ġ// ĠFor Ġeach Ġlocation Ġthat Ġexists ĊĠĠĠ Ġif ( locations Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( name , Ġlocation ) Ġin Ġlocations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġassociated ĠHy brid Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhybrid Location Ġ= ĠHy brid Location ( name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġover Ġthe ĠIn variant Ġ( defaults Ġto Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhybrid Location . in variant Ġ= Ġlocation . in variant Ġ?: ĠLiteral (" true ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe ĠFlow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhybrid Location . flow . load ParseTree Items ( location . flow ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġload Ġthe ĠUpdates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhybrid Location . update . load ParseTree Items ( location . update ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġany Ġtransitions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . load Transitions ( name , Ġlocation . transitions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Location ( hybrid Location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġeach ĠTransition Ġin Ġa ĠH AML ĠLocation Ġinto Ġthe Ġgiven ĠHy brid Autom ata Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Autom ata . load Transitions ( from : ĠString , Ġtransitions : ĠList < Transition > ?) Ġ{ ĊĠĠĠ Ġ// ĠFor Ġeach Ġtransition Ġthat Ġexists ĊĠĠĠ Ġif ( transitions Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( transition Ġin Ġtransitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġassociated ĠEdge ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Ġ= ĠEdge ( from , Ġtransition . to ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġover Ġthe ĠGuard Ġ( defaults Ġto Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge . guard Ġ= Ġtransition . guard Ġ?: ĠLiteral (" true ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen Ġload Ġthe ĠUpdates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge . update . load ParseTree Items ( transition . update ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Edge ( edge ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġa ĠH AML ĠInitial isation Ġspec Ġinto Ġthe Ġgiven ĠHy brid Autom ata Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Autom ata . load Initial isation ( init : ĠInitial isation ?) Ġ{ ĊĠĠĠ Ġif ( init Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate Ġis Ġ 1 : 1 Ġmapping ĊĠĠĠĠĠĠĠ Ġthis . init . state Ġ= Ġinit . state ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġload Ġall Ġthe Ġinitial Ġval u ations ĊĠĠĠĠĠĠĠ Ġthis . init . valu ations . load ParseTree Items ( init . valu ations ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvariable Types Ġ= Ġvariables . map Ġ{ ĠPair ( it . name , Ġit . type ) Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġval Ġfunction Types Ġ= Ġfunctions . map Ġ{ ĠPair ( it . name , Ġit . returnType ) Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġany Ġvariables Ġthat Ġwe Ġcould Ġestimate Ġtype Ġfrom Ġinitial isation ĊĠĠĠĠĠĠĠ Ġfor ( variable Ġin Ġthis . variables . filter Ġ{ Ġit . type Ġ== Ġme . n allen . mod ular code generation . par set ree . Variable Type . ANY Ġ&& Ġthis . init . valu ations . containsKey ( it . name ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġval uation Ġ= Ġthis . init . valu ations [ variable . name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . type Ġ= Ġval uation . get Operation Result Type ( variable Types , Ġfunction Types ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġa Ġset Ġof ĠH AML ĠFunction Ġdefinitions Ġinto Ġthe Ġgiven ĠHy brid Item Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Item . load Functions ( functions : ĠMap < String , ĠFunction > ?) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġneed Ġto Ġkeep Ġtrack Ġof Ġfunctions Ġwe Ġknow Ġabout Ġand Ġtheir Ġreturn Ġtypes ĊĠĠĠ Ġval Ġexisting Function Types Ġ= ĠLinkedHashMap < String , ĠParse Tree Variable Type ?> () ĊĠĠĠ Ġval Ġexisting Function Arguments Ġ= ĠLinkedHashMap < String , ĠList < ParseTree Variable Type >>() ĊĊĠĠĠ Ġ// ĠFor Ġeach Ġfunction Ġthat Ġexists ĊĠĠĠ Ġif ( functions Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( name , Ġfunction ) Ġin Ġfunctions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġup , Ġlet 's Ġdetect Ġall Ġthe Ġinputs Ġto Ġthe Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= ĠArrayList < Variable Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( function . inputs Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġiterate Ġover Ġevery Ġinput ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( input Ġin Ġfunction . inputs !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... Ġand Ġcreate Ġa ĠVariable Declaration Ġthat Ġmatches Ġwhat Ġwe Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . add ( Variable Declaration ( input . key , Ġinput . value . type . convertTo ParseTree Type (), ĠParse Tree Local ity . EXTERNAL _ INPUT , Ġinput . value . default )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġlet 's Ġfind Ġany Ġinternal Ġvariables Ġinside Ġthe Ġfunction Ġthat Ġwe 'll Ġneed Ġto Ġinstantiate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . logic . collect Variables ( inputs , Ġexisting Function Types , Ġexisting Function Arguments ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . logic . remove Function Arguments ( this . variables . filter Ġ{ Ġit . locality Ġ== ĠLoc ality . PARAMETER Ġ}. map Ġ{ Ġit . name Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġcreate Ġthe ĠFunction Definition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Ġ= ĠFunction Definition ( name , Ġfunction . logic , Ġinputs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally Ġlet 's Ġfind Ġout Ġwhat Ġreturn Ġtype Ġthe Ġfunction Ġshould Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . returnType Ġ= Ġfunction . logic . get ReturnType ( existing Function Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen Ġadd Ġit Ġto Ġthe Ġlist Ġof Ġknown Ġtypes Ġfor Ġfuture Ġparsing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Function Types [ func . name ] Ġ= Ġfunc . returnType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Function Arguments [ func . name ] Ġ= Ġfunc . inputs . map Ġ{ Ġit . type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . functions . add ( func ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConverts Ġa ĠH AML ĠVariable ĠType Ġto Ġa ĠHy brid ĠVariable Type Ċ Ġ*/ Ċ private Ġfun ĠVariable Type . convertTo ParseTree Type (): ĠParse Tree Variable Type Ġ{ ĊĠĠĠ Ġ// ĠA Ġsimple Ġmapping Ġbetween Ġtwo Ġdifferent Ġenums Ġwith Ġthe Ġsame Ġset Ġof Ġoptions ĊĠĠĠ Ġreturn Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠVariable Type . BOOLEAN Ġ-> ĠParse Tree Variable Type . BOOLEAN ĊĠĠĠĠĠĠĠ ĠVariable Type . REAL Ġ-> ĠParse Tree Variable Type . REAL ĊĠĠĠĠĠĠĠ ĠVariable Type . INTEGER Ġ-> ĠParse Tree Variable Type . INTEGER ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġa Ġset Ġof ĠH AML ĠInstances Ġinto Ġthe Ġgiven ĠHy brid Network Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . import Instances ( instances : ĠMap < String , ĠInstance > ?) Ġ{ ĊĠĠĠ Ġif ( instances Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġeach Ġinstantiate Ġthat Ġexists ĊĠĠĠĠĠĠĠ Ġfor (( name , Ġinstance ) Ġin Ġinstances ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstantiate Id Ġ= Ġget Inst antiate Id ForType ( instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcreate Ġthe Ġassociated Ġinstantiate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġautom ata Instance Ġ= ĠAutom ata Instance ( instantiate Id Ġ?: ĠUUID . randomUUID ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen Ġadd Ġall Ġthe Ġparameters Ġthat Ġshould Ġbe Ġset Ġon Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġautom ata Instance . parameters . load ParseTree Items ( instance . parameters ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemember ing Ġthat Ġthe Ġinstantiate Ġname Ġis Ġthe Ġkey Ġin Ġthe ĠMap Ġthey Ġget Ġstored Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . instances [ name ] Ġ= Ġautom ata Instance ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( instantiate Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error (" Unable Ġto Ġfind Ġdefinition Ġfor Ġ'${ instance . type }' Ġrequired Ġby Ġ'$ name ' Ġin Ġ'${ this . name }' ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġthe Ġinst ati ate ĠId Ġthat Ġcorresponds Ġto Ġthe Ġgiven Ġname , Ġrecursively Ġsearching Ġthrough Ġparents Ġif Ġrequired Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . get Inst antiate Id ForType ( type : ĠString ): ĠUUID ? Ġ{ ĊĠĠĠ Ġ// ĠFirst Ġtry Ġif Ġit 's Ġwithin Ġthis Ġnetwork ĊĠĠĠ Ġval Ġinstantiate Id Ġ= Ġthis . inst anti ates . filter Ġ{ Ġit . value . name Ġ== Ġtype Ġ}. keys . first OrNull () ĊĊĠĠĠ Ġ// ĠIf Ġwe Ġmanaged Ġto Ġfind Ġit , Ġthen Ġreturn Ġit ĊĠĠĠ Ġif ( instantiate Id Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinstantiate Id ĊĊĠĠĠ Ġ// ĠOtherwise , Ġcheck Ġthrough Ġthe Ġparent ĊĠĠĠ Ġreturn Ġthis . parent ?. get Inst antiate Id ForType ( type ) Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġa Ġset Ġof ĠH AML ĠM appings Ġinto Ġthe Ġgiven ĠHy brid Network Ġinstantiate Ċ Ġ*/ Ċ private Ġfun ĠHy brid Network . import Mappings ( mappings : ĠMap < String , ĠParse TreeItem > ?) Ġ{ ĊĠĠĠ Ġ// ĠFor Ġeach Ġmapping Ġthat Ġexists ĊĠĠĠ Ġif ( mappings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( to , Ġfrom ) Ġin Ġmappings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġthe ĠAutom ata Ġand ĠVariable ĠPair ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Pair Ġ= ĠAutom ata Variable Pair . generate ( to ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġadd Ġit ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io Mapping [ to Pair ] Ġ= Ġfrom ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAdds Ġa Ġset Ġof ĠParse Tree Items Ġto Ġthe Ġgiven Ġand Ġexisting Ġset Ġof ĠParse Tree Items . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġmethod Ġwill Ġoverwrite Ġany Ġexisting Ġvalues Ġwhich Ġshare Ġthe Ġsame Ġkey Ġas Ġone Ġbeing Ġadded . Ċ Ġ*/ Ċ private Ġfun ĠMutable Map < String , ĠParse TreeItem >. load ParseTree Items ( items : ĠMap < String , ĠParse TreeItem > ?) Ġ{ ĊĠĠĠ Ġ// ĠFor Ġeach Ġitem Ġthat Ġwe Ġhave ĊĠĠĠ Ġif ( items Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( key , Ġvalue ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSimply Ġadd Ġit Ġto Ġthe Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImports Ġa Ġset Ġof ĠH AML ĠVariables Ġwith Ġa Ġgiven Ġlocal ity Ġinto Ġthe Ġgiven ĠHy brid Autom ata Ċ Ġ*/ Ċ private Ġfun ĠHy brid Item . load Variables ( variables : ĠMap < String , ĠVariable Definition > ?, Ġtype : ĠLoc ality ) Ġ{ ĊĠĠĠ Ġ// ĠIterate Ġover Ġevery Ġvariable Ġwe Ġwere Ġgiven ĊĠĠĠ Ġif ( variables Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( name , Ġvalue ) Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Variable ( name , Ġvalue . type . convertTo ParseTree Type (), Ġtype , Ġvalue . default , Ġvalue . delay able By , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }