6d3e2f6be47677477c1b19e3b0288fd5801463cf
[moodle.git] / backup / util / structure / backup_structure_processor.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-structure
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  *
24  * TODO: Finish phpdocs
25  */
27 /**
28  * Instantiable class defining the process of backup structures
29  *
30  * This class will process the given backup structure (nested/final/attribute)
31  * based on its definition, triggering as many actions as necessary (pre/post
32  * triggers, ids annotations, deciding based on settings, xml output...). Somehow
33  * one visitor pattern to allow backup structures to work with nice decoupling
34  */
35 class backup_structure_processor extends base_processor {
37     protected $writer; // xml_writer where the processor is going to output data
38     protected $vars;   // array of backup::VAR_XXX => helper value pairs to be used by source specifications
40     public function __construct(xml_writer $writer) {
41         $this->writer = $writer;
42         $this->vars   = array();
43     }
45     public function set_var($key, $value) {
46         if (isset($this->vars[$key])) {
47             throw new backup_processor_exception('processorvariablealreadyset', $key);
48         }
49         $this->vars[$key] = $value;
50     }
52     public function get_var($key) {
53         if (!isset($this->vars[$key])) {
54             throw new backup_processor_exception('processorvariablenotfound', $key);
55         }
56         return $this->vars[$key];
57     }
59     public function pre_process_nested_element(base_nested_element $nested) {
60         // Send open tag to xml_writer
61         $attrarr = array();
62         foreach ($nested->get_attributes() as $attribute) {
63             $attrarr[$attribute->get_name()] = $attribute->get_value();
64         }
65         $this->writer->begin_tag($nested->get_name(), $attrarr);
66     }
68     public function process_nested_element(base_nested_element $nested) {
69         // Proceed with all the file annotations for this element
70         $fileannotations = $nested->get_file_annotations();
71         if ($fileannotations) { // If there are areas to search
72             $backupid  = $this->get_var(backup::VAR_BACKUPID);
73             $contextid = $this->get_var(backup::VAR_CONTEXTID);
74             foreach ($fileannotations as $component=>$area) {
75                 foreach ($area as $filearea=>$element) {
76                     $itemid = !is_null($element) ? $element->get_value() : null;
77                     backup_structure_dbops::annotate_files($backupid, $contextid, $component, $filearea, $itemid);
78                 }
79             }
80         }
81     }
83     public function post_process_nested_element(base_nested_element $nested) {
84         // Send close tag to xml_writer
85         $this->writer->end_tag($nested->get_name());
86     }
88     public function process_final_element(base_final_element $final) {
89         // Send full tag to xml_writer and annotations (only if has value)
90         if ($final->is_set()) {
91             $attrarr = array();
92             foreach ($final->get_attributes() as $attribute) {
93                 $attrarr[$attribute->get_name()] = $attribute->get_value();
94             }
95             $this->writer->full_tag($final->get_name(), $final->get_value(), $attrarr);
96             // Annotate current value if configured to do so
97             $final->annotate($this->get_var(backup::VAR_BACKUPID));
98         }
99     }
101     public function process_attribute(base_attribute $attribute) {
102         // Annotate current value if configured to do so
103         $attribute->annotate($this->get_var(backup::VAR_BACKUPID));
104     }
107 /**
108  * backup_processor exception to control all the errors while working with backup_processors
109  *
110  * This exception will be thrown each time the backup_processors detects some
111  * inconsistency related with the elements to process or its configuration
112  */
113 class backup_processor_exception extends base_processor_exception {
115     /**
116      * Constructor - instantiates one backup_processor_exception
117      *
118      * @param string $errorcode key for the corresponding error string
119      * @param object $a extra words and phrases that might be required in the error string
120      * @param string $debuginfo optional debugging information
121      */
122     public function __construct($errorcode, $a = null, $debuginfo = null) {
123         parent::__construct($errorcode, $a, $debuginfo);
124     }