1: <?php
2:
3: App::uses('ClassSearcher', 'Base.Lib');
4: App::uses('SchedulingTask', 'Scheduling.Lib');
5:
6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
17: class Scheduling {
18:
19: 20: 21: 22:
23: public static function shellCalls() {
24: $shellCalls = array();
25: foreach (self::_findSchedulingTasksInstances() as $schedulingTask) {
26: $shellCalls = array_merge(
27: $shellCalls
28: , self::_generateShellCalls($schedulingTask)
29: );
30: }
31: return $shellCalls;
32: }
33:
34: public static function setNextRun($shellCall) {
35: $schedulingShellCallLog = self::findLog($shellCall);
36: $cron = Cron\CronExpression::factory($shellCall['scheduling']);
37: $schedulingShellCallLog['SchedulingShellCallLog']['next_run'] = $cron->getNextRunDate()->format('Y-m-d H:i:s');
38: unset($schedulingShellCallLog['SchedulingShellCallLog']['modified']);
39: ClassRegistry::init('Scheduling.SchedulingShellCallLog')->saveOrThrowException($schedulingShellCallLog);
40: }
41:
42: public static function findLog($shellCall) {
43: $SchedulingShellCallLog = ClassRegistry::init('Scheduling.SchedulingShellCallLog');
44: $schedulingShellCallLog = $SchedulingShellCallLog->find('first', array(
45: 'conditions' => array(
46: 'SchedulingShellCallLog.scheduling' => $shellCall['scheduling'],
47: 'SchedulingShellCallLog.args' => self::serializeArgs($shellCall['args']),
48: 'SchedulingShellCallLog.shell' => $shellCall['shell'],
49: )
50: ));
51: if (empty($schedulingShellCallLog)) {
52: $SchedulingShellCallLog->create();
53: $shellCall['args'] = self::serializeArgs($shellCall['args']);
54: $SchedulingShellCallLog->saveOrThrowException(array(
55: 'SchedulingShellCallLog' => $shellCall
56: ));
57: return $SchedulingShellCallLog->read();
58: } else {
59: return $schedulingShellCallLog;
60: }
61: }
62:
63: public static function serializeArgs($args) {
64: if (is_array($args)) {
65: return trim(implode(' ', array_map('escapeshellarg', $args)));
66: } else {
67: return trim('' . $args);
68: }
69: }
70:
71: 72: 73: 74: 75:
76: public static function getInstaller($schedulingInstallerClass = null) {
77: if (!$schedulingInstallerClass) {
78: $schedulingInstallerClass = Configure::read('Scheduling.installer_class');
79: if (!$schedulingInstallerClass || trim($schedulingInstallerClass) == '') {
80: throw new Exception("Configuration \"Scheduling.installer_class\" not set.");
81: }
82: }
83: return ClassSearcher::findInstanceAndInstantiate('Lib' . DS . 'SchedulingInstaller', $schedulingInstallerClass);
84: }
85:
86: private static function _generateShellCalls($schedulingTask) {
87: $shellCalls = array();
88: foreach($schedulingTask->generate() as $shellCall) {
89: if (empty($shellCall['args'])) {
90: $shellCall['args'] = array();
91: }
92: $shellCalls[] = $shellCall;
93: }
94: return $shellCalls;
95: }
96:
97: 98: 99:
100: private static function _findSchedulingTasksInstances() {
101: return ClassSearcher::findInstances('Lib' . DS . 'SchedulingTask');
102: }
103:
104: }