source: sandbox/workflow/trunk/inc/local/classes/class.JobBase.php @ 2372

Revision 2372, 7.2 KB checked in by pedroerp, 14 years ago (diff)

Ticket #609 - Merged 2197:2356 /sandbox/workflow/branches/609/ em /sandbox/workflow/trunk.

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
12/**
13 * Classe base dos Jobs
14 * @author Sidnei Augusto Drovetto Junior - drovetto@gmail.com
15 * @version 1.0
16 * @abstract
17 * @license http://www.gnu.org/copyleft/gpl.html GPL
18 * @package Workflow
19 * @subpackage Job
20 */
21abstract class JobBase
22{
23        /**
24         * @var int $jobID O ID do Job
25         * @access private
26         */
27        private $jobID;
28
29        /**
30         * @var int $processID O ID do Processo
31         * @access private
32         */
33        private $processID;
34
35        /**
36         * @var string $currentDate Uma string cujo conteúdo é um data e horário devidamente formatados
37         * @access private
38         */
39        private $currentDate;
40
41        /**
42         * @var object $jobManager Objeto da classe JobManager
43         * @access private
44         */
45        private $jobManager;
46
47        /**
48         * @var bool $userLog Indica se o usuário gravou algum log (true) ou não (false)
49         * @access private
50         */
51        private $userLog;
52
53        /**
54         * @var float $maximumExecutionTime O tempo máximo de execução do Job
55         * @access private
56         */
57        private $maximumExecutionTime;
58
59        /**
60         * @var float $timeStart Início do Job (em microsegundos)
61         * @access private
62         */
63        private $timeStart;
64
65        /**
66         * @var bool $testMode Indica se o job está sendo executado em modo de teste (true) ou não (false)
67         * @access protected
68         */
69        protected $testMode;
70
71        /**
72         * @var array $environment Contém algumas variáveis/objetos relevantes para a execução de alguns Jobs
73         * @access protected
74         */
75        protected $environment;
76
77        /**
78         * Construtor da classe JobBase
79         * @param int $jobID O ID do Job que será atualizado
80         * @param int $processID O ID do processo a qual o Job pertence
81         * @param string $currentDate Uma string cujo conteúdo é um data e horário devidamente formatados
82         * @param bool $testMode Indica se o job está sendo executado em modo de teste (true) ou não (false)
83         * @param float $maximumExecutionTime O tempo máximo de execução do Job (em segundos)
84         * @return object Objeto da classe JobBase
85         * @final
86         * @access public
87         */
88        final public function JobBase($jobID, $processID, $currentDate, $testMode, $maximumExecutionTime)
89        {
90                require_once 'common.inc.php';
91                Factory::getInstance('WorkflowMacro')->prepareEnvironment();
92                $this->jobID = $jobID;
93                $this->processID = $processID;
94                $this->currentDate = $currentDate;
95                $this->jobManager = Factory::getInstance('WorkflowJobManager');
96                $this->testMode = $testMode;
97                $this->maximumExecutionTime = $maximumExecutionTime;
98                $this->timeStart = microtime(true);
99                $this->userLog = false;
100
101                $this->prepareEnvironment();
102        }
103
104        /**
105         * Indica que a execução do Job falhou
106         * @param string $message A mensagem que será armazenada
107         * @return void
108         * @final
109         * @access public
110         */
111        final public function fail($message)
112        {
113                $this->jobManager->writeLog($this->jobID, $this->currentDate, $message, JobManager::STATUS_JOB_FAIL);
114                $this->userLog = true;
115        }
116
117        /**
118         * Indica que a execução do Job foi bem sucedida
119         * @param string $message A mensagem que será armazenada
120         * @return void
121         * @final
122         * @access public
123         */
124        final public function success($message)
125        {
126                $this->jobManager->writeLog($this->jobID, $this->currentDate, $message, JobManager::STATUS_JOB_SUCCESS);
127                $this->userLog = true;
128        }
129
130        /**
131         * Grava uma mensagem de log padrão (caso o desenvolvedor não chame os métodos "fail" ou "success")
132         * @return void
133         * @final
134         * @access private
135         */
136        final private function defaultLog()
137        {
138                $this->jobManager->writeLog($this->jobID, $this->currentDate, 'Job executado', JobManager::STATUS_UNKNOWN);
139                $this->userLog = true;
140        }
141
142        /**
143         * Prepara o ambiente para a execução do Job
144         * @return void
145         * @final
146         * @access private
147         */
148        final private function prepareEnvironment()
149        {
150                Factory::getInstance('WorkflowMacro')->prepareProcessEnvironment($this->processID);
151
152                $this->environment = array();
153                $this->environment['factory']  = &Factory::newInstance('ProcessWrapperFactory');
154        }
155
156        /**
157         * Procedimentos que são executados na finalização do Job
158         * @return void
159         * @final
160         * @access private
161         */
162        final public function finalize()
163        {
164                if (!$this->userLog)
165                        $this->defaultLog();
166        }
167
168        /**
169         * Pega o tempo de execução do Job (até o momento)
170         * @return float O tempo de execução do Job
171         * @final
172         * @access public
173         */
174        final public function getExecutionTime()
175        {
176                return microtime(true) - $this->timeStart;
177        }
178
179        /**
180         * Pega o tempo máximo de execução do Job
181         * @return float O tempo máximo de execução do Job
182         * @final
183         * @access public
184         */
185        final public function getMaximumExectuionTime()
186        {
187                return $this->maximumExecutionTime;
188        }
189
190        /**
191         * Cria uma nova instância do processo e encaminha para a próxima atividade
192         * @param int $startActivityId ID da atividade Start que será usada para criar a instância
193         * @param string $instanceName Identificador da instância
194         * @param array $properties Array associativo contendo as popriedades da instância
195         * @param int $user uidNumer do usuário do dono da instância (usuário que gerou a instância)
196         * @return bool true se a instância foi criada, caso contrário, false.
197         * @final
198         * @access public
199         */
200        final public function createNewInstance($startActivityId, $instanceName=false, $properties=false, $user=false)
201        {
202                $activityManager = Factory::getInstance('workflow_activitymanager');
203                $activity = $activityManager->get_activity($startActivityId);
204
205                // Verifica se a atividade existe e é uma atividade de start
206                if ($activity['wf_type'] != 'start')
207                        return false;
208
209                // Verifica se existe uma transição da atividade de start para outra atividade
210                $transition = $activityManager->get_process_transitions($this->processID, $startActivityId);
211                $nextActivityId = $transition[0]['wf_act_to_id'];
212                if (empty($nextActivityId))
213                        return false;
214
215                // Captura objeto runtime da globals
216                $runtime = &$GLOBALS['workflow']['wf_runtime'];
217
218                // TODO: Pegar usuário padrão da tabela phpgw_config
219                $defaultUser = 73231;
220
221                // Seta usuário para execução. Se $user for false, seta usuário padrão do job
222                $uidNumber = ($user)? $user : $defaultUser;
223                if (empty($uidNumber)) return false;
224
225                $GLOBALS['phpgw_info']['user']['account_id'] = $uidNumber;
226                $_SESSION['phpgw_info']['workflow']['account_id'] = $uidNumber;
227                $GLOBALS['user'] = $uidNumber;
228
229                if (!empty($instanceName) && is_string($instanceName))
230                        $runtime->setName($instanceName);
231
232                if (!empty($properties) && is_array($properties))
233                        $runtime->setProperties($properties);
234
235                // Cria a instância
236                if ($runtime->instance->complete($startActivityId)){
237                        // Envia instância para próxima transição
238                        $runtime->instance->sendTo($startActivityId, $nextActivityId);
239                        return true;
240                }
241                return false;
242        }
243
244        /**
245         * É o método que contém o código do Job que será executado
246         * @return void
247         * @abstract
248         * @access public
249         */
250        abstract public function run();
251}
252?>
Note: See TracBrowser for help on using the repository browser.