package Ġpin pak . core Ċ Ċ import Ġpin pak . logger Ċ Ċ abstract Ġclass ĠAbstract Pipeline ( p Name : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger ( this ) ĊĠĠĠ Ġinternal Ġval Ġhead : ĠHead Context Ġ= ĠHead Context ("$ p Name - Head Context ", Ġthis ) ĊĊĠĠĠ Ġinternal Ġval Ġtail : ĠTail Context Ġ= ĠTail Context ("$ p Name - Tail Context ", Ġthis ) ĊĊĠĠĠ Ġprivate Ġvar Ġe jection Handler : ĠE jection Handler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdelivery Handler : ĠDelivery Handler ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġhead . next Ġ= Ġtail ĊĠĠĠĠĠĠĠ Ġtail . previous Ġ= Ġhead ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġadd After ( cur : ĠBase Context , ĠnewName : ĠString , Ġinterceptor : ĠBase Interceptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Ctx Ġ= Ġbind New Context ( new Name , Ġinterceptor ) ĊĠĠĠĠĠĠĠ Ġval Ġafter Ġ= Ġcur . next ĊĠĠĠĠĠĠĠ Ġnew Ctx . next Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġnew Ctx . previous Ġ= Ġcur ĊĠĠĠĠĠĠĠ Ġafter . previous Ġ= Ġnew Ctx ĊĠĠĠĠĠĠĠ Ġcur . next Ġ= Ġnew Ctx ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġadd Before ( ĊĠĠĠĠĠĠĠ Ġcur : ĠBase Context , ĊĠĠĠĠĠĠĠ ĠnewName : ĠString , ĊĠĠĠĠĠĠĠ Ġinterceptor : ĠBase Interceptor ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Ctx Ġ= Ġbind New Context ( new Name , Ġinterceptor ) ĊĠĠĠĠĠĠĠ Ġval Ġfront Ġ= Ġcur . previous ĊĠĠĠĠĠĠĠ Ġnew Ctx . previous Ġ= Ġfront ĊĠĠĠĠĠĠĠ Ġnew Ctx . next Ġ= Ġcur ĊĠĠĠĠĠĠĠ Ġfront . next Ġ= Ġnew Ctx ĊĠĠĠĠĠĠĠ Ġcur . previous Ġ= Ġnew Ctx ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġremove ( context : ĠBase Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ!= Ġtail Ġ&& Ġcontext Ġ!= Ġhead ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfront Ġ= Ġcontext . previous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfront . next Ġ= Ġback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback . previous Ġ= Ġfront ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . next Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . previous Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġreplace ( re placed : ĠBase Context , ĠnewName : ĠString , Ġinterceptor : ĠBase Interceptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġ!= Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . name Ġ== Ġreplaced . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( re placed Ġ!= Ġtail Ġ&& Ġreplaced Ġ!= Ġhead ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfront Ġ= Ġcontext . previous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Ġ= Ġcontext . next ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ctx Ġ= Ġbind New Context ( new Name , Ġinterceptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ctx . previous Ġ= Ġfront ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ctx . next Ġ= Ġback ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfront . next Ġ= Ġnew Ctx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback . previous Ġ= Ġnew Ctx ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . next Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . previous Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġis Duplicate ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext : ĠBase Context Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġ!= Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . name Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( tail . name Ġ== Ġname Ġ|| Ġhead . name Ġ== Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind New Context ( name : ĠString , Ġinterceptor : ĠBase Interceptor ): ĠInter ceptor Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠInter ceptor Context ( name , Ġthis , Ġinterceptor ) ĊĠĠĠĠĠĠĠ Ġinterceptor . name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġreturn Ġctx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġvar Ġmessage Ġ= Ġ" Pipeline : [" ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġ!== Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ+= Ġ" (${ context . name })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ message ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Context Present ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Duplicate ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinject ( data : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhead . pump Data ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġe ject ( name : ĠString , Ġdata : ĠAny , Ġerror : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( e jection Handler Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe jection Handler !!. handle E jection ( name , Ġdata , Ġerror ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("{} Ġreached Ġend Ġof Ġ{} Ġpipeline Ġwithout Ġbeing Ġcaught ; Ġwith Ġ{}", data , name , error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdeliver ( name : ĠString , Ġdata : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( delivery Handler Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Handler !!. handle Delivery ( name , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe jection Handler ?. handle E jection ( name , Ġdata , ĠThrowable (" Reached Ġend Ġof Ġpipeline ; Ġwithout Ġbeing Ġintercept ed Ġor Ġdelivered ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġhandler Ġfor Ġany Ġexceptions Ġthat Ġget Ġe ject ed Ġthrough Ġthe Ġpipeline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister E jection Handler ( handler : ĠE jection Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe jection Handler Ġ= Ġhandler ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġhandler Ġfor Ġany Ġitems Ġthat Ġpass Ġall Ġthe Ġway Ġthrough Ġthe Ġpipeline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Deliver Handler ( handler : ĠDelivery Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelivery Handler Ġ= Ġhandler ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġthe Ġpipeline 's Ġhead Ġcontext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Head (): ĠBase Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhead ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġthe Ġpipeline 's Ġtail Ġcontext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Tail (): ĠBase Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtail ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġthe Ġpipeline 's Ġfirst Ġcontext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget First (): ĠBase Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhead . next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġthe Ġpipeline 's Ġlast Ġcontext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetLast (): ĠBase Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtail . previous ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetContext ( name : ĠString ): ĠBase Context ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġ!= Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . name Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ!= Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġcount Ġof Ġpipelines 's Ġintercept ors ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġwhile Ġ( context Ġ!== Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠ Ġ} Ċ } Ċ