/* Ċ * ĠCopyright Ġ 2 0 2 1 ĠH ugo ĠVis ser Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ package Ġnl . lit t ler obot s . vc u Ċ Ċ import Ġcom . fasterxml . jackson . data format . toml . Tom l Mapper Ċ import Ġnl . lit t ler obot s . vc u . model . Comments Ċ import Ġnl . lit t ler obot s . vc u . model . Library Ċ import Ġnl . lit t ler obot s . vc u . model . Plugin Ċ import Ġnl . lit t ler obot s . vc u . model . Version Catalog Ċ import Ġnl . lit t ler obot s . vc u . model . Version Definition Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . String Reader Ċ Ċ private Ġval ĠTABLE _ REGEX Ġ= ĠRegex ("\\ [ \\ s ?( versions | libraries | bundles | plugins )\\ s ? ]. * ") Ċ private Ġval ĠKEY _ REGEX Ġ= ĠRegex ("^ (.* ?) = .* ") Ċ private Ġconst Ġval ĠTABLE _ VERSION S Ġ= Ġ" versions " Ċ private Ġconst Ġval ĠTABLE _ LIBRARIES Ġ= Ġ" libraries " Ċ private Ġconst Ġval ĠTABLE _ B UND LES Ġ= Ġ" bundles " Ċ private Ġconst Ġval ĠTABLE _ PLUGIN S Ġ= Ġ" plugins " Ċ Ċ class ĠVersion Catalog Parser Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġparse ( inputStream : ĠInputStream ): ĠVersion Catalog Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠinputStream . buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠTom l Mapper () ĊĠĠĠĠĠĠĠ Ġval Ġcatalog Ġ= Ġmapper . readValue ( content , ĠMap :: class . java ) Ġas ĠMap < String , ĠAny > ĊĊĠĠĠĠĠĠĠ Ġval Ġversions Ġ= Ġcatalog . getTable ( TABLE _ VERSION S )?. to Version Definition Map () Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Ġ= Ġcatalog . getTable ( TABLE _ LIBRARIES )?. to Dependency Map () Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġbundles Ġ= Ġcatalog . getTable ( TABLE _ B UND LES )?. to Typed Map < List < String >>() Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġplugins Ġ= Ġcatalog . getTable ( TABLE _ PLUGIN S )?. to Plugin Dependency Map () Ġ?: Ġempty Map () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Comments ( content , ĠVersion Catalog ( versions , Ġlibraries , Ġbundles , Ġplugins )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Comments ( content : ĠString , Ġversion Catalog : ĠVersion Catalog ): ĠVersion Catalog Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomments Ġ= Ġmutable Map Of < String , ĠComments >() ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Comment Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Table : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( String Reader ( content )) ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġreader . readLine () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith ("# ") Ġ-> Ġcurrent Comment . add ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . trim (). matches ( TABLE _ REGEX ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= ĠTABLE _ REGEX . find ( line ) !!. group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Table Ġ= Ġtable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomments [ table ] Ġ= ĠComments ( current Comment . toList (), Ġempty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Comment . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . matches ( KEY _ REGEX ) Ġ&& Ġcurrent Table Ġ!= Ġnull Ġ&& Ġcurrent Comment . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠKEY _ REGEX . find ( line ) !!. group Values [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Comments Ġ= Ġcomments [ current Table ] Ġ?: Ġerror (" Should Ġhave Ġan Ġentry ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomments [ current Table ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Comments . copy ( entry Comments Ġ= Ġcurrent Comments . entry Comments Ġ+ Ġmap Of ( key Ġto Ġcurrent Comment . toList ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Comment . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( true ) ĊĠĠĠĠĠĠĠ Ġreturn Ġversion Catalog . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Comments Ġ= Ġcomments [ TABLE _ VERSION S ] Ġ?: ĠComments (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Comments Ġ= Ġcomments [ TABLE _ LIBRARIES ] Ġ?: ĠComments (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Comments Ġ= Ġcomments [ TABLE _ B UND LES ] Ġ?: ĠComments (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Comments Ġ= Ġcomments [ TABLE _ PLUGIN S ] Ġ?: ĠComments () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMap < String , ĠAny >. to Plugin Dependency Map (): ĠMap < String , ĠPlugin > Ġ{ ĊĠĠĠ Ġreturn Ġto Typed Map < Any >(). map Values Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġentry . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponents Ġ= Ġvalue . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( components . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Invalid Ġplugin Ġdefinition Ġfor Ġ${ entry . key }: Ġ${ entry . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( id , Ġversion ) Ġ= Ġcomponents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlugin ( id , ĠVersion Definition . Simple ( version )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġvalue [" id "] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġvalue [" version "] ?. to Dependency Version () Ġ?: ĠVersion Definition . Unspecified ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġplugin Ġid Ġdefined Ġfor Ġ${ entry . key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlugin ( id , Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unsupported Ġtype Ġ${ value :: class . java }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMap < String , ĠAny >. to Dependency Map (): ĠMap < String , ĠLibrary > Ġ= Ġto Typed Map < Any >(). map Values Ġ{ Ġentry Ġ-> ĊĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġentry . value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponents Ġ= Ġvalue . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( components . size Ġ!= Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Invalid Ġdependency Ġdefinition Ġfor Ġ${ entry . key }: Ġ${ entry . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( group , Ġname , Ġversion ) Ġ= Ġcomponents ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ= Ġgroup , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠVersion Definition . Simple ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġvalue [" module "] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġvalue [" group "] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvalue [" name "] Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġvalue [" version "] ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Dependency Version () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Could Ġnot Ġparse Ġversion Ġor Ġversion . ref Ġfor Ġ${ entry . key }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠVersion Definition . Unspecified ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ== Ġnull Ġ&& Ġ( group Ġ== Ġnull Ġ|| Ġname Ġ== Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("${ entry . key } Ġshould Ġdefine Ġmodule Ġor Ġgroup / name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ!= Ġnull Ġ&& Ġ( group Ġ!= Ġnull Ġ|| Ġname Ġ!= Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("${ entry . key } Ġshould Ġonly Ġdefine Ġmodule Ġor Ġgroup / name Ġcombination ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary ( module , Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary ( require NotNull ( group ), Ġrequire NotNull ( name ), Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unsupported Ġtype Ġ${ value :: class . java }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMap < String , ĠAny >. to Version Definition Map (): ĠMap < String , ĠVersion Definition > Ġ{ ĊĠĠĠ Ġreturn Ġmap Values Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġversion Ġ= Ġit . value . to Dependency Version ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Unable Ġto Ġparse Ġversion Ġ${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVersion Definition . Reference Ġ-> Ġthrow ĠIllegalStateException (" Version Ġspecified Ġcannot Ġbe Ġa Ġreference ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġversion ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun ĠAny . to Dependency Version (): ĠVersion Definition ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠString Ġ-> ĠVersion Definition . Simple ( this ) ĊĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Map Ġ= Ġthis Ġas ? ĠMap < String , ĠString > Ġ?: Ġthrow ĠIllegalStateException (" Expected Ġstring Ġmap ") ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 1 Ġ&& Ġstring Map . containsKey (" ref ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Definition . Reference ( string Map [" ref "] Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Definition . Condition ( string Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun ĠMap < String , ĠAny >. getTable ( key : ĠString ) Ġ= Ġget ( key ) Ġas ? ĠMap < String , ĠAny > Ċ Ċ private Ġinline Ġfun Ġ< re ified ĠT > ĠMap < String , ĠAny >. to Typed Map (): ĠMap < String , ĠT > Ġ= Ġmap Ġ{ ĊĠĠĠ Ġif Ġ( it . value Ġ! is ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Expected Ġ${ T :: class . java } Ġfor Ġkey Ġ${ it . key }, Ġbut Ġwas Ġ${ it . value :: class . java }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġit . key Ġto Ġit . value Ġas ĠT Ċ }. toMap () Ċ