package Ġio . q ame ta . all ure . kotlin . util Ċ Ċ import Ġio . q ame ta . all ure . kotlin . Label Annotation Ċ import Ġio . q ame ta . all ure . kotlin . Link Annotation Ċ import Ġio . q ame ta . all ure . kotlin . model . Label Ċ import Ġio . q ame ta . all ure . kotlin . model . Link Ċ import Ġjava . lang . reflect . Annotated Element Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util . logging . Logger Ċ Ċ /** Ċ Ġ* ĠCollection Ġof Ġutils Ġused Ġby ĠAll ure Ġintegration Ġto Ġextract Ġmeta Ġinformation Ġfrom Ċ Ġ* Ġtest Ġcases Ġvia Ġreflection . Ċ Ġ* Ċ Ġ*/ Ċ object ĠAnnotation Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOGGER : ĠLogger Ġ= Ġlogger For < Annotation Utils >() ĊĠĠĠ Ġprivate Ġconst Ġval ĠVALUE _ METHOD _ NAME Ġ= Ġ" value " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlinks Ġcreated Ġfrom ĠAll ure Ġmeta Ġannotations Ġspecified Ġon Ġannotated Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotated Element Ġthe Ġelement Ġto Ġsearch Ġannotations Ġon . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlinks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Links ( annotated Element : ĠAnnot ated Element ): ĠSet < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Links (* annotated Element . annotations ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShort cut Ġfor Ġ[ get Links ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotations Ġannotations Ġto Ġanaly se . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlinks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Links ( var arg Ġannotations : ĠAnnotation ): ĠSet < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Links ( annotations . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlinks Ġfrom Ġgiven Ġannotations . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotations Ġannotations Ġto Ġanaly se . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlinks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Links ( annotations : ĠCollection < Annotation >): ĠSet < Link > Ġ= ĊĠĠĠĠĠĠĠ Ġextract Meta Annotations ( Link Annotation :: class . java , Ġ:: extract Links , Ġannotations ). toSet () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlabels Ġcreated Ġfrom ĠAll ure Ġmeta Ġannotations Ġspecified Ġon Ġannotated Ġelement . ĊĠĠĠĠ Ġ* ĠShort cut Ġfor Ġ[ get Links ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotated Element Ġthe Ġelement Ġto Ġsearch Ġannotations Ġon . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlabels . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Labels ( annotated Element : ĠAnnot ated Element ): ĠSet < Label > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Labels (* annotated Element . annotations ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShort cut Ġfor Ġ[ get Labels ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotations Ġannotations Ġto Ġanaly se . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlabels . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Labels ( var arg Ġannotations : ĠAnnotation ): ĠSet < Label > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Labels ( annotations . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlabels Ġfrom Ġgiven Ġannotations . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotations Ġannotations Ġto Ġanaly se . ĊĠĠĠĠ Ġ* Ġ@ return Ġdiscovered Ġlabels . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Labels ( annotations : ĠCollection < Annotation >): ĠSet < Label > Ġ= ĊĠĠĠĠĠĠĠ Ġextract Meta Annotations ( Label Annotation :: class . java , Ġ:: extract Labels , Ġannotations ). toSet () ĊĊĠĠĠ Ġprivate Ġfun Ġ< Result , ĠAnnotation Clazz Ġ: ĠAnnotation > Ġextract Meta Annotations ( ĊĠĠĠĠĠĠĠ Ġannotation Type : ĠClass < Annotation Clazz >, ĊĠĠĠĠĠĠĠ Ġmapper : Ġ( Annotation Clazz , ĠAnnotation ) Ġ-> ĠList < Result >, ĊĠĠĠĠĠĠĠ Ġcandidates : ĠCollection < Annotation > ĊĠĠĠ Ġ): ĠList < Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisited : ĠMutable Set < Annotation > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġreturn Ġcandidates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap ( this :: extract Repeat able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġcandidate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Meta Annotations ( annotation Type , Ġmapper , Ġcandidate , Ġvisited ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< Result , ĠAnnotation Clazz Ġ: ĠAnnotation > Ġextract Meta Annotations ( ĊĠĠĠĠĠĠĠ Ġannotation Type : ĠClass < Annotation Clazz >, ĊĠĠĠĠĠĠĠ Ġmapper : Ġ( Annotation Clazz , ĠAnnotation ) Ġ-> ĠList < Result >, ĊĠĠĠĠĠĠĠ Ġcandidate : ĠAnnotation , ĊĠĠĠĠĠĠĠ Ġvisited : ĠMutable Set < Annotation > ĊĠĠĠ Ġ): ĠList < Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Operation al Annotation ( candidate . annotation Type ()) Ġ&& Ġvisited . add ( candidate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġcandidate . annotation Type (). annotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġextract Repeat able ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġextract Meta Annotations ( annotation Type , Ġmapper , Ġit , Ġvisited ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= ĠlistOf NotNull ( candidate . annotation Type (). getAnnotation ( annotation Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġmarker Ġ-> Ġmapper ( marker , Ġcandidate ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Ġ+ Ġchildren ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Labels ( m : ĠLabel Annotation , Ġannotation : ĠAnnotation ): ĠList < Label > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( m . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Annotation . DEFAULT _ VALUE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Value Method ( annotation ). map Ġ{ ĠResults Utils . create Label ( m . name , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( Results Utils . create Label ( m . name , Ġm . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Links ( ĊĠĠĠĠĠĠĠ Ġm : ĠLink Annotation , ĊĠĠĠĠĠĠĠ Ġannotation : ĠAnnotation ĊĠĠĠ Ġ): ĠList < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġrequired Ġas ĠLink Ġannotation Ġuses Ġname Ġattribute Ġas Ġvalue Ġalias . ĊĠĠĠĠĠĠĠ Ġif Ġ( annotation Ġis Ġio . q ame ta . all ure . kotlin . Link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Results Utils . create Link ( annotation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( m . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLink Annotation . DEFAULT _ VALUE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Value Method ( annotation ). map Ġ{ ĠResults Utils . create Link ( it , Ġnull , Ġm . url , Ġm . type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( Results Utils . create Link ( m . value , Ġnull , Ġm . url , Ġm . type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Value Method ( annotation : ĠAnnotation ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod : ĠMethod Ġ= Ġannotation . annotation Type (). getMethod ( VALUE _ METHOD _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` object ` Ġ= Ġmethod . invoke ( annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ToString Stream (` object `) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġannotation Ġ$ annotation : Ġmarker Ġannotations Ġwithout Ġvalue Ġshould Ġcontains Ġvalue () Ġmethod ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġannotation Ġ$ annotation : Ġmarker Ġannotations Ġwithout Ġvalue Ġshould Ġcontains Ġvalue () Ġmethod ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġannotation Ġ$ annotation : Ġmarker Ġannotations Ġwithout Ġvalue Ġshould Ġcontains Ġvalue () Ġmethod ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobject ToString Stream ( data : ĠAny ?): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull Ġ&& Ġdata . java Class . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Array Ġ-> Ġreturn Ġdata . map ( Long :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Array Ġ-> Ġreturn Ġdata . map ( Short :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Array Ġ-> Ġreturn Ġdata . map ( Int :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Array Ġ-> Ġreturn Ġdata . map ( Char :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Array Ġ-> Ġreturn Ġdata . map ( Double :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Array Ġ-> Ġreturn Ġdata . map ( Float :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Array Ġ-> Ġreturn Ġdata . map ( Boolean :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġreturn Ġdata . map ( Byte :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray < *> Ġ-> Ġreturn Ġdata . map ( Any ? :: toString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( java . lang . String . valueOf ( data )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Repeat able ( annotation : ĠAnnotation ): ĠList < Annotation > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Repeat able Wrapper ( annotation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod : ĠMethod Ġ= Ġannotation . annotation Type (). getMethod ( VALUE _ METHOD _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( method . invoke ( annotation ) Ġas ĠArray < Annotation >). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Could Ġnot Ġextract Ġrepeat able Ġannotation Ġ$ annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Annotation >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Could Ġnot Ġextract Ġrepeat able Ġannotation Ġ$ annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Annotation >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Could Ġnot Ġextract Ġrepeat able Ġannotation Ġ$ annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Annotation >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠlistOf ( annotation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Repeat able Wrapper ( annotation : ĠAnnotation ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation . annotation Type (). declared Methods . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmethod : ĠMethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVALUE _ METHOD _ NAME . equals ( method . name , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmethod : ĠMethod Ġ-> Ġmethod . returnType . isArray Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. any Ġ{ Ġmethod : ĠMethod Ġ-> Ġis Repeat able ( method . returnType . component Type ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Repeat able ( annotation Type : ĠClass < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation Type . is Annotation Present ( Repeat able :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Operation al Annotation ( annotation Type : ĠClass < out ĠAnnotation >? ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠisIn Java Lang Annotation Package ( annotation Type ) Ġ|| Ġis Kotlin Metadata ( annotation Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisIn Java Lang Annotation Package ( annotation Type : ĠClass < out ĠAnnotation >? ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation Type Ġ!= Ġnull Ġ&& Ġannotation Type . name . startsWith (" java . lang . annotation ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Kotlin Metadata ( annotation Type : ĠClass < out ĠAnnotation >? ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation Type Ġ!= Ġnull Ġ&& Ġannotation Type . name . startsWith (" kotlin . Metadata ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠAnnotation > ĠT . annotation Type (): ĠClass < out ĠT > Ġ= ĊĠĠĠ Ġ( this Ġas Ġjava . lang . annotation . Annotation ). annotation Type () Ġas ĠClass < out ĠT >