package Ġcom . tencent . devops . plugin . processor Ċ Ċ import Ġcom . tencent . devops . plugin . api . EXTENSION _ LOCATION Ċ import Ġcom . tencent . devops . plugin . api . Extension Ċ import Ġcom . tencent . devops . plugin . api . Extension Type Ċ import Ġorg . springframework . stereotype . Controller Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġjava . io . IOException Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . tools . Diagnostic Ċ import Ġjavax . tools . Standard Location Ċ Ċ /** Ċ Ġ* Ġ[ Extension ] æ³¨è§£ å¤ĦçĲĨ åĻ¨ ï¼Į å°Ĩ æłĩè®° äºĨ [ Extension ] çļĦ ç±» èĩªåĬ¨ åĨĻåħ¥ extensions . properties Ċ Ġ*/ Ċ class ĠExtension Annotation Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġextensions Ġ= Ġmutable Map Of < Extension Type , ĠMutable Set < String >>() ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( processing Env : ĠProcessing Environment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init ( processing Env ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of ( Extension :: class . java . canonical Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSource Version . latest Supported () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element >, Ġround Env : ĠRound Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( round Env . processing Over ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Extension File () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġround Env . getElement s Annotated With ( Extension :: class . java ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Extension Element ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Extension Element ( element : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog (" Found Ġ@ Extension Ġelement : Ġ$ element ") ĊĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS Ġ|| Ġelement Ġ! is ĠType Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Invalid Ġelement Ġtype , Ġclass Ġexpected ", Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdetermine Extension Type ( element ) ĊĠĠĠĠĠĠĠ Ġextensions . get Or Put ( type ) Ġ{ Ġmutable Set Of () Ġ}. add ( element . qualified Name . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine Extension Type ( element : ĠElement ): ĠExtension Type Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element . getAnnotation ( Controller :: class . java ) Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getAnnotation ( RestController :: class . java ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠExtension Type . CONTROLLER ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠExtension Type . POINT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Extension File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġprocessing Env . filer ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension File Ġ= Ġfilter . create Resource ( Standard Location . CLASS _ OUTPUT , Ġ"", ĠEXT ENSION _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Files . write ( extensions , Ġextension File . open OutputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Success Ġto Ġgenerate Ġextension Ġfactories Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( exception . message . or Empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . NOTE , Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġerror ( message : ĠString , Ġelement : ĠElement ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , Ġmessage , Ġelement ) ĊĠĠĠ Ġ} Ċ } Ċ