3 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
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
24 * TODO: Finish phpdocs
28 * Instantiable class defining the process of backup structures
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
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
41 * @var \core\progress\base Progress tracker (null if none)
48 * @param xml_writer $writer XML writer to save data
49 * @param c\core\progress\base$progress Progress tracker (optional)
51 public function __construct(xml_writer
$writer, \core\progress\base
$progress = null) {
52 $this->writer
= $writer;
53 $this->progress
= $progress;
54 $this->vars
= array();
57 public function set_var($key, $value) {
58 if (isset($this->vars
[$key])) {
59 throw new backup_processor_exception('processorvariablealreadyset', $key);
61 $this->vars
[$key] = $value;
64 public function get_var($key) {
65 if (!isset($this->vars
[$key])) {
66 throw new backup_processor_exception('processorvariablenotfound', $key);
68 return $this->vars
[$key];
71 public function pre_process_nested_element(base_nested_element
$nested) {
72 // Send open tag to xml_writer
74 foreach ($nested->get_attributes() as $attribute) {
75 $attrarr[$attribute->get_name()] = $attribute->get_value();
77 $this->writer
->begin_tag($nested->get_name(), $attrarr);
80 public function process_nested_element(base_nested_element
$nested) {
81 // Proceed with all the file annotations for this element
82 $fileannotations = $nested->get_file_annotations();
83 if ($fileannotations) { // If there are areas to search
84 $backupid = $this->get_var(backup
::VAR_BACKUPID
);
85 foreach ($fileannotations as $component => $area) {
86 foreach ($area as $filearea => $info) {
87 $contextid = !is_null($info->contextid
) ?
$info->contextid
: $this->get_var(backup
::VAR_CONTEXTID
);
88 $itemid = !is_null($info->element
) ?
$info->element
->get_value() : null;
89 backup_structure_dbops
::annotate_files($backupid, $contextid, $component, $filearea, $itemid, $this->progress
);
95 public function post_process_nested_element(base_nested_element
$nested) {
96 // Send close tag to xml_writer
97 $this->writer
->end_tag($nested->get_name());
98 if ($this->progress
) {
99 $this->progress
->progress();
103 public function process_final_element(base_final_element
$final) {
104 // Send full tag to xml_writer and annotations (only if has value)
105 if ($final->is_set()) {
107 foreach ($final->get_attributes() as $attribute) {
108 $attrarr[$attribute->get_name()] = $attribute->get_value();
110 $this->writer
->full_tag($final->get_name(), $final->get_value(), $attrarr);
111 if ($this->progress
) {
112 $this->progress
->progress();
114 // Annotate current value if configured to do so
115 $final->annotate($this->get_var(backup
::VAR_BACKUPID
));
119 public function process_attribute(base_attribute
$attribute) {
120 // Annotate current value if configured to do so
121 $attribute->annotate($this->get_var(backup
::VAR_BACKUPID
));
126 * backup_processor exception to control all the errors while working with backup_processors
128 * This exception will be thrown each time the backup_processors detects some
129 * inconsistency related with the elements to process or its configuration
131 class backup_processor_exception
extends base_processor_exception
{
134 * Constructor - instantiates one backup_processor_exception
136 * @param string $errorcode key for the corresponding error string
137 * @param object $a extra words and phrases that might be required in the error string
138 * @param string $debuginfo optional debugging information
140 public function __construct($errorcode, $a = null, $debuginfo = null) {
141 parent
::__construct($errorcode, $a, $debuginfo);