Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
   1  <?php
   2  
   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/>.
  17  
  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   */
  26  
  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 {
  36  
  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
  39  
  40      /**
  41       * @var \core\progress\base Progress tracker (null if none)
  42       */
  43      protected $progress;
  44  
  45      /**
  46       * Constructor.
  47       *
  48       * @param xml_writer $writer XML writer to save data
  49       * @param c\core\progress\base$progress Progress tracker (optional)
  50       */
  51      public function __construct(xml_writer $writer, \core\progress\base $progress = null) {
  52          $this->writer = $writer;
  53          $this->progress = $progress;
  54          $this->vars = array();
  55      }
  56  
  57      public function set_var($key, $value) {
  58          if (isset($this->vars[$key])) {
  59              throw new backup_processor_exception('processorvariablealreadyset', $key);
  60          }
  61          $this->vars[$key] = $value;
  62      }
  63  
  64      public function get_var($key) {
  65          if (!isset($this->vars[$key])) {
  66              throw new backup_processor_exception('processorvariablenotfound', $key);
  67          }
  68          return $this->vars[$key];
  69      }
  70  
  71      public function pre_process_nested_element(base_nested_element $nested) {
  72          // Send open tag to xml_writer
  73          $attrarr = array();
  74          foreach ($nested->get_attributes() as $attribute) {
  75              $attrarr[$attribute->get_name()] = $attribute->get_value();
  76          }
  77          $this->writer->begin_tag($nested->get_name(), $attrarr);
  78      }
  79  
  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);
  90                  }
  91              }
  92          }
  93      }
  94  
  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();
 100          }
 101      }
 102  
 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()) {
 106              $attrarr = array();
 107              foreach ($final->get_attributes() as $attribute) {
 108                  $attrarr[$attribute->get_name()] = $attribute->get_value();
 109              }
 110              $this->writer->full_tag($final->get_name(), $final->get_value(), $attrarr);
 111              if ($this->progress) {
 112                  $this->progress->progress();
 113              }
 114              // Annotate current value if configured to do so
 115              $final->annotate($this->get_var(backup::VAR_BACKUPID));
 116          }
 117      }
 118  
 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));
 122      }
 123  }
 124  
 125  /**
 126   * backup_processor exception to control all the errors while working with backup_processors
 127   *
 128   * This exception will be thrown each time the backup_processors detects some
 129   * inconsistency related with the elements to process or its configuration
 130   */
 131  class backup_processor_exception extends base_processor_exception {
 132  
 133      /**
 134       * Constructor - instantiates one backup_processor_exception
 135       *
 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
 139       */
 140      public function __construct($errorcode, $a = null, $debuginfo = null) {
 141          parent::__construct($errorcode, $a, $debuginfo);
 142      }
 143  }