/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠAlex ander ĠSh ilo v Ġ( ash land err ) Ġ< ale ks and r . sch i low 2 0 1 2 @ gmail . com > Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġai . to ch ka . protocol Ċ Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Parameter Ċ Ċ private Ġval Ġtag Classes Ġ= Ġset Of ( ĊĠĠĠ ĠLong :: class . java Primitive Type !! , ĊĠĠĠ ĠLong :: class . java ObjectType Ċ ) Ċ Ċ private Ġval ĠmessageId Classes Ġ= Ġset Of ( ĊĠĠĠ ĠString :: class . java Ċ ) Ċ Ċ internal Ġsealed Ġclass ĠParameter Desc Ġ{ ĊĠĠĠ Ġdata Ġclass ĠCommand ( val Ġparameter : ĠParameter , Ġval Ġtype : ĠClass <* >) Ġ: ĠParameter Desc () ĊĠĠĠ Ġdata Ġclass ĠTag ( val Ġparameter : ĠParameter ) Ġ: ĠParameter Desc () ĊĠĠĠ Ġdata Ġclass ĠMessage Id ( val Ġparameter : ĠParameter ) Ġ: ĠParameter Desc () Ċ } Ċ Ċ internal Ġfun ĠMethod . parse Parameters (): ĠList < Parameter Desc > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġthis . parameters ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . parse Parameter () Ġ} ĊĊĠĠĠ Ġval Ġduplicate Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit :: class Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value . size Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit Ġ> Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ. entries ĊĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĊĠĠĠ Ġif Ġ( duplicate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Method Ġ[$ this ] Ġhas Ġmore Ġthan Ġone Ġ${ duplicate . key . simple Name } Ġparameter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ internal Ġfun ĠParameter . parse Parameter (): ĠParameter Desc Ġ{ ĊĠĠĠ Ġval Ġtag Annotation Ġ= Ġthis . getAnnotation ( Tag :: class . java ) ĊĠĠĠ Ġif Ġ( tag Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . type Ġ! in Ġtag Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Parameter Ġ[ ${ this }] Ġhas Ġwrong Ġclass , Ġmust Ġbe ĠLong ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠParameter Desc . Tag ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠmessageId Annotation Ġ= Ġthis . getAnnotation ( MessageId :: class . java ) ĊĠĠĠ Ġif Ġ( message Id Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . type Ġ! in ĠmessageId Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Parameter Ġ[ ${ this }] Ġhas Ġwrong Ġclass , Ġmust Ġbe ĠString ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠParameter Desc . MessageId ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠParameter Desc . Command ( this , Ġthis . type ) Ċ } Ċ Ċ internal Ġfun ĠString . trim With El lipsis ( maxLength : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . length Ġ> ĠmaxLength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . take ( maxLength Ġ- Ġ 3 ) Ġ+ Ġ" ..." ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} Ċ }