package Ġio . github . san eea . dv h . feature . multi Ċ Ċ import Ġio . github . san eea . dv h . Feature Context Ċ import Ġio . github . san eea . dv h . Feature Provider Ċ import Ġio . github . san eea . dv h . utils . Utils Ċ import Ġjava . io . Print Stream Ċ import Ġjava . util . stream . Collectors Ċ Ċ class ĠTree Printer ( out : ĠPrint Stream ) Ġ: ĠFeature Catalog Printer ( out ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġprint ( feature Provider : ĠFeature Provider , Ġcontext : ĠFeature Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeatures Chain Ġ= Ġcontext . features Chain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfeature Name : ĠString Ġ-> ĠFeature Tree ( feature Name , Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfeatures Chain . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures Chain [ i ]. children . add ( features Chain [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuild Feature Tree ( features Chain [ features Chain . size Ġ- Ġ 1 ], Ġfeature Provider , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġfeatures Chain [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġmax Feature Name Size Ġ= ĠgetMax Feature Name Size ( root , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġprint Catalog Child Branch ("", Ġroot , Ġmax Feature Name Size , Ġtrue , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetMax Feature Name Size ( feature Tree : ĠFeature Tree , Ġlevel : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Size Ġ= Ġfeature Tree . alias . length Ġ+ Ġget Level Offset ( level ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchildren Size Ġ= Ġfeature Tree . children ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠgetMax Feature Name Size ( it , Ġlevel Ġ+ Ġ 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( children Size Ġ+ Ġcurrent Size ). max OrNull () Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Catalog Tree Branch ( ĊĠĠĠĠĠĠĠ Ġfeature Tree : ĠFeature Tree , Ġlevel Line Suffix : ĠString , Ġlevel : ĠInt , ĊĠĠĠĠĠĠĠ Ġmax Feature Name Size : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeatures Ġ= Ġfeature Tree . children ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfeatures . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Catalog Child Branch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Line Suffix , Ġfeatures [ i ], Ġmax Feature Name Size , Ġi Ġ== Ġfeatures . size Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Catalog Child Branch ( ĊĠĠĠĠĠĠĠ Ġlevel Line Suffix : ĠString , Ġfeature : ĠFeature Tree , Ġmax Feature Name Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġlast : ĠBoolean , Ġlevel : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Name Ġ= Ġfeature . alias ĊĠĠĠĠĠĠĠ Ġval Ġfeature Short Description Ġ= Ġfeature . description ĊĠĠĠĠĠĠĠ Ġval Ġis Root Ġ= Ġlevel Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġis Hub Ġ= Ġfeature . children . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġval Ġfeature Line Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfeature Line . append ( level Line Suffix ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Line . append ( if Ġ( last ) Ġ"\ \" Ġelse Ġ"+ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Line . append ( DASH _ FOR _ NODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfeature Line . append ( feature Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Hub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" Ġ". repeat ( max Feature Name Size Ġ- Ġfeature Name . length Ġ- Ġget Level Offset ( level ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" Ġ- Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( feature Short Description ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout . println ( feature Line ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Hub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Level Line Suffix Ġ= ĠStringBuilder ( level Line Suffix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Level Line Suffix . append ( if Ġ( last ) Ġ" Ġ" Ġelse Ġ"| ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Level Line Suffix . append ( SPACE _ FOR _ NODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Catalog Tree Branch ( feature , Ġnext Level Line Suffix . toString (), Ġlevel , Ġmax Feature Name Size ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( level Line Suffix ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Level Offset ( level : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( DASH _ LENGTH Ġ+ Ġ 1 ) Ġ* Ġlevel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Feature Tree ( parent : ĠFeature Tree , Ġfeature Provider : ĠFeature Provider , Ġcontext : ĠFeature Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeatures Names Ġ= Ġfeature Provider . features Names () ĊĠĠĠĠĠĠĠ Ġfor Ġ( feature Name Ġin Ġfeatures Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Context Ġ= ĠFeature Context ( context , Ġfeature Name , ĠUtils . NO _ ARGS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Info Ġ= Ġfeature Provider . feature Info ( child Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= ĠFeature Tree ( feature Name , Ġfeature Info . description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . children . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( feature Info . feature Ġis ĠMulti Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Feature Tree ( child , Ġfeature Info . feature . feature Provider , Ġchild Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠD ASH _ LENGTH Ġ= Ġ 3 Ċ private Ġconst Ġval ĠD ASH _ STRING Ġ= Ġ"-" Ċ private Ġconst Ġval ĠSPACE _ STRING Ġ= Ġ" Ġ" Ċ private Ġval ĠD ASH _ FOR _ NODE Ġ= ĠD ASH _ STRING . repeat ( DASH _ LENGTH ) Ċ private Ġval ĠSPACE _ FOR _ NODE Ġ= ĠSPACE _ STRING . repeat ( DASH _ LENGTH ) Ċ