MDL-21432 backup 2.0 - initial commit. util dir
[moodle.git] / backup / util / plan / base_task.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * @package moodlecore
20  * @subpackage backup-plan
21  * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 /**
26  * Abstract class defining the basis for one execution (backup/restore) task
27  *
28  * TODO: Finish phpdocs
29  */
30 abstract class base_task implements checksumable, executable, loggable {
32     protected $name;      // One simple name for identification purposes
33     protected $plan;      // Plan this is part of
34     protected $settings;  // One array of base_setting elements to define this task
35     protected $steps;     // One array of base_task elements
37     protected $built;     // Flag to know if one plan has been built
39     /**
40      * Constructor - instantiates one object of this class
41      */
42     public function __construct($name, $plan = null) {
43         if (!is_null($plan) && !($plan instanceof base_plan)) {
44             throw new base_task_exception('wrong_base_plan_specified');
45         }
46         $this->name = $name;
47         $this->plan = $plan;
48         $this->settings = array();
49         $this->steps    = array();
50         $this->built = false;
51         if (!is_null($plan)) { // Add the task to the plan if specified
52             $plan->add_task($this);
53         }
54     }
56     public function get_name() {
57         return $this->name;
58     }
60     public function get_steps() {
61         return $this->steps;
62     }
64     public function get_settings() {
65         return $this->settings;
66     }
68     public function get_setting($name) {
69         // First look in task settings
70         $result = null;
71         foreach ($this->settings as $key => $setting) {
72             if ($setting->get_name() == $name) {
73                 if ($result != null) {
74                     throw new base_task_exception('multiple_settings_by_name_found', $name);
75                 } else {
76                     $result = $setting;
77                 }
78             }
79         }
80         if ($result) {
81             return $result;
82         } else {
83             // Fallback to plan settings
84             return $this->plan->get_setting($name);
85         }
86     }
88     public function get_setting_value($name) {
89         return $this->get_setting($name)->get_value();
90     }
92     public function get_backupid() {
93         return $this->plan->get_backupid();
94     }
96     public function get_courseid() {
97         return $this->plan->get_courseid();
98     }
100     public function get_basepath() {
101         return $this->plan->get_basepath();
102     }
104     public function get_taskbasepath() {
105         return $this->get_basepath();
106     }
108     public function get_logger() {
109         return $this->plan->get_logger();
110     }
112     public function log($message, $level, $a = null, $depth = null, $display = false) {
113         backup_helper::log($message, $level, $a, $depth, $display, $this->get_logger());
114     }
116     public function add_step($step) {
117         if (! $step instanceof base_step) {
118             throw new base_task_exception('wrong_base_step_specified');
119         }
120         // link the step with the task
121         $step->set_task($this);
122         $this->steps[] = $step;
123     }
125     public function set_plan($plan) {
126         if (! $plan instanceof base_plan) {
127             throw new base_task_exception('wrong_base_plan_specified');
128         }
129         $this->plan = $plan;
130         $this->define_settings(); // Settings are defined when plan & task are linked
131     }
133     /**
134      * Function responsible for building the steps of any task
135      * (must set the $built property to true)
136      */
137     public abstract function build();
139     /**
140      * Function responsible for executing the steps of any task
141      */
142     public function execute() {
143         if (!$this->built) {
144             throw new base_task_exception('base_task_not_built', $this->name);
145         }
146         foreach ($this->steps as $step) {
147             $step->execute();
148         }
149     }
151     public function is_checksum_correct($checksum) {
152         return $this->calculate_checksum() === $checksum;
153     }
155     public function calculate_checksum() {
156         // Let's do it using name and settings and steps
157         return md5($this->name . '-' .
158                    backup_general_helper::array_checksum_recursive($this->settings) .
159                    backup_general_helper::array_checksum_recursive($this->steps));
160     }
162 // Protected API starts here
164     /**
165      * This function is invoked on activity creation in order to add all the settings
166      * that are associated with one task. The function will, directly, inject the settings
167      * in the task.
168      */
169     protected abstract function define_settings();
171     protected function add_setting($setting) {
172         if (! $setting instanceof base_setting) {
173             throw new base_setting_exception('wrong_base_setting_specified');
174         }
175         $this->settings[] = $setting;
176     }
179 /*
180  * Exception class used by all the @base_task stuff
181  */
182 class base_task_exception extends moodle_exception {
184     public function __construct($errorcode, $a=NULL, $debuginfo=null) {
185         parent::__construct($errorcode, '', '', $a, $debuginfo);
186     }