container = $container; $this->project_id = $project_id; $this->event_name = $event_name; $this->called = false; } /** * Return class information * * @access public * @return string */ public function __toString() { return get_called_class(); } /** * Set an user defined parameter * * @access public * @param string $name Parameter name * @param mixed $value Value */ public function setParam($name, $value) { $this->params[$name] = $value; } /** * Get an user defined parameter * * @access public * @param string $name Parameter name * @param mixed $default_value Default value * @return mixed */ public function getParam($name, $default_value = null) { return isset($this->params[$name]) ? $this->params[$name] : $default_value; } /** * Check if an action is executable (right project and required parameters) * * @access public * @param array $data Event data dictionary * @return bool True if the action is executable */ public function isExecutable(array $data) { return $this->hasCompatibleEvent() && $this->hasRequiredProject($data) && $this->hasRequiredParameters($data) && $this->hasRequiredCondition($data); } /** * Check if the event is compatible with the action * * @access public * @return bool */ public function hasCompatibleEvent() { return in_array($this->event_name, $this->getCompatibleEvents()); } /** * Check if the event data has the required project * * @access public * @param array $data Event data dictionary * @return bool */ public function hasRequiredProject(array $data) { return isset($data['project_id']) && $data['project_id'] == $this->project_id; } /** * Check if the event data has required parameters to execute the action * * @access public * @param array $data Event data dictionary * @return bool True if all keys are there */ public function hasRequiredParameters(array $data) { foreach ($this->getEventRequiredParameters() as $parameter) { if (! isset($data[$parameter])) { return false; } } return true; } /** * Execute the action * * @access public * @param \Event\GenericEvent $event Event data dictionary * @return bool True if the action was executed or false when not executed */ public function execute(GenericEvent $event) { // Avoid infinite loop, a listener instance can be called only one time if ($this->called) { return false; } $data = $event->getAll(); if ($this->isExecutable($data)) { $this->called = true; return $this->doAction($data); } return false; } }