PEIP_ABS_Interceptable_Message_Channel.php

Go to the documentation of this file.
00001 <?php
00002 
00003 /*
00004  * This file is part of the PEIP package.
00005  * (c) 2010 Timo Michna <timomichna/yahoo.de>
00006  * 
00007  * For the full copyright and license information, please view the LICENSE
00008  * file that was distributed with this source code.
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 }

Generated on Mon Apr 12 11:39:00 2010 for PEIP by  doxygen 1.5.1