/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAlex ĠCh erm en in Ċ Ġ* Ċ Ġ* Ġ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 Ġru . ch erm en in . k io . arguments Ċ Ċ import Ġjava . beans . Int ros pector Ċ import Ġorg . apache . beam . sdk . options . Pipeline Options Ċ import Ġorg . apache . beam . sdk . options . Pipeline Options Factory Ċ import Ġru . ch erm en in . k io . options . K io Options Ċ Ċ class ĠArguments Ġinternal Ġconstructor ( private Ġval Ġarguments Map : ĠMap < String , ĠList < String >>) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠUsed Ġto Ġtrim Ġapplication Ġarguments Ġstring Ġfor ĠUI Ġif Ġit 's Ġtoo Ġlong ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG UMENT S _ STRING _ MAX _ LENGTH Ġ= Ġ 4 9 1 5 2 ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse ( args : ĠArray < String >): ĠPair < Pipeline Options , ĠArguments > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠPipeline Options Factory . get Registered Options () Ġ+ ĠK io Options :: class . java ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopt Patterns Ġ= Ġclasses . flatMap Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . methods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((! n . startsWith (" get ") Ġ&& Ġ! n . startsWith (" is ")) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parameter Types . isNotEmpty () Ġ|| Ġit . returnType Ġ== ĠUnit :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Int ros pector . de capitalize ( n . substring ( if Ġ( n . startsWith (" is ")) Ġ 2 Ġelse Ġ 3 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ"-- $ it (\ $ |= ) ". to Regex () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSplit Ġarguments Ġ- Ġone Ġpart Ġfor ĠPipeline Options Ġand Ġanother Ġfor ĠArguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( app Args , Ġopt Args ) Ġ= Ġargs . partition Ġ{ Ġarg Ġ-> Ġopt Patterns . none Ġ{ Ġit . contains Match In ( arg ) Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġpipeline Ġoptions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Options Ġ= ĠPipeline Options Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Args (* opt Args . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Validation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ` as `( K io Options :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠParse Ġrest Ġof Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( properties Args , Ġb ooleans Args ) Ġ= Ġapp Args . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . startsWith ("-- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Argument Ġ'$ it ' Ġdoes Ġnot Ġbegin Ġwith Ġ'-- '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . trim Start ('- ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. partition Ġ{ Ġit . contains (' =') Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Map Ġ= Ġproperties Args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( k , Ġv ) Ġ= Ġit . split (" =", Ġlimit Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( k , Ġv . split (", (? = ([ ^\ "] * \" [^ \"] *\ ") * [^ \"] *$ ) ". to Regex ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġentry Ġ-> Ġentry . value . flatMap Ġ{ Ġit . second Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboolean Map Ġ= Ġb ooleans Args . map Ġ{ ĠPair ( it , ĠlistOf (" true ")) Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Map . keys . intersect ( boolean Map . keys ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Conflict ing Ġarguments Ġwith Ġname Ġ'$ it '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠArguments ( properties Map Ġ+ Ġboolean Map ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Args . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments String Ġ= Ġarguments . join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsafe Arguments String Ġ= Ġif Ġ( arguments String . length Ġ> ĠARG UMENT S _ STRING _ MAX _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments String . substring ( 0 , ĠARG UMENT S _ STRING _ MAX _ LENGTH ) Ġ+ Ġ" Ġ[... ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Options . arguments Ġ= Ġsafe Arguments String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( pipeline Options , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalue ( key : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments Map . get OrDefault ( key , Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġget As ( key : ĠString , Ġf : Ġ( String ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrequired ( key ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ( value ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġvalue Ġ'$ value ' Ġfor Ġargument Ġwith Ġname Ġ'$ key '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġget As ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠT , Ġf : Ġ( String ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġoptional ( key ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġvalue Ġ'$ value ' Ġfor Ġargument Ġwith Ġname Ġ'$ key '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoptional ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġvalue ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( values . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġvalues [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" There Ġare Ġmultiple Ġvalues Ġfor Ġargument Ġwith Ġname Ġ'$ key '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequired ( key : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġvalue ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( values . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġthrow ĠIllegalArgumentException (" Mis sed Ġvalue Ġfor Ġargument Ġwith Ġname Ġ'$ key '") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġvalues [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" There Ġare Ġmultiple Ġvalues Ġfor Ġargument Ġwith Ġname Ġ'$ key '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠString ): ĠString Ġ= Ġrequired ( key ) ĊĊĠĠĠ Ġfun Ġget OrElse ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptional ( key ) Ġ?: Ġdefault () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġint ( key : ĠString ): ĠInt Ġ= Ġget As ( key ) Ġ{ Ġit . toInt () Ġ} ĊĊĠĠĠ Ġfun Ġint ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠInt ): ĠInt Ġ= Ġget As ( key , Ġdefault ) Ġ{ Ġit . toInt () Ġ} ĊĊĠĠĠ Ġfun Ġlong ( key : ĠString ): ĠLong Ġ= Ġget As ( key ) Ġ{ Ġit . to Long () Ġ} ĊĊĠĠĠ Ġfun Ġlong ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠLong ): ĠLong Ġ= Ġget As ( key , Ġdefault ) Ġ{ Ġit . to Long () Ġ} ĊĊĠĠĠ Ġfun Ġfloat ( key : ĠString ): ĠFloat Ġ= Ġget As ( key ) Ġ{ Ġit . toFloat () Ġ} ĊĊĠĠĠ Ġfun Ġfloat ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠFloat ): ĠFloat Ġ= Ġget As ( key , Ġdefault ) Ġ{ Ġit . toFloat () Ġ} ĊĊĠĠĠ Ġfun Ġdouble ( key : ĠString ): ĠDouble Ġ= Ġget As ( key ) Ġ{ Ġit . toDouble () Ġ} ĊĊĠĠĠ Ġfun Ġdouble ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠDouble ): ĠDouble Ġ= Ġget As ( key , Ġdefault ) Ġ{ Ġit . toDouble () Ġ} ĊĊĠĠĠ Ġfun Ġbool ( key : ĠString ): ĠBoolean Ġ= Ġget As ( key , Ġ{ Ġfalse Ġ}, Ġ{ Ġit . to Boolean () Ġ}) ĊĊĠĠĠ Ġfun Ġbool ( key : ĠString , Ġdefault : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ= Ġget As ( key , Ġdefault ) Ġ{ Ġit . to Boolean () Ġ} ĊĊĠĠĠ Ġfun Ġjoin ToString ( separator : ĠString Ġ= Ġ", Ġ", Ġprefix : ĠString Ġ= Ġ"", Ġsuffix : ĠString Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments Map . keys . to Typed Array (). sorted Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġwhen Ġ( arguments Map [ it ]?. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġarguments Map [ it ]?. get ( 0 ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarguments Map [ it ]?. join ToString (", Ġ", Ġ"[", Ġ"] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġ"-- $ it =$ values " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator , Ġprefix , Ġsuffix ) ĊĠĠĠ Ġ} Ċ } Ċ