/* Ċ Ġ* ĠCopyright ĠOpen Search ĠContributors Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġorg . opense arch . notifications . action Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . opense arch . Open Search Security Exception Ċ import Ġorg . opense arch . Open Search Status Exception Ċ import Ġorg . opense arch . action . ActionListener Ċ import Ġorg . opense arch . action . Action Request Ċ import Ġorg . opense arch . action . Action Response Ċ import Ġorg . opense arch . action . support . Action Filters Ċ import Ġorg . opense arch . action . support . Handled Transport Action Ċ import Ġorg . opense arch . client . Client Ċ import Ġorg . opense arch . common . io . stream . Write able Ċ import Ġorg . opense arch . common . util . concurrent . Thread Context Ċ import Ġorg . opense arch . commons . Config Constants . OP ENSE ARCH _ SECURITY _ USER _ INFO _ THREAD _ CONTEXT Ċ import Ġorg . opense arch . commons . auth user . User Ċ import Ġorg . opense arch . commons . utils . logger Ċ import Ġorg . opense arch . index . Index NotFoundException Ċ import Ġorg . opense arch . index . engine . Version Conflict Engine Exception Ċ import Ġorg . opense arch . indices . Invalid Index Name Exception Ċ import Ġorg . opense arch . notifications . Notification Plugin . Companion . LOG _ PREFIX Ċ import Ġorg . opense arch . notifications . metrics . Metrics Ċ import Ġorg . opense arch . rest . Rest Status Ċ import Ġorg . opense arch . tasks . Task Ċ import Ġorg . opense arch . transport . Transport Service Ċ import Ġjava . io . IOException Ċ Ċ internal Ġabstract Ġclass ĠPlugin Base Action < Request Ġ: ĠAction Request , ĠResponse Ġ: ĠAction Response >( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġtransport Service : ĠTransport Service , ĊĠĠĠ Ġval Ġclient : ĠClient , ĊĠĠĠ Ġaction Filters : ĠAction Filters , ĊĠĠĠ Ġrequest Reader : ĠWrite able . Reader < Action Request > Ċ ) Ġ: ĠHand led Transport Action < Action Request , ĠResponse >( name , Ġtransport Service , Ġaction Filters , Ġrequest Reader ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġby Ġlogger ( Plugin Base Action :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ inheritDoc } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ", Ġ" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġdo Execute ( ĊĠĠĠĠĠĠĠ Ġtask : ĠTask ?, ĊĠĠĠĠĠĠĠ Ġrequest : ĠAction Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Str : ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . thread Pool (). thread Context . get Transient < String >( OP ENSE ARCH _ SECURITY _ USER _ INFO _ THREAD _ CONTEXT ) ĊĠĠĠĠĠĠĠ Ġval Ġuser : ĠUser ? Ġ= ĠUser . parse ( user Str ) ĊĠĠĠĠĠĠĠ Ġval Ġstored Thread Context Ġ= Ġclient . thread Pool (). thread Context . new Stored Context ( false ) ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . thread Pool (). thread Context . stash Context (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstored Thread Context . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Response ( execute Request ( request Ġas ĠRequest , Ġuser )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠOpen Search Status Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ OS _ STATUS _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : Open Search Status Exception :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠOpen Search Security Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ OS _ SECURITY _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : Open Search Security Exception :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Search Status Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permissions Ġdenied : Ġ${ exception . message } Ġ- ĠContact Ġadministrator ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRest Status . FOR BID DEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠVersion Conflict Engine Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ VERSION _ CONF LI CT _ ENGINE _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : Version Conflict Engine Exception :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . CONF LI CT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIndex NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ INDEX _ NOT _ FOUND _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : Index NotFoundException :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . NOT _ FOUND )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInvalid Index Name Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ INVALID _ INDEX _ NAME _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : Invalid Index Name Exception :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . BAD _ REQUEST )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ IL LEG AL _ ARGUMENT _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : IllegalArgumentException :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . BAD _ REQUEST )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ IL LEG AL _ STATE _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ LOG _ PREFIX : IllegalStateException :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . SERVICE _ UN AVAILABLE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ IO _ EXCEPTION . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ("$ LOG _ PREFIX : Un caught ĠIOException :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . FAILED _ DEPEND ENCY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . NOTIFICATION S _ EXCEPTION S _ INTERNAL _ SERVER _ ERROR . counter . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ("$ LOG _ PREFIX : Un caught ĠException :", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Open Search Status Exception ( exception . message , ĠRest Status . INTERNAL _ SERVER _ ERROR )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġtransport Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġrequest Ġto Ġexecute ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ġthe Ġuser Ġcontext Ġgiven Ġby Ġsecurity Ġplugin ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresponse Ġto Ġreturn . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġexecute Request ( request : ĠRequest , Ġuser : ĠUser ?): ĠResponse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġthe Ġgiven Ġ[ block ] Ġfunction Ġon Ġthis Ġresource Ġand Ġthen Ġcloses Ġit Ġdown Ġcorrectly Ġwhether Ġan Ġexception ĊĠĠĠĠ Ġ* Ġis Ġthrown Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġcase Ġif Ġthe Ġresource Ġis Ġbeing Ġclosed Ġdue Ġto Ġan Ġexception Ġoccurred Ġin Ġ[ block ], Ġand Ġthe Ġclosing Ġalso Ġfails Ġwith Ġan Ġexception , ĊĠĠĠĠ Ġ* Ġthe Ġlatter Ġis Ġadded Ġto Ġthe Ġ[ sup pressed ][ java . lang . Throwable . add Sup pressed ] Ġexceptions Ġof Ġthe Ġformer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġa Ġfunction Ġto Ġprocess Ġthis Ġ[ Auto Closeable ] Ġresource . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresult Ġof Ġ[ block ] Ġfunction Ġinvoked Ġon Ġthis Ġresource . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") ĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T Ġ: ĠThread Context . Stored Context , ĠR > ĠT . use ( block : Ġ( T ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Finally ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthis Ġ[ Auto Closeable ], Ġsuppress ing Ġpossible Ġexception Ġor Ġerror Ġthrown Ġby Ġ[ Auto Closeable . close ] Ġfunction Ġwhen ĊĠĠĠĠ Ġ* Ġit 's Ġbeing Ġclosed Ġdue Ġto Ġsome Ġother Ġ[ cause ] Ġexception Ġoccurred . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġsupp ressed Ġexception Ġis Ġadded Ġto Ġthe Ġlist Ġof Ġsupp ressed Ġexceptions Ġof Ġ[ cause ] Ġexception . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") ĊĠĠĠ Ġprivate Ġfun ĠThread Context . Stored Context . close Finally ( cause : ĠThrowable ?) Ġ= Ġwhen Ġ( cause ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġclose () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( close Exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause . add Sup pressed ( close Exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ