/* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* Ċ Ġ* ĠThe ĠOpen Search ĠContributors Ġrequire Ġcontributions Ġmade Ġto Ċ Ġ* Ġthis Ġfile Ġbe Ġlicensed Ġunder Ġthe ĠApache - 2 . 0 Ġlicense Ġor Ġa Ċ Ġ* Ġcompatible Ġopen Ġsource Ġlicense . Ċ Ġ* Ċ Ġ* ĠMod ifications ĠCopyright ĠOpen Search ĠContributors . ĠSee Ċ Ġ* ĠGitHub Ġhistory Ġfor Ġdetails . Ċ Ġ*/ Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġis Ġdistributed Ċ Ġ* Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ċ Ġ* Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ċ Ġ* Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ package Ġorg . opense arch . commons . notifications Ċ Ċ import Ġorg . opense arch . action . ActionListener Ċ import Ġorg . opense arch . action . Action Response Ċ import Ġorg . opense arch . client . node . Node Client Ċ import Ġorg . opense arch . common . io . stream . Write able Ċ import Ġorg . opense arch . commons . Config Constants . OP ENSE ARCH _ SECURITY _ USER _ INFO _ THREAD _ CONTEXT Ċ import Ġorg . opense arch . commons . notifications . Notification Constants . FEATURE _ INDEX _ MANAGE MENT Ċ import Ġorg . opense arch . commons . notifications . action . Base Response Ċ import Ġorg . opense arch . commons . notifications . action . Create Notification Config Request Ċ import Ġorg . opense arch . commons . notifications . action . Create Notification Config Response Ċ import Ġorg . opense arch . commons . notifications . action . Delete Notification Config Request Ċ import Ġorg . opense arch . commons . notifications . action . Delete Notification Config Response Ċ import Ġorg . opense arch . commons . notifications . action . Get Feature Channel List Request Ċ import Ġorg . opense arch . commons . notifications . action . Get Feature Channel ListResponse Ċ import Ġorg . opense arch . commons . notifications . action . Get Notification Config Request Ċ import Ġorg . opense arch . commons . notifications . action . Get Notification Config Response Ċ import Ġorg . opense arch . commons . notifications . action . Get Notification Event Request Ċ import Ġorg . opense arch . commons . notifications . action . Get Notification Event Response Ċ import Ġorg . opense arch . commons . notifications . action . Get Plugin Features Request Ċ import Ġorg . opense arch . commons . notifications . action . Get Plugin Features Response Ċ import Ġorg . opense arch . commons . notifications . action . Legacy Publish Notification Request Ċ import Ġorg . opense arch . commons . notifications . action . Legacy Publish Notification Response Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . CREATE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . DELETE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . GET _ FEATURE _ CHANNEL _ LIST _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . GET _ NOTIFICATION _ CONFIG _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . GET _ NOTIFICATION _ EVENT _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . GET _ PLUGIN _ FEATURES _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . LEG ACY _ PUBL ISH _ NOTIFICATION _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . SEND _ NOTIFICATION _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Notifications Actions . UPDATE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE Ċ import Ġorg . opense arch . commons . notifications . action . Send Notification Request Ċ import Ġorg . opense arch . commons . notifications . action . Send Notification Response Ċ import Ġorg . opense arch . commons . notifications . action . Update Notification Config Request Ċ import Ġorg . opense arch . commons . notifications . action . Update Notification Config Response Ċ import Ġorg . opense arch . commons . notifications . model . Channel Message Ċ import Ġorg . opense arch . commons . notifications . model . EventSource Ċ import Ġorg . opense arch . commons . utils . Secure Client Wrapper Ċ import Ġorg . opense arch . commons . utils . re createObject Ċ Ċ /** Ċ Ġ* ĠAll Ġthe Ġtransport Ġaction Ġplugin Ġinterfaces Ġfor Ġthe ĠNotification Ġplugin Ċ Ġ*/ Ċ object ĠNotifications Plugin Interface Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġnotification Ġconfiguration . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Notification Config ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠCreate Notification Config Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Create Notification Config Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠCreate Notification Config Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġnotification Ġconfiguration . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Notification Config ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠUpdate Notification Config Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Update Notification Config Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUPDATE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠUpdate Notification Config Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġnotification Ġconfiguration . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Notification Config ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠDelete Notification Config Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Delete Notification Config Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE _ NOTIFICATION _ CONFIG _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠDelete Notification Config Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġnotification Ġconfiguration . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Notification Config ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠGet Notification Config Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Get Notification Config Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGET _ NOTIFICATION _ CONFIG _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠGet Notification Config Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġnotification Ġevents . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Notification Event ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠGet Notification Event Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Get Notification Event Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGET _ NOTIFICATION _ EVENT _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠGet Notification Event Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġnotification Ġplugin Ġfeatures . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Plugin Features ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠGet Plugin Features Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Get Plugin Features Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGET _ PLUGIN _ FEATURES _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠGet Plugin Features Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġnotification Ġchannel Ġconfiguration Ġenabled Ġfor Ġa Ġfeature . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Feature Channel List ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠGet Feature Channel List Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Get Feature Channel ListResponse > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGET _ FEATURE _ CHANNEL _ LIST _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠGet Feature Channel ListResponse ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġnotification ĠAPI Ġenabled Ġfor Ġa Ġfeature . ĠNo ĠREST ĠAPI . ĠInternal ĠAPI Ġonly Ġfor ĠInter Ġplugin Ġcommunication . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Source ĠThe Ġnotification Ġevent Ġinformation ĊĠĠĠĠ Ġ* Ġ@ param Ġchannel Message ĠThe Ġnotification Ġmessage ĊĠĠĠĠ Ġ* Ġ@ param Ġchannel Ids ĠThe Ġlist Ġof Ġchannel Ġids Ġto Ġsend Ġmessage Ġto . ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend Notification ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġevent Source : ĠEvent Source , ĊĠĠĠĠĠĠĠ Ġchannel Message : ĠChannel Message , ĊĠĠĠĠĠĠĠ Ġchannel Ids : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Send Notification Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthread Context : ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . thread Pool (). thread Context . get Transient < String >( OP ENSE ARCH _ SECURITY _ USER _ INFO _ THREAD _ CONTEXT ) ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠSecure Client Wrapper ( client ) Ġ// ĠExec uting Ġrequest Ġin Ġpriv ileged Ġmode ĊĠĠĠĠĠĠĠ Ġwrapper . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS END _ NOTIFICATION _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSend Notification Request ( event Source , Ġchannel Message , Ġchannel Ids , Ġthread Context ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠSend Notification Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPub lishes Ġa Ġnotification ĠAPI Ġusing Ġthe Ġlegacy Ġnotification Ġimplementation . ĠNo ĠREST ĠAPI . ĊĠĠĠĠ Ġ* ĠInternal ĠAPI Ġonly Ġfor Ġthe ĠIndex ĠManagement Ġplugin . ĊĠĠĠĠ Ġ* Ġ@ param Ġclient ĠNode Ġclient Ġfor Ġmaking Ġtransport Ġaction ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġlegacy Ġpublish Ġnotification Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġfor Ġgetting Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpublish Legacy Notification ( ĊĠĠĠĠĠĠĠ Ġclient : ĠNode Client , ĊĠĠĠĠĠĠĠ Ġrequest : ĠLegacy Publish Notification Request , ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Legacy Publish Notification Response > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request . feature Ġ!= ĠFEATURE _ INDEX _ MANAGE MENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġchange Ġthis ; Ġdo Ġnot Ġpass Ġin ĠFEATURE _ INDEX _ MANAGE MENT Ġif Ġyou Ġare Ġnot Ġthe ĠIndex ĠManagement Ġplugin . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġpublish Ġnotification Ġmethod Ġonly Ġsupports Ġthe ĠIndex ĠManagement Ġfeature .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLE G ACY _ PUBL ISH _ NOTIFICATION _ ACTION _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap ActionListener ( listener ) Ġ{ Ġresponse Ġ-> Ġrecreate Object ( response ) Ġ{ ĠLegacy Publish Notification Response ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap Ġaction Ġlistener Ġon Ġconcrete Ġresponse Ġclass Ġby Ġa Ġnew Ġcreated Ġone Ġon ĠAction Response . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġrequired Ġbecause Ġthe Ġresponse Ġmay Ġbe Ġloaded Ġby Ġdifferent Ġclass loader Ġacross Ġplugins . ĊĠĠĠĠ Ġ* ĠThe Ġon Response ( Action Response ) Ġavoids Ġtype Ġcast Ġexception Ġand Ġgive Ġa Ġchance Ġto Ġrecreate ĊĠĠĠĠ Ġ* Ġthe Ġresponse Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< Response Ġ: ĠBase Response > Ġwrap ActionListener ( ĊĠĠĠĠĠĠĠ Ġlistener : ĠActionListener < Response >, ĊĠĠĠĠĠĠĠ Ġrecreate : Ġ( Write able ) Ġ-> ĠResponse ĊĠĠĠ Ġ): ĠActionListener < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠActionListener < Action Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( response : ĠAction Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre created Ġ= Ġresponse Ġas ? ĠResponse Ġ?: Ġrecreate ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Response ( re created ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( exception : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠActionListener < Response > ĊĠĠĠ Ġ} Ċ } Ċ