Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
57.14% covered (warning)
57.14%
4 / 7
CRAP
67.31% covered (warning)
67.31%
35 / 52
module_base
0.00% covered (danger)
0.00%
0 / 1
57.14% covered (warning)
57.14%
4 / 7
29.32
67.31% covered (warning)
67.31%
35 / 52
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 setup
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 is_essential
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 check_requirements
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 run
0.00% covered (danger)
0.00%
0 / 1
21.39
55.88% covered (warning)
55.88%
19 / 34
 recover_progress
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 get_step_count
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
<?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\install;
use phpbb\di\ordered_service_collection;
use phpbb\install\exception\resource_limit_reached_exception;
use phpbb\install\helper\config;
use phpbb\install\helper\iohandler\iohandler_interface;
/**
 * Base class for installer module
 */
abstract class module_base implements module_interface
{
    /**
     * @var config
     */
    protected $install_config;
    /**
     * @var iohandler_interface
     */
    protected $iohandler;
    /**
     * @var bool
     */
    protected $is_essential;
    /**
     * Array of tasks for installer module
     *
     * @var ordered_service_collection
     */
    protected $task_collection;
    /**
     * @var array
     */
    protected $task_step_count;
    /**
     * @var bool
     */
    protected $allow_progress_bar;
    /**
     * Installer module constructor
     *
     * @param ordered_service_collection    $tasks                array of installer tasks for installer module
     * @param bool                            $essential            flag indicating whether the module is essential or not
     * @param bool                            $allow_progress_bar    flag indicating whether or not to send progress information from within the module
     */
    public function __construct(ordered_service_collection $tasks, $essential = true, $allow_progress_bar = true)
    {
        $this->task_collection        = $tasks;
        $this->is_essential            = $essential;
        $this->allow_progress_bar    = $allow_progress_bar;
    }
    /**
     * Dependency getter
     *
     * @param config                $config
     * @param iohandler_interface    $iohandler
     */
    public function setup(config $config, iohandler_interface $iohandler)
    {
        $this->install_config    = $config;
        $this->iohandler        = $iohandler;
    }
    /**
     * {@inheritdoc}
     */
    public function is_essential()
    {
        return $this->is_essential;
    }
    /**
     * {@inheritdoc}
     *
     * Overwrite this method if your task is non-essential!
     */
    public function check_requirements()
    {
        return true;
    }
    /**
     * {@inheritdoc}
     */
    public function run()
    {
        // Recover install progress
        $task_index    = $this->recover_progress();
        $iterator    = $this->task_collection->getIterator();
        if ($task_index < $iterator->count())
        {
            $iterator->seek($task_index);
        }
        else
        {
            $this->install_config->set_finished_task(0);
            return;
        }
        while ($iterator->valid())
        {
            $task = $iterator->current();
            $name = $iterator->key();
            // Check if we can run the task
            if (!$task->is_essential() && !$task->check_requirements())
            {
                $this->iohandler->add_log_message(array(
                    'SKIP_TASK',
                    $name,
                ));
                $this->install_config->increment_current_task_progress($this->task_step_count[$name] ?? false);
            }
            else
            {
                // Send progress information
                if ($this->allow_progress_bar)
                {
                    $this->iohandler->set_progress(
                        $task->get_task_lang_name(),
                        $this->install_config->get_current_task_progress()
                    );
                    $this->iohandler->send_response();
                }
                $task->run();
                if ($this->allow_progress_bar)
                {
                    // Only increment progress by one, as if a task has more than one steps
                    // then that should be incremented in the task itself
                    $this->install_config->increment_current_task_progress();
                }
            }
            $task_index++;
            $this->install_config->set_finished_task($task_index);
            $iterator->next();
            // Send progress information
            if ($this->allow_progress_bar)
            {
                $this->iohandler->set_progress(
                    $task->get_task_lang_name(),
                    $this->install_config->get_current_task_progress()
                );
            }
            $this->iohandler->send_response();
            // Stop execution if resource limit is reached
            if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
            {
                throw new resource_limit_reached_exception();
            }
        }
        // Module finished, so clear task progress
        $this->install_config->set_finished_task(0);
    }
    /**
     * Returns the next task's name
     *
     * @return string    Index of the array element of the next task
     */
    protected function recover_progress()
    {
        $progress_array = $this->install_config->get_progress_data();
        return $progress_array['last_task_index'];
    }
    /**
     * {@inheritdoc}
     */
    public function get_step_count()
    {
        $task_step_count = 0;
        $task_class_names = $this->task_collection->get_service_classes();
        foreach ($task_class_names as $name => $task_class)
        {
            $step_count = $task_class::get_step_count();
            $task_step_count += $step_count;
            $this->task_step_count[$name] = $step_count;
        }
        return $task_step_count;
    }
}