/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠRed ĠHat , ĠInc . Ġand / or Ġits Ġaffiliates . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠEclipse ĠPublic ĠLicense Ġversion Ġ 1 . 0 , Ġavailable Ġat Ċ Ġ* Ġhttp :// www . eclipse . org / legal / e pl - v 1 0 . html Ċ Ġ*/ Ċ Ċ package Ġio . fabric 8 . launcher . boost er Ċ Ċ import Ġio . fabric 8 . launcher . boost er . catalog . rho ar . R ho ar Boost er Ċ import Ġio . fabric 8 . launcher . boost er . catalog . rho ar . R ho ar Boost er Catalog Service Ċ import Ġio . fabric 8 . launcher . boost er . catalog . spi . Native Git Catalog Source Provider Ċ import Ġio . fabric 8 . launcher . boost er . catalog . utils . read Catalog Ċ import Ġio . fabric 8 . launcher . boost er . catalog . utils . read Metadata Ċ import Ġorg . yaml . s na key aml . Yaml Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Completion Exception Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Logger Ċ import Ġkotlin . system . exit Process Ċ Ċ /** Ċ Ġ* ĠIndexes Ġa ĠBoost er Ġcatalog Ġand Ġlogs Ġany Ġproblems Ġit Ġfinds Ġto Ġthe Ġconsole Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ T ako ĠSch ot an us ]( mailto : tsch ot an @ redhat . com ) Ċ Ġ*/ Ċ internal Ġobject ĠBoost er Validator Ġ{ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcatalog Ġ= Ġif Ġ( args . size Ġ> Ġ 0 ) Ġargs [ 0 ] Ġelse Ġ" catalog . json " ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġif Ġ( args . size Ġ> Ġ 1 ) Ġargs [ 1 ] Ġelse Ġ" metadata . json " ĊĊĠĠĠĠĠĠĠ Ġ// ĠSil ence Ġall ĠINFO Ġlogging ĊĠĠĠĠĠĠĠ Ġval Ġhandlers Ġ= ĠLogger . getLogger (" "). handlers ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġhandlers . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers [ index ]. level Ġ= ĠLevel . WARNING ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Ġ= ĠR ho ar Boost er Catalog Service . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catalog Provider ({ Ġread Catalog ( Paths . get ( catalog )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. metadata Provider ({ Ġread Metadata ( Paths . get ( metadata )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. source Provider ( Native Git Catalog Source Provider (). fetch Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġprintln (" Valid ating ĠBoost er ĠCatalog Ġ$ catalog ") ĊĠĠĠĠĠĠĠ Ġprintln (" Fetching Ġindex ...") ĊĠĠĠĠĠĠĠ Ġval Ġboost ers Ġ= Ġbuild . index (). get () ĊĠĠĠĠĠĠĠ Ġprintln (" Done .") ĊĊĠĠĠĠĠĠĠ Ġprintln (" Fetching Ġboost ers ...") ĊĠĠĠĠĠĠĠ Ġval Ġerr cnt Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġfutures Ġ= ĠArrayList < Comp letableFuture < Path >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġboost ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . add ( b . content (). when Complete Ġ{ Ġpath , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ERROR : ĠCould n 't Ġfetch ĠBoost er Ġ" Ġ+ Ġb . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr cnt . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" F etched Ġ" Ġ+ Ġb . id Ġ+ Ġ" Ġ(" Ġ+ Ġb . name Ġ+ Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! validate Boost er Data ( b , Ġpath , Ġb . data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr cnt . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! validate Open shift Yaml Files ( b , Ġpath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr cnt . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! validate Boost er ( b , Ġpath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr cnt . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of (* futures . to Typed Array ()). join () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCompletion Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( err cnt . get () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Done . ĠNo Ġproblems Ġfound .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Done . Ġ" Ġ+ Ġerr cnt . get () Ġ+ Ġ" Ġerrors Ġwere Ġencountered .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Open shift Yaml Files ( boost er : ĠR ho ar Boost er , Ġpath : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġyaml Ġ= ĠYaml () ĊĠĠĠĠĠĠĠ Ġval Ġvalid Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġp Ġ-> Ġp . parent . fileName . toString () Ġ== Ġ". openshift io " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġp Ġ-> Ġp . fileName . toString (). endsWith (". yaml ") Ġ|| Ġp . fileName . toString (). endsWith (". yml ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ ĠValid ating Ġ" Ġ+ Ġboost er . id Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġpath . rel ativ ize ( p )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new BufferedReader ( p ). use Ġ{ Ġreader Ġ-> Ġyaml . load As ( reader , ĠMap :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠParse Ġerror Ġin Ġ" Ġ+ Ġboost er . id Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġpath . rel ativ ize ( p ) Ġ+ Ġ": Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠIO Ġerror : Ġ" Ġ+ Ġboost er . id Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid . set ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalid . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Boost er Data ( boost er : ĠR ho ar Boost er , Ġpath : ĠPath , Ġdata : ĠMap < *, Ġ* >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġdata . entries ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key 1 , Ġvalue ) Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey 1 . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . contains (" Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠParse Ġerror Ġin Ġ" Ġ+ Ġboost er . id Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġpath . rel ativ ize ( path ) Ġ+ Ġ": ĠKeys Ġshould Ġnot Ġcontain Ġspaces : Ġ'" Ġ+ Ġkey Ġ+ Ġ"' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġvalid Ġ&& Ġvalidate Boost er Data ( boost er , Ġpath , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġis ĠIterable <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġvalid Ġ&& Ġvalidate Boost er Data ( boost er , Ġpath , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Boost er Data ( boost er : ĠR ho ar Boost er , Ġpath : ĠPath , Ġdata : ĠIterable < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġvalid Ġ&& Ġvalidate Boost er Data ( boost er , Ġpath , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġis ĠIterable <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġvalid Ġ&& Ġvalidate Boost er Data ( boost er , Ġpath , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Boost er ( boost er : ĠR ho ar Boost er , Ġpath : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( boost er . runtime ?. name Ġ== Ġboost er . runtime ?. id Ġ&& Ġboost er . runtime ?. description Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠContent Ġerror Ġin Ġ${ boost er . id } Ġ- Ġ${ path . rel ativ ize ( path )} : ĠRuntime Ġ'${ boost er . runtime ?. id }' Ġnot Ġfound Ġin Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( boost er . version ?. name Ġ== Ġboost er . version ?. id Ġ&& Ġboost er . version ?. description Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠContent Ġerror Ġin Ġ${ boost er . id } Ġ- Ġ${ path . rel ativ ize ( path )} : ĠVersion Ġ'${ boost er . version ?. id }' Ġnot Ġfound Ġin Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( boost er . mission ?. name Ġ== Ġboost er . mission ?. id Ġ&& Ġboost er . mission ?. description Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" ĠĠĠ ĠERROR : ĠContent Ġerror Ġin Ġ${ boost er . id } Ġ- Ġ${ path . rel ativ ize ( path )} : ĠMis sion Ġ'${ boost er . mission ?. id }' Ġnot Ġfound Ġin Ġmetadata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalid ĊĠĠĠ Ġ} Ċ } Ċ