moodle/lib/classes/task/adhoc_task.php
Paul Holden d0b5241786 MDL-75256 task: move abstract get_name method to base class.
Allow adhoc tasks to implement this method, so they too can have
descriptive names for themselves. Default implementation added to
return the class name itself.
2022-07-22 09:13:53 +01:00

175 lines
4.8 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Adhoc task abstract class.
*
* All background tasks should extend this class.
*
* @package core
* @category task
* @copyright 2013 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\task;
/**
* Abstract class defining an adhoc task.
* @copyright 2013 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class adhoc_task extends task_base {
/** @var string $customdata - Custom data required for when this task is executed. */
private $customdata = '';
/** @var integer|null $id - Adhoc tasks each have their own database record id. */
private $id = null;
/** @var integer|null $userid - Adhoc tasks may choose to run as a specific user. */
private $userid = null;
/** @var \core\lock\lock The concurrency task lock for this task. */
private $concurrencylock = null;
/**
* Provide default implementation of the task name for backward compatibility. Extending classes are expected to implement
* this method to provide a descriptive name for the task (shown to admins)
*
* @return string
*/
public function get_name() {
$classparts = explode('\\', get_called_class());
$classname = end($classparts);
// Try to make human readable, capitalized and with spaces.
return ucfirst(str_replace('_', ' ', $classname));
}
/**
* Setter for $id.
* @param int|null $id
*/
public function set_id($id) {
$this->id = $id;
}
/**
* Getter for $userid.
* @return int|null $userid
*/
public function get_userid() {
return $this->userid;
}
/**
* Setter for $customdata.
* @param mixed $customdata (anything that can be handled by json_encode)
*/
public function set_custom_data($customdata) {
$this->customdata = json_encode($customdata);
}
/**
* Alternate setter for $customdata. Expects the data as a json_encoded string.
* @param string $customdata json_encoded string
*/
public function set_custom_data_as_string($customdata) {
$this->customdata = $customdata;
}
/**
* Getter for $customdata.
* @return mixed (anything that can be handled by json_decode).
*/
public function get_custom_data() {
return json_decode($this->customdata);
}
/**
* Alternate getter for $customdata.
* @return string this is the raw json encoded version.
*/
public function get_custom_data_as_string() {
return $this->customdata;
}
/**
* Getter for $id.
* @return int|null $id
*/
public function get_id() {
return $this->id;
}
/**
* Setter for $userid.
* @param int|null $userid
*/
public function set_userid($userid) {
$this->userid = $userid;
}
/**
* Returns default concurrency limit for this task.
*
* @return int default concurrency limit
*/
protected function get_default_concurrency_limit(): int {
global $CFG;
if (isset($CFG->task_concurrency_limit_default)) {
return (int) $CFG->task_concurrency_limit_default;
}
return 0;
}
/**
* Returns effective concurrency limit for this task.
*
* @return int effective concurrency limit for this task
*/
final public function get_concurrency_limit(): int {
global $CFG;
$classname = get_class($this);
if (isset($CFG->task_concurrency_limit[$classname])) {
return (int) $CFG->task_concurrency_limit[$classname];
}
return $this->get_default_concurrency_limit();
}
/**
* Sets concurrency task lock.
*
* @param \core\lock\lock $lock concurrency lock to be set
*/
final public function set_concurrency_lock(\core\lock\lock $lock): void {
$this->concurrencylock = $lock;
}
/**
* Release the concurrency lock for this task type.
*/
final public function release_concurrency_lock(): void {
if ($this->concurrencylock) {
$this->concurrencylock->release();
}
}
}