Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
87.50% covered (warning)
87.50%
7 / 8
CRAP
97.06% covered (success)
97.06%
33 / 34
manager
0.00% covered (danger)
0.00%
0 / 1
87.50% covered (warning)
87.50%
7 / 8
16
97.06% covered (success)
97.06%
33 / 34
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 load_tasks
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 load_tasks_from_container
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
 find_one_ready_task
0.00% covered (danger)
0.00%
0 / 1
3.04
83.33% covered (warning)
83.33%
5 / 6
 find_all_ready_tasks
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
6 / 6
 find_task
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
5 / 5
 get_tasks
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 wrap_task
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\cron;
use phpbb\cron\task\wrapper;
use phpbb\routing\helper;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Cron manager class.
*
* Finds installed cron tasks, stores task objects, provides task selection.
*/
class manager
{
    /**
     * @var ContainerInterface
     */
    protected $phpbb_container;
    /**
     * @var helper
     */
    protected $routing_helper;
    /**
    * Set of \phpbb\cron\task\wrapper objects.
    * Array holding all tasks that have been found.
    *
    * @var array
    */
    protected $tasks = [];
    /**
     * Flag indicating if $this->tasks contains tasks registered in the container
     *
     * @var bool
     */
    protected $is_initialised_from_container = false;
    /**
     * @var string
     */
    protected $phpbb_root_path;
    /**
     * @var string
     */
    protected $php_ext;
    /**
     * @var \phpbb\template\template
     */
    protected $template;
    /**
    * Constructor. Loads all available tasks.
    *
    * @param ContainerInterface $phpbb_container Container
    * @param helper $routing_helper Routing helper
    * @param string $phpbb_root_path Relative path to phpBB root
    * @param string $php_ext PHP file extension
    * @param \phpbb\template\template $template
    */
    public function __construct(ContainerInterface $phpbb_container, helper $routing_helper, $phpbb_root_path, $php_ext, $template)
    {
        $this->phpbb_container = $phpbb_container;
        $this->routing_helper = $routing_helper;
        $this->phpbb_root_path = $phpbb_root_path;
        $this->php_ext = $php_ext;
        $this->template = $template;
    }
    /**
    * Loads tasks given by name, wraps them
    * and puts them into $this->tasks.
    *
    * @param array|\Traversable $tasks        Array of instances of \phpbb\cron\task\task
    */
    public function load_tasks($tasks)
    {
        foreach ($tasks as $task)
        {
            $this->tasks[] = $this->wrap_task($task);
        }
    }
    /**
    * Loads registered tasks from the container, wraps them
    * and puts them into $this->tasks.
    */
    public function load_tasks_from_container()
    {
        if (!$this->is_initialised_from_container)
        {
            $this->is_initialised_from_container = true;
            $tasks = $this->phpbb_container->get('cron.task_collection');
            $this->load_tasks($tasks);
        }
    }
    /**
    * Finds a task that is ready to run.
    *
    * If several tasks are ready, any one of them could be returned.
    *
    * If no tasks are ready, null is returned.
    *
    * @return wrapper|null
    */
    public function find_one_ready_task()
    {
        $this->load_tasks_from_container();
        shuffle($this->tasks);
        foreach ($this->tasks as $task)
        {
            if ($task->is_ready())
            {
                return $task;
            }
        }
        return null;
    }
    /**
    * Finds all tasks that are ready to run.
    *
    * @return array        List of tasks which are ready to run (wrapped in \phpbb\cron\task\wrapper).
    */
    public function find_all_ready_tasks()
    {
        $this->load_tasks_from_container();
        $tasks = [];
        foreach ($this->tasks as $task)
        {
            if ($task->is_ready())
            {
                $tasks[] = $task;
            }
        }
        return $tasks;
    }
    /**
    * Finds a task by name.
    *
    * If there is no task with the specified name, null is returned.
    *
    * Web runner uses this method to resolve names to tasks.
    *
    * @param string                $name Name of the task to look up.
    * @return wrapper    A wrapped task corresponding to the given name, or null.
    */
    public function find_task($name)
    {
        $this->load_tasks_from_container();
        foreach ($this->tasks as $task)
        {
            if ($task->get_name() == $name)
            {
                return $task;
            }
        }
        return null;
    }
    /**
    * Find all tasks and return them.
    *
    * @return array List of all tasks.
    */
    public function get_tasks()
    {
        $this->load_tasks_from_container();
        return $this->tasks;
    }
    /**
    * Wraps a task inside an instance of \phpbb\cron\task\wrapper.
    *
    * @param  \phpbb\cron\task\task             $task The task.
    * @return wrapper    The wrapped task.
    */
    public function wrap_task(\phpbb\cron\task\task $task)
    {
        return new wrapper($task, $this->routing_helper, $this->phpbb_root_path, $this->php_ext, $this->template);
    }
}