package Ġcom . github . sa ip ras ad kr ish nam ur thy . sk 8 s Ċ Ċ import Ġcom . mit che ll bose ck e . pe bble . P eb ble Engine Ċ import Ġorg . apache . commons . io . IO Utils Ċ import Ġjava . io . File Ċ import Ġjava . io . String Writer Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠY ml Ġproperties Ġdocumentation Ġgenerator . Ċ Ġ* Ġ@ author ĠS ai . Ċ Ġ*/ Ċ class ĠY ml Properties Documentation Generator Ġ{ ĊĊĠĠĠ Ġvar Ġprop Infos Ġ= Ġmutable ListOf < Y ml PropertyInfo >() ĊĊĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠY ml Properties Documentation Generator Ġ= ĠY ml Properties Documentation Generator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Doc ( generate Props Doc Request : ĠGenerate Props Doc Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Props ( generate Props Doc Request ) ĊĠĠĠĠĠĠĠ Ġval Ġleaves Ġ= Ġprop Infos . filter Ġ{ Ġit . value Ġ!= Ġnull Ġ&& Ġit . value . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprop Desc Ġ= Ġleaves . map Ġ{ Ġy ml PropertyInfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhierarchy Ġ= Ġhierarchy ( yml PropertyInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhierarchy . reverse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhierarchy . add ( yml PropertyInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġhierarchy . join ToString (".") Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProp Descriptor ( key Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġy ml PropertyInfo . values Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġy ml PropertyInfo . description Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue Ġ= Ġy ml PropertyInfo . defaultValue Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataType Ġ= Ġy ml PropertyInfo . dataType Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġy ml PropertyInfo . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġy ml PropertyInfo . tags Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= Ġy ml PropertyInfo . profile ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgrouped ByKey Ġ= Ġprop Desc . groupBy Ġ{ Ġit . key Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvals Ġ= Ġgrouped ByKey . map Values Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpd Ġ= Ġv . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpd . reduce Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġb . values Ġ+ Ġ" Ġ" Ġ+ Ġa . values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġb . description Ġ+ Ġ" Ġ" Ġ+ Ġa . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue Ġ= Ġb . defaultValue Ġ+ Ġ" Ġ" Ġ+ Ġa . defaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataType Ġ= Ġb . dataType Ġ+ Ġ" Ġ" Ġ+ Ġa . dataType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġb . tags Ġ+ Ġ" Ġ" Ġ+ Ġa . tags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠP eb ble Engine . Builder (). build () ĊĠĠĠĠĠĠĠ Ġval Ġcompiled Template Ġ= Ġengine . get Literal Template ( IO Utils . toString ( Y ml Properties Documentation Generator . java Class . class Loader . getResource AsStream (" templates / config Docs . html "), ĠCharset . default Charset ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġcontext [" props "] Ġ= Ġvals . values ĊĠĠĠĠĠĠĠ Ġcontext [" artifactId "] Ġ= Ġgenerate Props Doc Request . artifactId ĊĠĠĠĠĠĠĠ Ġcontext [" version "] Ġ= Ġgenerate Props Doc Request . version ĊĠĠĠĠĠĠĠ Ġcontext [" total Properties "] Ġ= Ġgrouped ByKey . size ĊĠĠĠĠĠĠĠ Ġcontext [" total Document ed Properties "] Ġ= Ġgrouped ByKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value . any Ġ{ Ġp Ġ-> Ġp . description Ġ!= Ġnull Ġ&& Ġp . description . isNotEmpty () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum () ĊĠĠĠĠĠĠĠ Ġcontext [" total Un document ed Properties "] Ġ= Ġgrouped ByKey . size Ġ- Ġcontext [" total Document ed Properties "] Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ((( context [" total Un document ed Properties "] Ġas ĠInt ). toDouble ()) Ġ/ Ġ(( context [" total Properties "] Ġas ĠInt ). toDouble ())) Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġpercentage Ġ= ĠString . format ("% . 1 f ", Ġp ) ĊĠĠĠĠĠĠĠ Ġcontext [" percentage "] Ġ= Ġpercentage ĊĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġcompiled Template . evaluate ( writer , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġwriter . toString () ĊĠĠĠĠĠĠĠ ĠFiles . writeString ( Paths . get ( generate Props Doc Request . output Dir , Ġ" config Docs . html "), Ġoutput ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhierarchy ( leaf : ĠY ml PropertyInfo ): ĠMutable List < Y ml PropertyInfo > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhierarchy Ġ= Ġmutable ListOf < Y ml PropertyInfo >() ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠY ml PropertyInfo ? Ġ= Ġleaf ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhierarchy . add ( parent ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( parent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhierarchy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparent ( yml PropertyInfo : ĠY ml PropertyInfo ?): ĠY ml PropertyInfo ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( yml PropertyInfo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= Ġy ml PropertyInfo . sequence ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġy ml PropertyInfo . level ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġprop Infos . filter Ġ{ Ġit . level Ġ< Ġlevel Ġ&& Ġit . sequence Ġ<= Ġsequence Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filtered . isNotEmpty ()) Ġfiltered [ filtered . size Ġ- Ġ 1 ] Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Props ( generate Props Doc Request : ĠGenerate Props Doc Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġseq Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠFile ("${ generate Props Doc Request . base Dir }/ src / main / resources "). list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . endsWith (" yml ") Ġ|| Ġit . name . endsWith (" yaml ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġfile . read Lines ( Charset . default Charset ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġline . indexOf ( line . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġline . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġsplit [ 0 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( split . size Ġ> Ġ 1 ) Ġsplit [ 1 ]. trim () Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= Ġif Ġ( file . name Without Extension Ġ== Ġ" application ") Ġ" default " Ġelse Ġfile . name Without Extension . replace (" application -", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . contains ("# doc ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Ġ= Ġline . substring ( line . lastIndexOf ("# doc "), Ġline . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġprop . substring ( 5 , Ġprop . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġcontents . split ("| "). associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( left , Ġright ) Ġ= Ġit . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġto Ġright . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Infos . add ( Y ml PropertyInfo ( key Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( value Ġ!= Ġnull ) Ġif Ġ( value . contains ("# doc ")) Ġvalue . substring Before ("# doc (" ). trim () Ġelse Ġvalue . trim () Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġlevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġmap [" description "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataType Ġ= Ġmap [" type "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġmap [" values "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue Ġ= Ġmap [" default "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmap [" tags "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Ġ= Ġ++ seq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= Ġprofile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Infos . add ( Y ml PropertyInfo ( key Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( value Ġ!= Ġnull ) Ġif Ġ( value . contains ("# doc ")) Ġvalue . substring Before ("# doc (" ) Ġelse Ġvalue . trim () Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġlevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Ġ= Ġ++ seq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= Ġprofile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }