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

Revision 1437, 7.4 KB checked in by rufino, 15 years ago (diff)

Ticket #643 - Implementado metodo createNewInstance que cria uma instancia a partir de uma atividade start.

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                $GLOBALS['workflow']['factory']->getInstance('WorkflowMacro')->prepareEnvironment();
92                $this->jobID = $jobID;
93                $this->processID = $processID;
94                $this->currentDate = $currentDate;
95                $this->jobManager = &$GLOBALS['workflow']['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                $GLOBALS['workflow']['factory']->getInstance('WorkflowMacro')->prepareProcessEnvironment($this->processID);
151
152                require_once PHPGW_SERVER_ROOT . '/workflow/inc/class.process_factory.inc.php';
153
154                $this->environment = array();
155                $this->environment['factory']  = &new ProcessFactory();
156        }
157
158        /**
159         * Procedimentos que são executados na finalização do Job
160         * @return void
161         * @final
162         * @access private
163         */
164        final public function finalize()
165        {
166                if (!$this->userLog)
167                        $this->defaultLog();
168        }
169
170        /**
171         * Pega o tempo de execução do Job (até o momento)
172         * @return float O tempo de execução do Job
173         * @final
174         * @access public
175         */
176        final public function getExecutionTime()
177        {
178                return microtime(true) - $this->timeStart;
179        }
180
181        /**
182         * Pega o tempo máximo de execução do Job
183         * @return float O tempo máximo de execução do Job
184         * @final
185         * @access public
186         */
187        final public function getMaximumExectuionTime()
188        {
189                return $this->maximumExecutionTime;
190        }
191
192        /**
193         * Cria uma nova instância do processo e encaminha para a próxima atividade
194         * @param int $startActivityId ID da atividade Start que será usada para criar a instância
195         * @param string $instanceName Identificador da instância
196         * @param array $properties Array associativo contendo as popriedades da instância
197         * @param int $user uidNumer do usuário do dono da instância (usuário que gerou a instância)
198         * @return bool true se a instância foi criada, caso contrário, false.
199         * @final
200         * @access public
201         */
202        final public function createNewInstance($startActivityId, $instanceName=false, $properties=false, $user=false)
203        {
204                $activityManager = CreateObject('workflow.workflow_activitymanager');
205                $activity = $activityManager->get_activity($startActivityId);
206
207                // Verifica se a atividade existe e é uma atividade de start
208                if ($activity['wf_type'] != 'start')
209                        return false;
210
211                // Verifica se existe uma transição da atividade de start para outra atividade
212                $transition = $activityManager->get_process_transitions($this->processID, $startActivityId);
213                $nextActivityId = $transition[0]['wf_act_to_id'];
214                if (empty($nextActivityId))
215                        return false;
216
217                // Captura objeto runtime da globals
218                $runtime = &$GLOBALS['workflow']['wf_runtime'];
219
220                // TODO: Pegar usuário padrão da tabela phpgw_config
221                $defaultUser = 73231;
222
223                // Seta usuário para execução. Se $user for false, seta usuário padrão do job
224                $uidNumber = ($user)? $user : $defaultUser;
225                if (empty($uidNumber)) return false;
226
227                $GLOBALS['phpgw_info']['user']['account_id'] = $uidNumber;
228                $_SESSION['phpgw_info']['workflow']['account_id'] = $uidNumber;
229                $GLOBALS['user'] = $uidNumber;
230
231                if (!empty($instanceName) && is_string($instanceName))
232                        $runtime->setName($instanceName);
233
234                if (!empty($properties) && is_array($properties))
235                        $runtime->setProperties($properties);
236
237                // Cria a instância
238                if ($runtime->instance->complete($startActivityId)){
239                        // Envia instância para próxima transição
240                        $runtime->instance->sendTo($startActivityId, $nextActivityId);
241                        return true;
242                }
243                return false;
244        }
245
246        /**
247         * É o método que contém o código do Job que será executado
248         * @return void
249         * @abstract
250         * @access public
251         */
252        abstract public function run();
253}
254?>
Note: See TracBrowser for help on using the repository browser.