package Ġio . github . leg ion 2 . to sca _ orche strator . to sca . model Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . data format . yaml . YAML Factory Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . definitions . Import Definition Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . definitions . Service Template Definition Ċ import Ġio . github . leg ion 2 . to sca _ orche strator . to sca . definitions . to sca Yaml Mapper Ċ import Ġjava . net . URI Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠInformation Ġabout Ġan ĠService ĠTemplate Ġloaded Ġfrom Ġan ĠURI Ċ Ġ*/ Ċ private Ġdata Ġclass ĠImport Info ( ĊĠĠĠ Ġval Ġnamespace : ĠNamespace , ĊĠĠĠ Ġval Ġservice Template Definition : ĠService Template Definition , ĊĠĠĠ Ġval Ġuri : ĠURI , ĊĠĠĠ Ġval Ġimport Without Namespace : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontext Path : ĠURI Ġget () Ġ= Ġuri . parent Ċ } Ċ Ċ data Ġclass ĠImport ed Service Template ( ĊĠĠĠ Ġval Ġnamespace : ĠNamespace , ĊĠĠĠ Ġval Ġservice Template Definition : ĠService Template Definition , ĊĠĠĠ Ġval Ġimported Namespaces : ĠSet < Namespace >, ĊĠĠĠ Ġval Ġnamespace Aliases : ĠMap < String , ĠNamespace >, ĊĠĠĠ Ġval Ġun named Imports : ĠSet < Namespace >, ĊĠĠĠ Ġval Ġuri : ĠURI Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontext Path : ĠURI Ġget () Ġ= Ġuri . parent Ċ } Ċ Ċ fun Ġimport All ( uri : ĠURI ): ĠPair < Imported Service Template , ĠMap < Namespace , ĠImport ed Service Template >> Ġ{ ĊĠĠĠ Ġval Ġimport Info Ġ= Ġimport ( Import Definition ( uri ), Ġuri . parent ) ĊĠĠĠ Ġreturn Ġimport All ( import Info ) Ċ } Ċ Ċ private Ġfun Ġimport All ( root Import Info : ĠImport Info ): ĠPair < Imported Service Template , ĠMap < Namespace , ĠImport ed Service Template >> Ġ{ ĊĠĠĠ Ġval Ġservice Template Definitions Ġ= Ġmutable Map Of < Namespace , ĠImport ed Service Template >() ĊĠĠĠ Ġval Ġqueue : ĠQueue < Import Info > Ġ= ĠLinkedList () ĊĊĠĠĠ Ġval Ġroot Namespace Ġ= Ġroot Import Info . namespace ĊĠĠĠ Ġqueue . add ( root Import Info ) ĊĠĠĠ Ġqueue . add ( load Norm ative Types ()) ĊĊĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimport Info Ġ= Ġqueue . remove () ĊĠĠĠĠĠĠĠ Ġif Ġ( service Template Definitions . containsKey ( import Info . namespace )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( import Info . service Template Definition . to sca _ definitions _ version Ġ!= Ġ" to sca _ simple _ yaml _ 1 _ 3 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" TO SC A Ġdefinition Ġversion Ġ'${ import Info . service Template Definition . to sca _ definitions _ version }' Ġnot Ġsupported .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġimport Info . service Template Definition . imports . or Empty (). associate With Ġ{ Ġimport Definition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport ( import Definition , Ġimport Info . context Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġqueue . addAll ( imports . values ) ĊĊĠĠĠĠĠĠĠ Ġval Ġimported Namespaces Ġ= Ġimports . values . map Ġ{ Ġit . namespace Ġ}. toSet (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import Info . namespace Ġ== ĠNamespace . to sca ) Ġit Ġelse Ġit Ġ+ ĠNamespace . to sca ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaliases Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimports . filter Keys Ġ{ Ġit . namespace _ prefix Ġ!= Ġnull Ġ}. map Ġ{ Ġit . key . namespace _ prefix Ġto Ġit . value . namespace Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () Ġas ĠMap < String , ĠNamespace > ĊĊĠĠĠĠĠĠĠ Ġval Ġun named Imports Ġ= Ġimports . filter Ġ{ Ġit . value . import Without Namespace Ġ&& Ġit . key . namespace _ prefix Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value . namespace Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġservice Template Definitions [ import Info . namespace ] Ġ= ĠImport ed Service Template ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Info . namespace , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Info . service Template Definition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimported Namespaces , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaliases , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun named Imports , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Info . uri ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġservice Template Definitions . getValue ( root Namespace ) Ġto Ġservice Template Definitions Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġcontext Path Ġis Ġthe Ġuri Ġfrom Ġwhich Ġto Ġresolve Ġrelative ĠURIs Ċ Ġ*/ Ċ private Ġfun Ġimport ( import Definition : ĠImport Definition , Ġcontext Path : ĠURI ): ĠImport Info Ġ{ ĊĠĠĠ Ġif Ġ( import Definition . namespace _ uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" namespace _ uri Ġis Ġdeprecated Ġin ĠTO SC A Ġ 1 . 2 Ġand Ġnot Ġsupported , Ġdeclare Ġthe Ġnamespace Ġin Ġthe Ġtarget ĠService Template Ġinstead .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġuri Ġ= Ġcontext Path . resolve ( import Definition . file ) ĊĠĠĠ Ġ// TODO Ġrepository ĊĊĠĠĠ Ġval Ġservice Template Definition Ġ= ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġto sca Yaml Mapper . readValue < Service Template Definition >( uri . to URL ()) Ġ}. add Exception Context Info Ġ{ Ġ" Can Ġnot Ġload ĠService ĠTemplate : Ġ$ uri " Ġ} ĊĠĠĠ Ġval Ġnamespace Ġ= Ġnamespace For ( service Template Definition . namespace , Ġuri ) ĊĠĠĠ Ġreturn ĠImport Info ( namespace , Ġservice Template Definition , Ġuri , Ġservice Template Definition . namespace Ġ== Ġnull ) Ċ } Ċ Ċ private Ġfun Ġnamespace For ( namespace : ĠURI ?, Ġservice Template Uri : ĠURI ): ĠNamespace Ġ{ ĊĠĠĠ Ġif Ġ( namespace Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNamespace ( namespace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠNamespace ( service Template Uri ) Ċ } Ċ Ċ val ĠURI . parent : ĠURI ĊĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Opaque Ġ-> ĠURI ( scheme , Ġscheme Specific Part . remove Suffix ("/ "). substring Before Last ("/") Ġ+ Ġ"/", Ġfragment ) Ġ// TODO Ġthis Ġis Ġa Ġworkaround ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( path . endsWith ("/ ")) Ġresolve (" .. ") Ġelse Ġresolve (".") ĊĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ private Ġfun Ġload Norm ative Types (): ĠImport Info Ġ{ ĊĠĠĠ Ġval Ġclass Loader Ġ= ĠThread . currentThread (). context ClassLoader ĊĊĠĠĠ Ġval Ġuri Ġ= Ġclass Loader . getResource (" io / github / leg ion 2 / to sca _ orche strator / to sca / norm ative / norm ative - types - 1 . 3 . yaml ") !! ĊĠĠĠĠĠĠĠ Ġ. to URI () ĊĠĠĠ Ġreturn Ġimport ( Import Definition ( uri ), Ġuri ) Ċ } Ċ