Skip to content
Snippets Groups Projects
Select Git revision
  • cc94d6090f9b7150d0b950f4ef58cf71a481aa51
  • main default protected
  • studip-rector
  • ci-opt
  • course-members-export-as-word
  • data-vue-app
  • pipeline-improvements
  • webpack-optimizations
  • rector
  • icon-renewal
  • http-client-and-factories
  • jsonapi-atomic-operations
  • vueify-messages
  • tic-2341
  • 135-translatable-study-areas
  • extensible-sorm-action-parameters
  • sorm-configuration-trait
  • jsonapi-mvv-routes
  • docblocks-for-magic-methods
19 results

CronjobTask.class.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CronjobTask.class.php 8.40 KiB
    <?php
    // +---------------------------------------------------------------------------+
    // This file is part of Stud.IP
    // CronjobSchedule.class.php
    //
    // Copyright (C) 2013 Jan-Hendrik Willms <tleilax+studip@gmail.com>
    // +---------------------------------------------------------------------------+
    // This program is free software; you can redistribute it and/or
    // modify it under the terms of the GNU General Public License
    // as published by the Free Software Foundation; either version 2
    // of the License, or any later version.
    // +---------------------------------------------------------------------------+
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    // You should have received a copy of the GNU General Public License
    // along with this program; if not, write to the Free Software
    // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    // +---------------------------------------------------------------------------+
    
    /**
     * CronjobTask - Model for the database table "cronjobs_tasks"
     *
     * @author      Jan-Hendrik Willms <tleilax+studip@gmail.com>
     * @license     http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
     * @category    Stud.IP
     * @since       2.4
     *
     * @property string task_id database column
     * @property string id alias column for task_id
     * @property string filename database column
     * @property string class database column
     * @property string active database column
     * @property string execution_count database column
     * @property string assigned_count database column
     * @property SimpleORMapCollection schedules has_many CronjobSchedule
     */
    class CronjobTask extends SimpleORMap
    {
        public $valid = false;
    
        /**
         * Configures the model.
         *
         * @param Array $config Optional configuration passed from derived class
         */
        protected static function configure($config = [])
        {
            $config['db_table'] = 'cronjobs_tasks';
            $config['has_many']['schedules'] = [
                'class_name' => 'CronjobSchedule',
                'on_delete'  => 'delete',
                'on_store'   => 'store'
            ];
    
            $config['registered_callbacks']['after_initialize'][] = 'loadClass';
    
            parent::configure($config);
        }
    
        /**
         * Tries to load the underlying php class. This also determines the valid
         * state of the task. If the class does not exists, the task is marked
         * as not valid.
         */
        protected function loadClass()
        {
            $this->valid = false;
    
            if (empty($this->class)) {
                return;
            }
    
            $filename = $GLOBALS['STUDIP_BASE_PATH'] . '/' . $this->filename;
            if (!file_exists($filename)) {
                return;
            }
    
            require_once $filename;
    
            $this->valid = class_exists($this->class);
        }
    
        /**
         * Returns whether the task is defined in the core system or via a plugin.
         *
         * @return bool True if task is defined in core system
         */
        public function isCore()
        {
            return mb_strpos($this->filename, 'plugins_packages') === false;
        }
    
        /**
         * Executes the task.
         *
         * @param String $last_result Result of last executions
         * @param Array  $parameters  Parameters to pass to the task
         */
        public function engage($last_result, $parameters = [])
        {
            if ($this->valid) {
                $parameters = array_merge(
                    $this->extractDefaultParameters(),
                    $parameters
                );
    
                $task = new $this->class;
    
                $task->setUp();
                $result = $task->execute($last_result, $parameters);
                $task->tearDown();
            } else {
                $result = $last_result;
            }
    
            return $result;
        }
    
        /**
         * Proxy the static methods "getDescription", "getName" and
         * "getParameters" from the task class.
         *
         * @param  String $field Field which should be accessed.
         * @return String Value of the method call
         */
        public function getValue($field)
        {
            if (in_array($field, words('description name parameters'))) {
                if ($this->valid) {
                    $method = 'get' . ucfirst($field);
                    return call_user_func("{$this->class}::{$method}");
                } elseif ($field === 'description') {
                    return _('Unbekannt');
                } elseif ($field === 'name') {
                    $result = $this->filename;
                    if (strpos($result, 'public/plugins_packages') !== false) {
                        $result = preg_replace('/.*public\/plugins_packages\/(.+)(_Cronjob)?(\.class)?\.php$/', '$1', $result);
                    } else {
                        $result = preg_replace('/(_Cronjob)?(\.class)?\.php$/', '', basename($result));
                    }
                    $result .= ' (' . _('fehlerhaft') . ')';
                    return $result;
                } elseif ($field === 'parameters') {
                    return [];
                }
            }
            return parent::getValue($field);
        }
    
    // Convenience methods to ease the usage
    
        /**
         * Schedules this task for a single execution at the provided time.
         *
         * @param int    $timestamp  When the task should be executed
         * @param String $priority   Priority of the execution (low, normal, high),
         *                           defaults to normal
         * @param Array  $parameters Optional parameters passed to the task
         * @return CronjobSchedule The generated schedule object.
         */
        public function scheduleOnce($timestamp, $priority = CronjobSchedule::PRIORITY_NORMAL,
                                     $parameters = [])
        {
            return CronjobScheduler::scheduleOnce($this->id, $timestamp, $priority, $parameters);
        }
    
        /**
         * Schedules this task for periodic execution with the provided schedule.
         *
         * @param mixed  $minute      Minute part of the schedule:
         *                            - null for "every minute" a.k.a. "don't care"
         *                            - x < 0 for "every x minutes"
         *                            - x >= 0 for "only at minute x"
         * @param mixed  $hour        Hour part of the schedule:
         *                            - null for "every hour" a.k.a. "don't care"
         *                            - x < 0 for "every x hours"
         *                            - x >= 0 for "only at hour x"
         * @param mixed  $day         Day part of the schedule:
         *                            - null for "every day" a.k.a. "don't care"
         *                            - x < 0 for "every x days"
         *                            - x > 0 for "only at day x"
         * @param mixed  $month       Month part of the schedule:
         *                            - null for "every month" a.k.a. "don't care"
         *                            - x < 0 for "every x months"
         *                            - x > 0 for "only at month x"
         * @param mixed  $day_of_week Day of week part of the schedule:
         *                            - null for "every day" a.k.a. "don't care"
         *                            - 1 >= x >= 7 for "exactly at day of week x"
         *                              (x starts with monday at 1 and ends with
         *                               sunday at 7)
         * @param String $priority   Priority of the execution (low, normal, high),
         *                           defaults to normal
         * @param Array  $parameters Optional parameters passed to the task
         * @return CronjobSchedule The generated schedule object.
         */
        public function schedulePeriodic($minute = null, $hour = null,
                                         $day = null, $month = null, $day_of_week = null,
                                         $priority = CronjobSchedule::PRIORITY_NORMAL,
                                         $parameters = [])
        {
            return CronjobScheduler::schedulePeriodic($this->id, $minute, $hour, $day, $month,
                                                      $day_of_week, $priority, $parameters);
        }
    
        /**
         * Extracts the default parameter values from the associated task.
         *
         * @return array
         */
        public function extractDefaultParameters()
        {
            $parameters = call_user_func("{$this->class}::getParameters");
            return array_map(function ($parameter) {
                // return $parameter['default'] ?? null;
                return isset($parameter['default']) ? $parameter['default'] : null;
            }, $parameters);
        }
    }