package Ġcom . thought works . arch guard . scanner . domain . hub executor Ċ Ċ import Ġcom . thought works . arch guard . scanner . domain . analy ser . Analysis Service Ċ import Ġcom . thought works . arch guard . scanner . domain . config . repository . Scanner Configure Repository Ċ import Ġcom . thought works . arch guard . scanner . domain . scanner . java ext . bs . Scan Context Ċ import Ġcom . thought works . arch guard . scanner . infrastructure . client . Evaluation Report Client Ċ import Ġcom . thought works . arch guard . scanner . infrastructure . command . InMemory Consumer Ċ import Ġcom . thought works . arch guard . scanner . infrastructure . command . Stream Consumer Ċ import Ġcom . thought works . arch guard . smart scanner . Str ang ler Scanner Executor Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . Disposable Bean Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util . concurrent . Copy On Write Array Set Ċ import Ġkotlin . concurrent . thread Ċ Ċ @ Service Ċ class ĠHub ExecutorService Ġ: ĠDis posable Bean Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Hub ExecutorService :: class . java ) ĊĠĠĠ Ġprivate Ġvar Ġsystem Root : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġexecutor : ĠStr ang ler Scanner Executor ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġis Running : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġconcurrent Set : ĠCopy On Write Array Set < Long > Ġ= ĠCopy On Write Array Set () ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġanalysis Service : ĠAnalysis Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġevaluation Report Client : ĠEvaluation Report Client ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfigure Repository : ĠScanner Configure Repository ĊĊĠĠĠ Ġfun Ġdo Scan IfNot Running ( id : ĠLong , Ġdb Url : ĠString , Ġscanner Version : ĠString , Ġmemory Consumer : ĠStream Consumer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! concurrent Set . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcurrent Set . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Scan ( id , Ġdb Url , Ġscanner Version , Ġmemory Consumer , ĠlistOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcurrent Set . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconcurrent Set . contains ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġevaluate ( type : ĠString , Ġid : ĠLong , Ġdb Url : ĠString , Ġscanner Version : ĠString , Ġarguments : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! concurrent Set . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcurrent Set . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Scan ( id , Ġdb Url , Ġscanner Version , ĠIn Memory Consumer (), Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcurrent Set . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevaluation Report Client . generate ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconcurrent Set . contains ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Scan ( ĊĠĠĠĠĠĠĠ Ġid : ĠLong , ĊĠĠĠĠĠĠĠ Ġdb Url : ĠString , ĊĠĠĠĠĠĠĠ Ġscanner Version : ĠString , ĊĠĠĠĠĠĠĠ Ġmemory Consumer : ĠStream Consumer , ĊĠĠĠĠĠĠĠ Ġaddition Arguments : ĠList < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġconfigure Repository . get Tool Config ures () ĊĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġcheck Ġworkspace Ġdir ĊĠĠĠĠĠĠĠ Ġval Ġsystem Operator Ġ= Ġanalysis Service . getSystem Operator ( id , Ġmemory Consumer ) ĊĠĠĠĠĠĠĠ Ġsystem Operator . clone And Build All Repo () ĊĠĠĠĠĠĠĠ Ġsystem Operator . scan Project Map . forEach Ġ{ Ġ( repo , Ġcompiled Project ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠScan Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Project . build Tool , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Project . workspace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Project . language , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Project . code Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Project . branch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Consumer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddition Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner Version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . execute ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Root Ġ= Ġcontext . workspace . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Evaluation Status ( type : ĠString , Ġid : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconcurrent Set . contains ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ³éĹŃ æľįåĬ¡ æ¸ħ ç©º ä¸´ æĹ¶ çĽ®å½ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif ( system Root . isEmpty ()){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġvar Ġfile Ġ= ĠFile ( system Root ) Ċ // ĠĠĠĠĠĠĠ Ġif ( file . exists ()){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdel Ġ= Ġfile . delete Re cursively () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" temp File Ġ{}, Ġclean Ġtemp File Ġresult ï¼ļ {}", Ġsystem Root , Ġdel ); Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ