00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00019 abstract class PEIP_ABS_Interceptable_Message_Channel
00020 implements
00021 PEIP_INF_Channel,
00022 PEIP_INF_Interceptable,
00023 PEIP_INF_Connectable {
00024
00025 protected
00026 $eventDispatcher,
00027 $interceptorDispatcher,
00028 $name,
00029 $interceptors = array();
00030
00031 protected static
00032 $sharedEventDispatcher;
00033
00034
00040 public function __construct($name){
00041 $this->name = $name;
00042 }
00043
00048 public function getName(){
00049 return $this->name;
00050 }
00051
00057 public function setInterceptorDispatcher(PEIP_Interceptor_Dispatcher $dispatcher){
00058 $this->interceptorDispatcher = $dispatcher;
00059 }
00060
00061
00066 public function getInterceptorDispatcher(){
00067 return is_object($this->interceptorDispatcher) ? $this->interceptorDispatcher : $this->interceptorDispatcher = new PEIP_Interceptor_Dispatcher();
00068 }
00069
00070
00078 protected function dispatchInterceptor(PEIP_INF_Message $message, $eventName, array $parameters = array()){
00079 array_unshift($parameters, $message, $this);
00080 return $this->getInterceptorDispatcher()->notify($eventName, $parameters);
00081 }
00082
00083
00090 public function send(PEIP_INF_Message $message, $timeout = -1){
00091 $this->dispatchInterceptor($message, 'preSend');
00092 $this->doFireEvent('preSend', array('MESSAGE'=>$message));
00093 $sent = $this->doSend($message);
00094 $this->dispatchInterceptor($message, 'postSend', array('sent' => $sent));
00095 $this->doFireEvent('postSend', array('MESSAGE'=>$message, 'SENT' => $sent));
00096 }
00097
00098
00104 abstract protected function doSend(PEIP_INF_Message $message);
00105
00106
00112 public function addInterceptor(PEIP_INF_Channel_Interceptor $interceptor){
00113
00114 $hash = spl_object_hash($interceptor);
00115 $this->interceptors[$hash] = $interceptor;
00116 $this->interceptorsHandlers[$hash] = array();
00117 foreach(array('preSend', 'postSend') as $event){
00118 $handler = new PEIP_Callable_Message_Handler(array($interceptor, $event));
00119 $this->connectInterceptor($event, $handler);
00120 $this->interceptorsHandlers[$hash][$event] = $handler;
00121 }
00122 }
00123
00124
00131 public function connectInterceptor($eventName, $handler){
00132 $this->getInterceptorDispatcher()->connect($eventName, $handler);
00133 }
00134
00140 public function deleteInterceptor(PEIP_INF_Channel_Interceptor $interceptor){
00141 $hash = spl_object_hash($interceptor);
00142 $handlers = $this->interceptorsHandlers[$hash];
00143 $this->getInterceptorDispatcher()->disconnect('preSend', $handlers['preSend']);
00144 $this->getInterceptorDispatcher()->disconnect('postSend', $handlers['postSend']);
00145 unset($this->interceptors[$hash]);
00146 unset($this->interceptors[$hash]);
00147 }
00148
00153 public function getInterceptors(){
00154 return array_values($this->interceptors);
00155 }
00156
00162 public function setInterceptors(array $interceptors){
00163 $this->clearInterceptors();
00164 foreach($interceptors as $interceptor){
00165 $this->addInterceptor($interceptor);
00166 }
00167 }
00168
00173 public function clearInterceptors(){
00174 foreach($this->interceptors as $interceptor){
00175 $this->deleteInterceptor($interceptor);
00176 }
00177 }
00178
00185 public function connect($name, PEIP_INF_Handler $listener){
00186 $this->getEventDispatcher()->connect($name, $this, $listener);
00187 }
00188
00195 public function disconnect($name, PEIP_INF_Handler $listener){
00196 $this->getEventDispatcher()->disconnect($name, $this, $listener);
00197 }
00198
00204 public function hasListeners($name){
00205 return $this->getEventDispatcher()->hasListeners($name, $this);
00206 }
00207
00213 public function getListeners($name){
00214 return $this->getEventDispatcher()->getListeners($name, $this);
00215 }
00216
00223 public function setEventDispatcher(PEIP_Object_Event_Dispatcher $dispatcher, $transferListners = true){
00224 if($transferListners){
00225 foreach($this->eventDispatcher->getEventNames($this) as $name){
00226 if($this->eventDispatcher->hasListeners($name, $this)){
00227 foreach($this->eventDispatcher->getListeners($name, $this) as $listener){
00228 $dispatcher->connect($name, $this, $listener);
00229 }
00230 }
00231 }
00232 }
00233 $this->eventDispatcher = $dispatcher;
00234 }
00235
00240 public function getEventDispatcher(){
00241 return $this->eventDispatcher ? $this->eventDispatcher : $this->eventDispatcher = self::getSharedEventDispatcher();
00242 }
00243
00249 protected static function getSharedEventDispatcher(){
00250 return self::$sharedEventDispatcher ? self::$sharedEventDispatcher : self::$sharedEventDispatcher = new PEIP_Object_Event_Dispatcher;
00251 }
00252
00260 protected function doFireEvent($name, array $headers = array(), $eventClass = false){
00261 return $this->getEventDispatcher()->buildAndNotify($name, $this, $headers, $eventClass);
00262 }
00263 }