/**
  * @see wcf\system\cache\ICacheBuilder::getData()
  */
 public function getData(array $cacheResource)
 {
     list($cache, $packageID) = explode('-', $cacheResource['cache']);
     $data = array('actions' => array('user' => array(), 'admin' => array()), 'inheritedActions' => array('user' => array(), 'admin' => array()));
     // get all listeners and filter options with low priority
     $sql = "SELECT\t\tevent_listener.*\n\t\t\tFROM\t\twcf" . WCF_N . "_event_listener event_listener\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_dependency package_dependency\n\t\t\tON\t\t(package_dependency.dependency = event_listener.packageID)\n\t\t\tWHERE \t\tpackage_dependency.packageID = ?\n\t\t\tORDER BY\tpackage_dependency.priority ASC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($packageID));
     while ($row = $statement->fetchArray()) {
         // distinguish between inherited actions and non-inherited actions
         if (!$row['inherit']) {
             $data['actions'][$row['environment']][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;
         } else {
             if (!isset($data['inheritedActions'][$row['environment']][$row['eventClassName']])) {
                 $data['inheritedActions'][$row['environment']][$row['eventClassName']] = array();
             }
             $data['inheritedActions'][$row['environment']][$row['eventClassName']][$row['eventName']][] = $row;
         }
     }
     // sort data by nice value and class name
     foreach ($data['actions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             uasort($listeners, array(__CLASS__, 'sortListeners'));
         }
     }
     foreach ($data['inheritedActions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             foreach ($listeners as &$val) {
                 uasort($val, array(__CLASS__, 'sortListeners'));
             }
         }
     }
     return $data;
 }
 /**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 public function rebuild(array $parameters)
 {
     $data = array('actions' => array('user' => array(), 'admin' => array()), 'inheritedActions' => array('user' => array(), 'admin' => array()));
     // get all listeners and filter options with low priority
     $sql = "SELECT\tevent_listener.*\n\t\t\tFROM\twcf" . WCF_N . "_event_listener event_listener";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     while ($row = $statement->fetchArray()) {
         // distinguish between inherited actions and non-inherited actions
         if (!$row['inherit']) {
             $data['actions'][$row['environment']][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;
         } else {
             if (!isset($data['inheritedActions'][$row['environment']][$row['eventClassName']])) {
                 $data['inheritedActions'][$row['environment']][$row['eventClassName']] = array();
             }
             $data['inheritedActions'][$row['environment']][$row['eventClassName']][$row['eventName']][] = $row;
         }
     }
     // sort data by nice value and class name
     foreach ($data['actions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             uasort($listeners, array(__CLASS__, 'sortListeners'));
         }
     }
     foreach ($data['inheritedActions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             foreach ($listeners as &$val) {
                 uasort($val, array(__CLASS__, 'sortListeners'));
             }
         }
     }
     return $data;
 }