. declare(strict_types=1); namespace core_reportbuilder; use stdClass; use core_reportbuilder\local\models\report; use core_reportbuilder\local\report\base; /** * Report management class * * @package core_reportbuilder * @copyright 2020 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class manager { /** * Return an instance of a report class from the given report persistent * * @param report $report * @param array $parameters * @return base * @throws source_invalid_exception * @throws source_unavailable_exception */ public static function get_report_from_persistent(report $report, array $parameters = []): base { $source = $report->get('source'); // Throw exception for invalid or unavailable report source. if (!self::report_source_exists($source)) { throw new source_invalid_exception($source); } else if (!self::report_source_available($source)) { throw new source_unavailable_exception($source); } return new $source($report, $parameters); } /** * Verify that report source exists and extends appropriate base classes * * @param string $source Full namespaced path to report definition * @param string $additionalbaseclass Specify addition base class that given classname should extend * @return bool */ public static function report_source_exists(string $source, string $additionalbaseclass = ''): bool { return (class_exists($source) && is_subclass_of($source, base::class) && (empty($additionalbaseclass) || is_subclass_of($source, $additionalbaseclass))); } /** * Verify given report source is available. Note that it is assumed caller has already checked that it exists * * @param string $source * @return bool */ public static function report_source_available(string $source): bool { return call_user_func([$source, 'is_available']); } /** * Create new report persistent * * @param stdClass $reportdata * @return report */ public static function create_report_persistent(stdClass $reportdata): report { return (new report(0, $reportdata))->create(); } }