tao-test/app/tao/models/classes/requiredAction/implementation/RequiredActionService.php

139 lines
4.4 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2015 (original work) Open Assessment Technologies SA;
*
*
*/
namespace oat\tao\model\requiredAction\implementation;
use oat\oatbox\event\Event;
use oat\tao\model\requiredAction\RequiredActionServiceInterface;
use oat\tao\model\requiredAction\RequiredActionInterface;
use oat\oatbox\service\ConfigurableService;
use oat\oatbox\service\ServiceManager;
/**
* Class RequiredActionService
*
* RequiredActionService is the service for work with required actions
* @see oat\tao\models\services\requiredAction\RequiredActionInterface
*
* @package oat\tao\models\services\requiredAction
* @author Aleh Hutnilau <hutnikau@1pt.com>
*/
class RequiredActionService extends ConfigurableService implements RequiredActionServiceInterface
{
/**
* Get list of required actions
* @return RequiredActionAbstract[] array of required action instances
*/
public function getRequiredActions()
{
$actions = $this->getOption(self::OPTION_REQUIRED_ACTIONS);
return $actions ? $actions : [];
}
/**
* Attach new action
* @param RequiredActionInterface $action
*/
public function attachAction(RequiredActionInterface $action)
{
$actions = $this->getRequiredActions();
$actions[] = $action;
$this->setOption(self::OPTION_REQUIRED_ACTIONS, $actions);
}
/**
* Detach old action by name
* @param string $name name of action
*/
public function detachAction($name)
{
$actions = $this->getRequiredActions();
foreach ($actions as $key => $action) {
if ($action->getName() === $name) {
unset($actions[$key]);
}
}
$this->setOption(self::OPTION_REQUIRED_ACTIONS, $actions);
}
/**
* Get required action by name
* @param string $name name of action
* @return RequiredActionInterface array of required action instances
*/
public function getRequiredAction($name)
{
$result = null;
$actions = $this->getOption(self::OPTION_REQUIRED_ACTIONS);
foreach ($actions as $action) {
if ($action->getName() === $name) {
$result = $action;
break;
}
}
return $result;
}
/**
* Get first action which should be executed (one of action's rules return true).
* @param string[] array of action names which should be checked. If array is empty all action will be checked.
* @param Event $contextEvent
* @return null|RequiredActionInterface
*/
public function getActionToBePerformed($names = [], Event $contextEvent = null)
{
$result = null;
if (empty($names)) {
$actionsToCheck = $this->getRequiredActions();
} else {
$actionsToCheck = [];
foreach ($names as $name) {
$actionsToCheck[] = $this->getRequiredAction($name);
}
}
/** @var RequiredActionInterface $requiredAction */
foreach ($actionsToCheck as $requiredAction) {
if ($requiredAction->mustBeExecuted($contextEvent)) {
$result = $requiredAction;
break;
}
}
return $result;
}
/**
* Check if any action must be executed and execute first of them.
* @param Event $event
*/
public static function checkRequiredActions(Event $event = null)
{
/** @var RequiredActionService $service */
$service = ServiceManager::getServiceManager()->get(self::CONFIG_ID);
$action = $service->getActionToBePerformed([], $event);
if ($action !== null) {
$action->execute([], $event);
}
}
}