package Ġcom . alibaba . p 3 c . idea . action Ċ Ċ import Ġcom . alibaba . p 3 c . idea . component . Ali Project Component Ċ import Ġcom . alibaba . p 3 c . idea . ep . Inspection Action Extension Point Ċ import Ġcom . alibaba . p 3 c . idea . inspection . Ali Local Inspection Tool Provider Ċ import Ġcom . alibaba . p 3 c . idea . inspection . P md Rule Inspection Ident ify Ċ import Ġcom . alibaba . p 3 c . idea . pmd . Ali P md Processor Ċ import Ġcom . intellij . analysis . Analysis Scope Ċ import Ġcom . intellij . code Insight . daemon . Problem Highlight Filter Ċ import Ġcom . intellij . code Insight . daemon . impl . Daemon Progress Indicator Ċ import Ġcom . intellij . code Inspection . ex . Global Inspection Context Impl Ċ import Ġcom . intellij . code Inspection . ui . Inspection Results View Ċ import Ġcom . intellij . concurrency . Job Launcher Ċ import Ġcom . intellij . concurrency . Job Launcher Impl Ċ import Ġcom . intellij . concurrency . Sensitive Progress Wrapper Ċ import Ġcom . intellij . diagnostic . Thread Dump er Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Read Action Ċ import Ġcom . intellij . openapi . application . ex . Application Manager Ex Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . progress . Process Canceled Exception Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Provider Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . progress . Task . Background able Ċ import Ġcom . intellij . openapi . progress . impl . Core Progress Manager Ċ import Ġcom . intellij . openapi . progress . util . Progress Indicator Utils Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . display Url Relative To Project Ċ import Ġcom . intellij . openapi . project . is Project Or Workspace File Ċ import Ġcom . intellij . openapi . roots . File Index Ċ import Ġcom . intellij . openapi . roots . Project Root Manager Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . openapi . util . Empty Runnable Ċ import Ġcom . intellij . openapi . util . NotNull Lazy Value Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi Binary File Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Single Root File View Provider Ċ import Ġcom . intellij . psi . search . Local Search Scope Ċ import Ġcom . intellij . psi . search . Search Scope Ċ import Ġcom . intellij . psi . util . Psi Util Core Ċ import Ġcom . intellij . ui . content . Content Manager Ċ import Ġcom . intellij . util . Exception Util Ċ import Ġcom . intellij . util . Incorrect OperationException Ċ import Ġcom . intellij . util . Processor Ċ import Ġcom . intellij . util . Reflection Util Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġg nu . tro ve . TH ash Set Ċ import Ġnet . sourceforge . pmd . Rule Violation Ċ import Ġjava . util . Queue Ċ import Ġjava . util . concurrent . Array BlockingQueue Ċ import Ġjava . util . concurrent . BlockingQueue Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ Ċ /** Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 0 6 / 1 9 Ċ Ġ* Ġ@ author Ġca ik ang Ċ Ġ*/ Ċ class ĠP md Global Inspection Context Impl ( ĊĠĠĠ Ġproject : ĠProject , ĊĠĠĠ Ġcontent Manager : ĠNot Null Lazy Value < Content Manager >, ĊĠĠĠ Ġprivate Ġval Ġproject Scope Selected : ĠBoolean Ċ ) Ġ: ĊĠĠĠ ĠGlobal Inspection Context Impl ( project , Ġcontent Manager ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getInstance ( P md Global Inspection Context Impl :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun Tools ( scope : ĠAnalysis Scope , Ġrun Global Tools Only : ĠBoolean , Ġis Offline Ins pe ctions : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġused Tools Ġ= Ġused Tools ĊĠĠĠĠĠĠĠ Ġval Ġhas P md Tools Ġ= Ġused Tools . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . tool . tool Ġis ĠP md Rule Inspection Ident ify ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has P md Tools ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Indicator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Indicator Provider . getGlobal Progress Indicator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInc orrect OperationException (" Must Ġbe Ġrun Ġunder Ġprogress ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp md Node W arm Up ( scope , Ġprogress Indicator , Ġis Offline Ins pe ctions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . run Tools ( scope , Ġrun Global Tools Only , Ġis Offline Ins pe ctions ) ĊĠĠĠĠĠĠĠ Ġif Ġ( my Progress Indicator . is Canceled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠIns pection Action Extension Point . extension . extensions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . do On Inspection Finished ( this , Ġproject Scope Selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġp md Node W arm Up ( ĊĠĠĠĠĠĠĠ Ġscope : ĠAnalysis Scope , ĊĠĠĠĠĠĠĠ Ġprogress Indicator : ĠProgress Indicator , ĊĠĠĠĠĠĠĠ Ġis Offline Ins pe ctions : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġali Project Component Ġ= Ġproject . getComponent ( Ali Project Component :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġp md Ġinspection ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= ĠProcessor Ġ{ Ġfile : ĠPsi File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Action Success Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( project ). try Run Read Action In Smart Mode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ try Run Read Action In Smart Mode Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġfile . virtual File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! scope . contains ( virtual File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( file . name Ġ+ Ġ"; Ġscope : Ġ" Ġ+ Ġscope Ġ+ Ġ"; Ġ" Ġ+ Ġvirtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ try Run Read Action In Smart Mode Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġvirtual File . canonical Path ?. toLowerCase () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! path . endsWith (". java ") Ġ&& Ġ! path . endsWith (". vm ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ try Run Read Action In Smart Mode Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo P md Process ( file , Ġali Project Component , Ġvirtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ" Inspect Ġcode Ġis Ġnot Ġavailable Ġuntil Ġindices Ġare Ġready " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Action Success Ġ== Ġnull Ġ|| Ġ! read Action Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Canceled Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhead less Environment Ġ= ĠApplication Manager . getApplication (). is Head less Environment ĊĠĠĠĠĠĠĠ Ġval Ġsearch Scope Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action < Search Scope , ĠRuntimeException > Ġ{ Ġscope . to Search Scope () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlocal Scope Files : ĠMutable Set < Virtual File >? Ġ= Ġif Ġ( search Scope Ġis ĠLocal Search Scope ) ĠT HashSet () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġfiles To Inspect : ĠBlock ing Queue < Psi File > Ġ= ĠArray BlockingQueue ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġiter ating Indicator : ĠProgress Indicator Ġ= ĠS ensitive Progress Wrapper ( progress Indicator ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture : ĠFuture < *> Ġ= Ġstart Iterate Scope In Background ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Scope Files , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Environment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles To Inspect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiter ating Indicator ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠFuture < *> ĊĠĠĠĠĠĠĠ Ġval Ġdependent Indicators Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReflection Util . getField ( java Class , Ġthis , ĠList :: class . java , Ġ" dependent Indicators ") ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠProgress Indicator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. to Mutable List () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Failed To Inspect : ĠQueue < Psi File > Ġ= ĠLinked BlockingQueue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠDis poser . new Disposable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper : ĠProgress Indicator Ġ= ĠDa emon Progress Indicator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependent Indicators ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġavoid Ġ" attach Ġlistener " /" write Ġaction " Ġrace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Indicator Utils . force Write Action Priority ( wrapper , Ġdis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġa Ġchance Ġwe Ġare Ġr acing Ġwith Ġwrite Ġaction , Ġin Ġwhich Ġcase Ġjust Ġregistered Ġlistener Ġmight Ġnot Ġbe Ġcalled , Ġretry . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Application Manager Ex . getApplication Ex (). is Write Action Pending ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Canceled Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġwrapper Ġhere Ġto Ġcancel Ġearly Ġwhen Ġwrite Ġaction Ġstart Ġbut Ġdo Ġnot Ġaffect Ġthe Ġoriginal Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Job Launcher . getInstance () Ġas ĠJob Launcher Impl ). process Queue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles To Inspect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Failed To Inspect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Util Core . NULL _ P SI _ FILE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Offline Ins pe ctions Ġ|| Ġ! Application Manager . getApplication (). is Read Access Allowed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMust Ġbe Ġoutside Ġread Ġaction . ĠP CE = ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Exception Util . get Throwable Text ( e )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Offline Ins pe ctions Ġ|| Ġ! Application Manager . getApplication (). is Dispatch Thread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMust Ġbe Ġoutside ĠE DT . ĠP CE = ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Exception Util . get Throwable Text ( e )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġwrite Ġaction Ġto Ġcomplete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action ( Empty Runnable . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependent Indicators ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove ( wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( dis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiter ating Indicator . cancel () Ġ// Ġtell Ġfile Ġscanning Ġthread Ġto Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles To Inspect . clear () Ġ// Ġlet Ġfile Ġscanning Ġthread Ġa Ġchance Ġto Ġput ĠTO MB ST ONE Ġand Ġcomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture [ 3 0 , ĠSE CON DS ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġdump : ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Thread Dump er . dump Threads ToString ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Iterate Scope In Background ( ĊĠĠĠĠĠĠĠ Ġscope : ĠAnalysis Scope , ĊĠĠĠĠĠĠĠ Ġlocal Scope Files : ĠMutable Collection < Virtual File > ?, ĊĠĠĠĠĠĠĠ Ġhead less Environment : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġout Files To Inspect : ĠBlock ing Queue < in ĠPsi File >, ĊĠĠĠĠĠĠĠ Ġprogress Indicator : ĠProgress Indicator ĊĠĠĠ Ġ): ĠFuture < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask : ĠBackground able Ġ= Ġobject Ġ: ĠBackground able ( project , Ġ" Sc anning ĠFiles Ġto ĠIn spect ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Index : ĠFile Index Ġ= ĠProject Root Manager . getInstance ( project ). file Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . accept Ġ{ Ġfile : ĠVirtual File ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Project Or Workspace File ( file !! ) Ġ|| Ġ! file Index . isIn Content ( file )) Ġreturn @ accept Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRead Action . compute < Psi File ?, ĠRuntimeException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( project . is Disposed ) Ġthrow ĠProcess Canceled Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= ĠPsi Manager . getInstance ( project ). find File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi ?. let Ġ{ Ġshould Process ( it , Ġhead less Environment , Ġlocal Scope Files ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ compute Ġpsi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġinspect Ġbinary Ġfiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck (! Application Manager . getApplication (). is Read Access Allowed ) Ġ{ Ġ" Must Ġnot Ġhave Ġread Ġaction " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Files To Inspect . put ( psi File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore , Ġbut Ġput Ġto mb stone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Files To Inspect . put ( Psi Util Core . NULL _ P SI _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Progress Manager . getInstance () Ġas ĠCore Progress Manager ). run Process With Progress As ynchronously ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Process ( ĊĠĠĠĠĠĠĠ Ġfile : ĠPsi File , ĊĠĠĠĠĠĠĠ Ġhead less Environment : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġlocal Scope Files : ĠMutable Collection < Virtual File >? ĊĠĠĠ Ġ): ĠDocument ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġfile . virtual File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( is Binary ( file )) Ġreturn Ġnull Ġ// do Ġnot Ġinspect Ġbinary Ġfiles ĊĠĠĠĠĠĠĠ Ġif Ġ( is View Closed Ġ&& Ġ! headless Environment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Canceled Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( logger . isDebugEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Running Ġlocal Ġins pe ctions Ġon Ġ" Ġ+ Ġvirtual File . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Single Root File View Provider . is Too Large For Int elligence ( virtual File )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( local Scope Files Ġ!= Ġnull Ġ&& Ġ! local Scope Files . add ( virtual File )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! Problem Highlight Filter . should Process File In Batch ( file )) Ġnull Ġelse ĠPsi Document Manager . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject ĊĠĠĠĠĠĠĠ Ġ). getDocument ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Binary ( file : ĠPsi File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Ġis ĠPsi Binary File Ġ|| Ġfile . fileType . is Binary ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo P md Process ( ĊĠĠĠĠĠĠĠ Ġfile : ĠPsi File , ĊĠĠĠĠĠĠĠ Ġali Project Component : ĠAli Project Component , ĊĠĠĠĠĠĠĠ Ġvirtual File : ĠVirtual File ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString Ġ= Ġdisplay Url Relative To Project ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual File . present able Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmy Progress Indicator . text Ġ= Ġ" PMD ĠProcess Ġin Ġ$ url " ĊĠĠĠĠĠĠĠ Ġval Ġviolations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAli P md Processor ( Ali Local Inspection Tool Provider . get Rule Sets ()). process File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Context Ġ= Ġali Project Component . getFile Context ( virtual File ) ĊĠĠĠĠĠĠĠ Ġfile Context ?. let Ġ{ Ġfc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Vi olations Ġ= ĠContainer Util . create Concurrent Soft Value Map < String , ĠList < Rule Violation >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġviolations . groupBy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . rule . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Vi olations [ entry . key ] Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfc . rule Vi olations Ġ= Ġrule Vi olations ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose ( no Sus pic ious Code Found : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . close ( no Sus pic ious Code Found ) ĊĠĠĠĠĠĠĠ ĠIns pection Action Extension Point . extension . extensions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . do On Close ( no Sus pic ious Code Found , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd View ( view : ĠIns pection Results View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . addView ( view ) ĊĠĠĠĠĠĠĠ ĠIns pection Action Extension Point . extension . extensions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . do On View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }