43eb56a16991d6287e56ffa8ba88d90a7904e7bc
[moodle.git] / backup / moodle2 / restore_subplugin.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-moodle2
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  * Class implementing the subplugins support for moodle2 restore
27  *
28  * TODO: Finish phpdocs
29  */
30 abstract class restore_subplugin {
32     protected $subplugintype;
33     protected $subpluginname;
34     protected $connectionpoint;
35     protected $step;
36     protected $task;
38     public function __construct($subplugintype, $subpluginname, $step) {
39         $this->subplugintype = $subplugintype;
40         $this->subpluginname = $subpluginname;
41         $this->step          = $step;
42         $this->task          = $step->get_task();
43         $this->connectionpoint = '';
44     }
46     public function define_subplugin_structure($connectionpoint) {
47         if (!$connectionpoint instanceof restore_path_element) {
48             throw new restore_step_exception('restore_path_element_required', $connectionpoint);
49         }
51         $paths = array();
52         $this->connectionpoint = $connectionpoint;
53         $methodname = 'define_' . basename($this->connectionpoint->get_path()) . '_subplugin_structure';
55         if (method_exists($this, $methodname)) {
56             if ($subbluginpaths = $this->$methodname()) {
57                 foreach ($subbluginpaths as $path) {
58                     $path->set_processing_object($this);
59                     $paths[] = $path;
60                 }
61             }
62         }
63         return $paths;
64     }
66 // Protected API starts here
68 // restore_step/structure_step/task wrappers
70     protected function get_restoreid() {
71         if (is_null($this->task)) {
72             throw new restore_step_exception('not_specified_restore_task');
73         }
74         return $this->task->get_restoreid();
75     }
77     /**
78      * To send ids pairs to backup_ids_table and to store them into paths
79      *
80      * This method will send the given itemname and old/new ids to the
81      * backup_ids_temp table, and, at the same time, will save the new id
82      * into the corresponding restore_path_element for easier access
83      * by children. Also will inject the known old context id for the task
84      * in case it's going to be used for restoring files later
85      */
86     protected function set_mapping($itemname, $oldid, $newid, $restorefiles = false, $filesctxid = null) {
87         $this->step->set_mapping($itemname, $oldid, $newid, $restorefiles, $filesctxid);
88     }
90     /**
91      * Returns the latest (parent) old id mapped by one pathelement
92      */
93     protected function get_old_parentid($itemname) {
94         return $this->step->get_old_parentid($itemname);
95     }
97     /**
98      * Returns the latest (parent) new id mapped by one pathelement
99      */
100     protected function get_new_parentid($itemname) {
101         return $this->step->get_new_parentid($itemname);
102     }
104     /**
105      * Return the new id of a mapping for the given itemname
106      *
107      */
108     protected function get_mappingid($itemname, $oldid) {
109         return $this->step->get_mappingid($itemname, $oldid);
110     }
112     /**
113      * Return the complete mapping from the given itemname, itemid
114      */
115     protected function get_mapping($itemname, $oldid) {
116         return $this->step->get_mapping($itemname, $oldid);
117     }
119     /**
120      * Add all the existing file, given their component and filearea and one backup_ids itemname to match with
121      */
122     protected function add_related_files($component, $filearea, $mappingitemname, $filesctxid = null) {
123         $this->step->add_related_files($component, $filearea, $mappingitemname, $filesctxid);
124     }
126     /**
127      * Apply course startdate offset based in original course startdate and course_offset_startdate setting
128      * Note we are using one static cache here, but *by restoreid*, so it's ok for concurrence/multiple
129      * executions in the same request
130      */
131     protected function apply_date_offset($value) {
132         return $this->step->apply_date_offset($value);
133     }
135     /**
136      * Simple helper function that returns the name for the restore_path_element
137      * It's not mandatory to use it but recommended ;-)
138      */
139     protected function get_namefor($name = '') {
140         $name = $name !== '' ? '_' . $name : '';
141         return $this->subplugintype . '_' . $this->subpluginname . $name;
142     }
144     /**
145      * Simple helper function that returns the base (prefix) of the path for the restore_path_element
146      * Useful if we used get_recommended_name() in backup. It's not mandatory to use it but recommended ;-)
147      */
148     protected function get_pathfor($path = '') {
149         $path = trim($path, '/') !== '' ? '/' . trim($path, '/') : '';
150         return $this->connectionpoint->get_path() . '/' .
151                'subplugin_' . $this->subplugintype . '_' .
152                $this->subpluginname . '_' . basename($this->connectionpoint->get_path()) . $path;
153     }