/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 . ĠAlex andre ĠBo yer Ċ Ġ*/ Ċ Ċ package Ġnet . pl pgsql . ide ade bug ger . run Ċ Ċ import Ġcom . intellij . database . debugger . Sql Debug Process Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . run Read Action Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . progress . impl . Background able Process Indicator Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . x debugger . X Debug Session Ċ import Ġcom . intellij . x debugger . X Source Position Ċ import Ġcom . intellij . x debugger . breakpoints . X Breakpoint Handler Ċ import Ġcom . intellij . x debugger . breakpoints . X Breakpoint Listener Ċ import Ġcom . intellij . x debugger . breakpoints . X Line Breakpoint Ċ import Ġcom . intellij . x debugger . evaluation . X Debugger Editors Provider Ċ import Ġcom . intellij . x debugger . frame . X Execution Stack Ċ import Ġcom . intellij . x debugger . frame . X Suspend Context Ċ import Ġnet . pl pgsql . ide ade bug ger .* Ċ import Ġnet . pl pgsql . ide ade bug ger . breakpoint . Pl Line Breakpoint Properties Ċ import Ġnet . pl pgsql . ide ade bug ger . breakpoint . Pl Line Breakpoint Type Ċ import Ġnet . pl pgsql . ide ade bug ger . command . Api Query Ċ import Ġnet . pl pgsql . ide ade bug ger . command . Pl Api Step Ċ import Ġnet . pl pgsql . ide ade bug ger . command . Pl Executor Ċ import Ġnet . pl pgsql . ide ade bug ger . service . Pl Process Watcher Ċ import Ġnet . pl pgsql . ide ade bug ger . vfs . Pl Function Source Ċ import Ġnet . pl pgsql . ide ade bug ger . vfs . Pl Source Manager Ċ import Ġnet . pl pgsql . ide ade bug ger . vfs . Pl Virtual FileSystem Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠSQL Ġrunner Ġfor Ġthe Ġdebugger Ġsession Ċ Ġ*/ Ċ class ĠPl Process ( ĊĠĠĠ Ġsession : ĠX Debug Session , ĊĠĠĠ Ġval Ġexecutor : ĠPl Executor Ċ ) Ġ: ĠSql Debug Process ( session ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger < Pl Process >() ĊĠĠĠ Ġprivate Ġval Ġbreak points Ġ= Ġmutable Map Of < String , ĠMutable List < X Line Breakpoint < Pl Line Breakpoint Properties >> >() ĊĠĠĠ Ġprivate Ġval Ġcontext Ġ= ĠX Context () ĊĠĠĠ Ġprivate Ġvar Ġstack : ĠX Stack Ġ= ĠX Stack ( this ) ĊĠĠĠ Ġprivate Ġvar Ġbreak Point Handler Ġ= ĠBreak Point Handler () ĊĠĠĠ Ġinternal Ġval Ġcommand Ġ= ĠLinked BlockingQueue < Api Query >() ĊĠĠĠ Ġvar Ġmode : ĠDebug Mode Ġ= ĠDebug Mode . NONE ĊĠĠĠ Ġprivate Ġval Ġproxy Task Ġ= ĠProxy Task ( session . project , Ġ" PL / pg ĠDebug ") ĊĠĠĠ Ġprivate Ġvar Ġproxy Progress : ĠProxy Indicator ? Ġ= Ġnull ĊĠĠĠ Ġval Ġfile Manager Ġ= ĠPl Source Manager ( session . project , Ġexecutor ) ĊĠĠĠ Ġprivate Ġvar Ġcall Def : ĠCall Definition ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġstart Step Over ( context : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest : Ġstart Step Over ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ OVER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Step Into ( context : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest : Ġstart Step Into ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ IN TO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresume ( context : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest : Ġresume ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ CONTINUE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Debug ( call Ġ: ĠCall Definition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Process Ġstart Debug ") ĊĠĠĠĠĠĠĠ Ġthis . call Def Ġ= Ġcall ĊĠĠĠĠĠĠĠ Ġexecutor . entry Point Ġ= Ġcall Def !!. oid ĊĠĠĠĠĠĠĠ Ġmode Ġ= Ġcall Def !!. debug Mode ĊĠĠĠĠĠĠĠ Ġexecutor . set Info (" From Ġauxiliary Ġrequest : Ġstart Debug ") ĊĠĠĠĠĠĠĠ Ġproxy Progress Ġ= ĠProxy Indicator ( proxy Task ) ĊĠĠĠĠĠĠĠ ĠProgress Manager . getInstance (). run Process With Progress As ynchronously ( proxy Task , Ġproxy Progress !! ) ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . VOID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Force Step Into ( context : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest Ġnot Ġsupported : Ġuse Ġstart Step Into ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ IN TO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Step Out ( context : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest Ġnot Ġsupported : Ġuse Ġresume ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ OVER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Process Ġstop ") ĊĠĠĠĠĠĠĠ Ġproxy Progress ?. cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun To Position ( position : ĠX Source Position , Ġcontext : ĠX Suspend Context ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest : Ġrun To Position ") ĊĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . VOID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Stack (): ĠStep Info ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . debug (" User Ġrequest : Ġupdate Stack ") ĊĠĠĠĠĠĠĠ Ġval Ġpl Stack s Ġ= Ġexecutor . get Stack () ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġreach Ġthis Ġframe Ġfor Ġthe Ġfirst Ġtime ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġstack . top Frame ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠX Stack . X Frame ). file . oid Ġ!= Ġpl Stack s . first OrNull ()?. oid ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof Ġindirect Ġdebugging Ġcheck Ġit 's Ġfirst Ġline ĊĠĠĠĠĠĠĠ Ġif Ġ(! first Ġ&& Ġmode Ġ== ĠDebug Mode . IN DIRECT Ġ&& Ġstack . top Frame Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( stack . top Frame Ġas ĠX Stack . X Frame ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġit . getSource Line () Ġ== Ġit . file . code Range . first Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexecutor . set Debug (" Reach Ġframe Ġ${ pl Stack s . first OrNull ()?. oid }, Ġfirst =$ first ") ĊĠĠĠĠĠĠĠ Ġstack . clear () ĊĠĠĠĠĠĠĠ Ġpl Stack s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Manager . update ( it )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ-> Ġstack . append ( it , Ġsource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( stack . top Frame Ġas ĠX Stack . X Frame ?) ?. let Ġ{ Ġframe Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġstack Ġand Ġfile Ġbreakpoint Ġlist Ġfor Ġmerge ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Break Points Ġ= Ġexecutor . get Break Points (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . oid Ġ== Ġframe . file . oid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . line Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . line Ġ+ Ġframe . file . start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Break Points Ġ= Ġbreak points [" ${ frame . pl Frame . oid } "] ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . line ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġstack Ġbreak Ġpoint Ġnot Ġin Ġfile Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Break Points . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! file Break Points . contains ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . update Break Point ( Api Query . DROP _ BREAK POINT , Ġframe . file . oid , Ġit Ġ- Ġframe . file . start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġmissing Ġbreak Points Ġto Ġstack Ġand Ġverify Ġfor Ġexisting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( to Check , Ġto Add ) Ġ= Ġfile Break Points . partition Ġ{ Ġstack Break Points . contains ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak points [" ${ frame . pl Frame . oid } "] ?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Add . contains ( it . line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Breakpoint ( frame . file , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak points [" ${ frame . pl Frame . oid } "] ?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Check . contains ( it . line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . set Breakpoint Verified ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġcan Ġgo Ġto Ġnext Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġfirst Ġ&& Ġfile Break Points . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! file Break Points . any Ġ{ Ġframe . pl Frame . line Ġ== Ġit Ġ- Ġframe . file . start Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . set Debug (" Got Ġto Ġnext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . STEP _ CONTINUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . position Reached ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStep Info ( frame . getSource Line () Ġ+ Ġ 1 , Ġframe . file . code Range . second , Ġframe . getSource Ratio ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Breakpoint ( file : ĠPl Function Source , Ġbreakpoint : ĠX Line Breakpoint < Pl Line Breakpoint Properties >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" add Breakpoint : Ġfile =${ file . name }, Ġline =${ breakpoint . line }") ĊĠĠĠĠĠĠĠ Ġif Ġ( executor . update Break Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . SET _ BREAK POINT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . oid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreakpoint . line Ġ- Ġfile . start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . set Breakpoint Verified ( breakpoint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrop Breakpoint ( file : ĠPl Function Source , Ġbreakpoint : ĠX Line Breakpoint < Pl Line Breakpoint Properties >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" drop Breakpoint : Ġfile =${ file . name }, Ġline =${ breakpoint . line }") ĊĠĠĠĠĠĠĠ Ġexecutor . update Break Point ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . DROP _ BREAK POINT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . oid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreakpoint . line Ġ- Ġfile . start ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Editors Provider (): ĠX Debugger Editors Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPl Editor Provider . INSTANCE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Can Init Break points (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Can Perform Commands (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Task . running . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Breakpoint Handlers (): ĠArray < X Breakpoint Handler <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( break Point Handler ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠX Context Ġ: ĠX Suspend Context () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Active Execution Stack (): ĠX Execution Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstack ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Execution Stack s (): ĠArray < X Execution Stack > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( stack ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Execution Stack s ( container : ĠX Execution Stack Container ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer ?. add Execution Stack ( mutable ListOf ( stack ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠBreak Point Handler Ġ: ĊĠĠĠĠĠĠĠ ĠX Breakpoint Handler < X Line Breakpoint < Pl Line Breakpoint Properties >>( Pl Line Breakpoint Type :: class . java ), ĊĠĠĠĠĠĠĠ ĠX Breakpoint Listener < X Line Breakpoint < Pl Line Breakpoint Properties >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Breakpoint ( breakpoint : ĠX Line Breakpoint < Pl Line Breakpoint Properties >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . set Info (" register Breakpoint : Ġ${ breakpoint . file Url } Ġ=> Ġ${ breakpoint . line }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġbreakpoint . file Url . remove Prefix ( Pl Virtual FileSystem . PROTOCOL _ PREFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠPl Virtual FileSystem . getInstance (). find File By Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġready To Accept Break Point ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Breakpoint ( file , Ġbreakpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak points [ path ]?. add ( breakpoint ) Ġ?: Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak points [ path ] Ġ= Ġmutable ListOf ( breakpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġunregister Breakpoint ( breakpoint : ĠX Line Breakpoint < Pl Line Breakpoint Properties >, Ġtemporary : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . set Info (" unregister Breakpoint : Ġ${ breakpoint . file Url } Ġ=> Ġ${ breakpoint . line }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġbreakpoint . file Url . remove Prefix ( Pl Virtual FileSystem . PROTOCOL _ PREFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠPl Virtual FileSystem . getInstance (). find File By Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġready To Accept Break Point ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Breakpoint ( file , Ġbreakpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak points [ path ]?. remove If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . line Ġ== Ġbreakpoint . line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġready To Accept Break Point (): ĠBoolean Ġ= Ġproxy Task . running . get () Ġ&& Ġ! executor . waiting For Completion ĊĊĠĠĠ Ġinner Ġclass ĠProxy Task ( project : ĠProject , Ġtitle : ĠString ) Ġ: ĠTask . Background able ( project , Ġtitle , Ġtrue ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger 1 Ġ= Ġlogger < Proxy Task >() ĊĠĠĠĠĠĠĠ Ġval Ġrunning Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġwatcher Ġ= ĠApplication Manager . getApplication (). getService ( Pl Process Watcher :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinner Thread Ġ= ĠInner Thread () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Run Ġproxy ĠTask ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . text Ġ= Ġ" PL / pg ĠDebug Ġ(${ call Def ?. routine })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . isIn determinate Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Thread . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatcher . process Started ( this @ Pl Process , Ġmode , Ġcall Def ?. oid Ġ?: Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! indicator . is Canceled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning . set ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Thread . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Proxy Task Ġrun Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatcher . process Finished ( this @ Pl Process ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠDebug Mode . IN DIRECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Stops Ġsession Ġfor Ġindirect Ġdebugging ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠProxy Indicator ( task : ĠProxy Task ): ĠBackground able Process Indicator ( task ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdisplay Info ( query : ĠApi Query , Ġstep : ĠPl Api Step , Ġinfo : ĠStep Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfraction Ġ= Ġinfo . ratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step . line Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Progress ?. text 2 Ġ= Ġ" Waiting Ġfor Ġstep Ġ[ ${ info . pos } Ġ/ Ġ${ info . total }] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Progress ?. text 2 Ġ= Ġ" Last Ġstep Ġ${ query . name } Ġ[ ${ info . pos } Ġ/ Ġ${ info . total }] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThread Ġfor Ġdebugging Ġcommands ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠInner Thread Ġ: ĠThread () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger 1 Ġ= Ġlogger < Inner Thread >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" cancel ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . cancel Statement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! command . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ( Api Query . ABORT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Thread Ġrun ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( executor . entry Point Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . warn (" Invalid Ġentry Ġpoint ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . create Listener () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . set Global Break Point () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . waitFor Target () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . error (" Run Ġfailed Ġto Ġstart ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Progress ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( executor . inter rupted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Executor Ġis Ġinterrupted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Loop Ġwhile Ġproxy Ġtask Ġis Ġnot Ġinterrupted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( proxy Task . running . get ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcommand . take () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Command Ġwas Ġtaken Ġfrom Ġqueue : Ġ${ query . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstep : ĠPl Api Step ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . ABORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . abort () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . VOID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= ĠPl Api Step ( executor . entry Point , Ġ- 1 , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . STEP _ OVER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . STEP _ CONTINUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Query . STEP _ IN TO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġexecutor . run Step ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . warn (" Unsupported Ġcommand , Ġcancel ing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Progress ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stack ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Progress ?. display Info ( query , Ġstep , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . print Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . cancel And Close Connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger 1 . debug (" Thread Ġend ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠStep Info ( val Ġpos : ĠInt , Ġval Ġtotal : ĠInt , Ġval Ġratio : ĠDouble ) ĊĊ Ċ }