diff options
Diffstat (limited to 'phpBB/phpbb/install/module_base.php')
| -rw-r--r-- | phpBB/phpbb/install/module_base.php | 218 | 
1 files changed, 218 insertions, 0 deletions
| diff --git a/phpBB/phpbb/install/module_base.php b/phpBB/phpbb/install/module_base.php new file mode 100644 index 0000000000..fb68c3aca2 --- /dev/null +++ b/phpBB/phpbb/install/module_base.php @@ -0,0 +1,218 @@ +<?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_name = $this->recover_progress(); +		$task_found = false; + +		/** +		 * @var string							$name	ID of the service +		 * @var \phpbb\install\task_interface	$task	Task object +		 */ +		foreach ($this->task_collection as $name => $task) +		{ +			// Run until there are available resources +			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0) +			{ +				throw new resource_limit_reached_exception(); +			} + +			// Skip forward until the next task is reached +			if (!$task_found) +			{ +				if ($name === $task_name || empty($task_name)) +				{ +					$task_found = true; + +					if ($name === $task_name) +					{ +						continue; +					} +				} +				else +				{ +					continue; +				} +			} + +			// Send progress information +			if ($this->allow_progress_bar) +			{ +				$this->iohandler->set_progress( +					$task->get_task_lang_name(), +					$this->install_config->get_current_task_progress() +				); +			} + +			// 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]); +				continue; +			} + +			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->run(); + +			// Log install progress +			$this->install_config->set_finished_task($name); + +			// 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(); +		} + +		// Module finished, so clear task progress +		$this->install_config->set_finished_task(''); +	} + +	/** +	 * 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_name']; +	} + +	/** +	 * {@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; +	} +} | 
