MDL-27636 restore - add support for after_restore() to plugins. Credit goes to Mark...
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Thu, 26 May 2011 00:30:36 +0000 (02:30 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Thu, 26 May 2011 00:37:16 +0000 (02:37 +0200)
backup/moodle2/restore_plugin.class.php
backup/util/plan/restore_structure_step.class.php
backup/util/plan/restore_task.class.php

index 0203987..5ed177e 100644 (file)
@@ -80,6 +80,23 @@ abstract class restore_plugin {
         }
     }
 
+    /**
+     * after_restore dispatcher for any restore_plugin class
+     *
+     * This method will dispatch execution to the corresponding
+     * after_restore_xxx() method when available, with xxx
+     * being the connection point of the instance, so plugin
+     * classes with multiple connection points will support
+     * multiple after_restore methods, one for each connection point
+     */
+    public function launch_after_restore_methods() {
+        // Check if the after_restore method exists and launch it
+        $afterrestore = 'after_restore_' . basename($this->connectionpoint->get_path());
+        if (method_exists($this, $afterrestore)) {
+            $this->$afterrestore();
+        }
+    }
+
     /**
      * Returns one array with all the decode contents
      * to be processed by the links decoder
index ae648bc..ddb2fe5 100644 (file)
@@ -360,6 +360,43 @@ abstract class restore_structure_step extends restore_step {
 
     }
 
+    /**
+     * Launch all the after_restore methods present in all the processing objects
+     *
+     * This method will launch all the after_restore methods that can be defined
+     * both in restore_plugin class
+     *
+     * For restore_plugin classes the name of the method to be executed will be
+     * "after_restore_" + connection point (as far as can be multiple connection
+     * points in the same class)
+     */
+    public function launch_after_restore_methods() {
+        $alreadylaunched = array(); // To avoid multiple executions
+        foreach ($this->pathelements as $pathelement) {
+            // Get the processing object
+            $pobject = $pathelement->get_processing_object();
+            // Skip null processors (child of grouped ones for sure)
+            if (is_null($pobject)) {
+                continue;
+            }
+            // Skip restore structure step processors (this)
+            if ($pobject instanceof restore_structure_step) {
+                continue;
+            }
+            // Skip already launched processing objects
+            if (in_array($pobject, $alreadylaunched, true)) {
+                continue;
+            }
+            // Add processing object to array of launched ones
+            $alreadylaunched[] = $pobject;
+            // If the processing object has support for
+            // launching after_restore methods, use it
+            if (method_exists($pobject, 'launch_after_restore_methods')) {
+                $pobject->launch_after_restore_methods();
+            }
+        }
+    }
+
     /**
      * This method will be executed after the whole structure step have been processed
      *
index cdd525d..5b22b4b 100644 (file)
@@ -100,6 +100,13 @@ abstract class restore_task extends base_task {
      * method if available
      */
     public function execute_after_restore() {
+        if ($this->executed) {
+            foreach ($this->steps as $step) {
+                if (method_exists($step, 'launch_after_restore_methods')) {
+                    $step->launch_after_restore_methods();
+                }
+            }
+        }
         if ($this->executed && method_exists($this, 'after_restore')) {
             $this->after_restore();
         }