source: sandbox/workflow/branches/609/inc/class.so_adminjobs.inc.php @ 2311

Revision 2311, 8.2 KB checked in by pedroerp, 14 years ago (diff)

Ticket #609 - Migrando instanciação das classes da engine para a factory.

Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                               *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'ProcessManager.php';
13require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'ActivityManager.php';
14
15/**
16 * Camada Model para Administração de Jobs.
17 * @package Workflow
18 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
19 * @license http://www.gnu.org/copyleft/gpl.html GPL
20 */
21class so_adminjobs
22{
23        /**
24         * @var bool True se o usuário for administrador do expresso.
25         * @access private
26         */
27        private $isAdmin;
28
29        /**
30         * @var int ID do usuário logado no Expresso
31         * @access private
32         */
33        private $userID;
34
35        /**
36         * @var object Link para a ACL do Workflow.
37         * @access private
38         */
39        private $acl;
40
41        /**
42         * @var object Link para o Banco de Dados do Expresso.
43         * @access private
44         */
45        private $db;
46
47        /**
48         * @var object Link para o objeto de Administração de Jobs
49         * @access private
50         */
51        private $jobManager;
52
53        /**
54         * Checa se o usuário possui direitos administrativos em um processo.
55         * @param int $processID O ID do processo que se quer checar se o usuário tem direito administrativo.
56         * @param int $jobID O ID do job que se quer checar acesso.
57         * @return bool True em caso de sucesso. Em caso de falha, a execução é abortada.
58         * @access private
59         */
60        private function checkAccess($processID, $jobID = null)
61        {
62                $error = array('error' => array('Você não tem permissão para executar este procedimento!'));
63
64                /* the user is an administrator */
65                if ($this->isAdmin)
66                        return true;
67
68                if (is_null($processID) && is_null($jobID))
69                        return $error;
70
71                if (!is_null($jobID))
72                {
73                        $jobInfo = $this->jobManager->getJob((int) $jobID);
74
75                        if (is_null($processID))
76                                $processID = $jobInfo['wf_process_id'];
77                        else
78                                if ($jobInfo['wf_process_id'] != $processID)
79                                        return $error;
80                }
81
82                if ($this->acl->checkUserGroupAccessToResource('PRO', $this->userID, $processID))
83                        return true;
84
85                return $error;
86        }
87
88        /**
89         * Construtor da classe so_adminjobs
90         * @return object
91         */
92        function so_adminjobs()
93        {
94                $this->userID = $_SESSION['phpgw_info']['workflow']['account_id'];
95                $this->isAdmin = $_SESSION['phpgw_info']['workflow']['user_is_admin'];
96                $this->acl = &$GLOBALS['ajax']->acl;
97                $this->db = &Factory::getInstance('WorkflowObjects')->getDBGalaxia()->Link_ID;
98                $this->jobManager = &Factory::newInstance('JobManager');
99        }
100
101        /**
102         * Carrega a lista de todos os jobs de um determinado processo.
103         * @param int $processID O ID do processo
104         * @return array Lista dos jobs
105         * @access public
106         */
107        function loadJobs($processID)
108        {
109                $processID = (int) $processID;
110                if (($errors = $this->checkAccess($processID)) !== true)
111                        return $errors;
112
113                return $this->jobManager->getJobsByProcessID($processID);
114        }
115
116        /**
117         * Atualiza um job
118         * @param int $jobID O ID do Job que será atualizado
119         * @param int $processID O ID do processo a qual o Job pertence
120         * @param string $name O nome do Job
121         * @param string $description A descrição do Job
122         * @param string $timeStart Uma string cujo conteúdo é um data e horário devidamente formatados
123         * @param int $intervalValue O intervalo de repetição
124         * @param int $intervalUnity A unidade de repetição (dia, mês, etc.)
125         * @param int $dateType O tipo que define quando o Job é executado
126         * @param int $weekDays Inteiro que representa os dias da semana em que o Job será executado
127         * @param int $monthOffset Intervalo de execução relativa a mês
128         * @param bool $active Indica se o job está ativo (true) ou não (false)
129         * @return array Lista de possíveis erros
130         * @access public
131         */
132        function updateJob($jobID, $processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active)
133        {
134                $processID = (int) $processID;
135                $jobID = (int) $jobID;
136                if (($errors = $this->checkAccess($processID, $jobID)) !== true)
137                        return $errors;
138
139                $this->jobManager->updateJob($jobID, $processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active);
140                return array('error' => $this->jobManager->get_error(true));
141        }
142
143        /**
144         * Cria um novo Job
145         * @param int $processID O ID do processo a qual o Job pertence
146         * @param string $name O nome do Job
147         * @param string $description A descrição do Job
148         * @param string $timeStart Uma string cujo conteúdo é um data e horário devidamente formatados
149         * @param int $intervalValue O intervalo de repetição
150         * @param int $intervalUnity A unidade de repetição (dia, mês, etc.)
151         * @param int $dateType O tipo que define quando o Job é executado
152         * @param int $weekDays Inteiro que representa os dias da semana em que o Job será executado
153         * @param int $monthOffset Intervalo de execução relativa a mês
154         * @param bool $active Indica se o job está ativo (true) ou não (false)
155         * @return array Lista de possíveis erros
156         * @access public
157         */
158        function createJob($processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active)
159        {
160                $processID = (int) $processID;
161                if (($errors = $this->checkAccess($processID)) !== true)
162                        return $errors;
163
164                $this->jobManager->createJob($processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active);
165                return array('error' => $this->jobManager->get_error(true));
166        }
167
168        /**
169         * Remove um Job
170         * @param int $jobID O ID do job
171         * @return void
172         * @access public
173         */
174        function removeJob($jobID)
175        {
176                $jobID = (int) $jobID;
177                if (($errors = $this->checkAccess(null, $jobID)) !== true)
178                        return $errors;
179
180                return $this->jobManager->removeJob($jobID);
181        }
182
183        /**
184         * Carrega a lista dos logs de um Job
185         * @param int $jobID O ID do job
186         * @return array Lista dos logs
187         * @access public
188         */
189        function loadLogs($jobID)
190        {
191                $jobID = (int) $jobID;
192                if (($errors = $this->checkAccess(null, $jobID)) !== true)
193                        return $errors;
194
195                return $this->jobManager->getLogsByJobID($jobID);
196        }
197
198        /**
199         * Alterna o status do Job entre ativado e desativado
200         * @param int $jobID O ID do job
201         * @return array Lista de possíveis erros
202         * @access public
203         */
204        function toggleActive($jobID)
205        {
206                $jobID = (int) $jobID;
207                if (($errors = $this->checkAccess(null, $jobID)) !== true)
208                        return $errors;
209
210                $jobInfo = $this->jobManager->getJob($jobID);
211                $newStatus = ($jobInfo['active'] != 't');
212                $this->jobManager->setActive($jobID, $newStatus);
213                return array('error' => $this->jobManager->get_error(true));
214        }
215
216        /**
217         * Executa um determinado Job
218         * @param int $jobID O ID do job
219         * @return array Uma array contendo a saída da execução do Job (saída padrão e saída de erro) e outras mensagens
220         * @access public
221         */
222        function runJob($jobID)
223        {
224                $jobID = (int) $jobID;
225                if (($errors = $this->checkAccess(null, $jobID)) !== true)
226                        return $errors;
227
228                $output = array();
229                $job = $this->jobManager->getJob($jobID);
230                $jobScheduler =& Factory::getInstance('JobScheduler');
231                $totalTime = microtime(true);
232                $thread = $jobScheduler->execute($job, true);
233                while ($thread->isActive())
234                        usleep(50000);
235                $totalTime = microtime(true) - $totalTime;
236
237                $output['output']['messages'] = array();
238                $output['output']['messages'][] = 'Tempo de execução: ' . number_format($totalTime, 4) . 's (o tempo máximo permitido é de ' . JobScheduler::MAXIMUM_EXECUTION_TIME/1000000.0 . 's)';
239                $output['output']['default'] = htmlentities($thread->listen());
240                $output['output']['error'] = htmlentities($thread->getError());
241
242                if ($thread->isActive())
243                        $thread->kill();
244                else
245                        $thread->close();
246
247                if (strpos($output['output']['error'], 'PHP Fatal error') !== false)
248                        $this->jobManager->writeLog($jobID, $jobScheduler->getCurrentDate(), $output['output']['error'], JobManager::STATUS_ERROR);
249
250                return $output;
251        }
252}
253?>
Note: See TracBrowser for help on using the repository browser.