0012024: remember popup window size in client state
[tine20] / tine20 / Tinebase / Event.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  Event
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2008-2011 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Lars Kneschke <l.kneschke@metaways.de>
10  */
11
12 /**
13  * class to handle events between the applications
14  *
15  * @package     Tinebase
16  * @subpackage  Event
17  */
18 class Tinebase_Event
19 {
20     /**
21      * keeps a list of currently processed events
22      * 
23      * @var array
24      */
25     static public $events = array();
26     
27     /**
28      * calls the handleEvent function in the controller of all enabled applications 
29      *
30      * @param  Tinebase_Event_Object  $_eventObject  the event object
31      */
32     static public function fireEvent(Tinebase_Event_Abstract $_eventObject)
33     {
34         self::$events[get_class($_eventObject)][$_eventObject->getId()] = $_eventObject;
35         
36         if (self::isDuplicateEvent($_eventObject)) {
37             // do nothing
38             return;
39         }
40         
41         foreach(Tinebase_Application::getInstance()->getApplicationsByState(Tinebase_Application::ENABLED) as $application) {
42             try {
43                 $controller = Tinebase_Core::getApplicationInstance($application, NULL, TRUE);
44             } catch (Tinebase_Exception_NotFound $e) {
45                 // application has no controller or is not useable at all
46                 continue;
47             }
48             if($controller instanceof Tinebase_Event_Interface) {
49                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . ' (' . __LINE__ . ') calling eventhandler for event ' . get_class($_eventObject) . ' of application ' . (string) $application);
50                 try {
51                     $controller->handleEvent($_eventObject);
52                 } catch (Exception $e) {
53                     if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . ' (' . __LINE__ . ') ' 
54                         . (string) $application . ' threw an exception: '
55                         . $e->getMessage()
56                     );
57                     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . ' (' . __LINE__ . ') ' . $e->getTraceAsString());
58                 }
59             }
60         }
61         
62         // try custom user defined listeners
63         try {
64             if (@class_exists('CustomEventHooks')) {
65                 $methods = get_class_methods('CustomEventHooks');
66                 if (in_array('handleEvent', (array)$methods)) {
67                     Tinebase_Core::getLogger()->info(__METHOD__ . ' (' . __LINE__ . ') ' . ' about to process user defined event hook for '. get_class($_eventObject));
68                     CustomEventHooks::handleEvent($_eventObject);
69                 }
70             }
71         } catch (Exception $e) {
72             Tinebase_Core::getLogger()->info(__METHOD__ . ' (' . __LINE__ . ') ' . ' failed to process user defined event hook with message: ' . $e);
73         }
74         
75         unset(self::$events[get_class($_eventObject)][$_eventObject->getId()]);
76     }
77     
78     /**
79      * checks if an event is duplicate
80      * 
81      * @todo   implement logic
82      * @param  Tinebase_Event_Abstract  $_eventObject  the event object
83      * @return boolean
84      */
85     static public function isDuplicateEvent(Tinebase_Event_Abstract $_eventObject)
86     {
87         return false;
88     }
89 }