Subversion Repositories Applications.framework

Rev

Rev 241 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Script est une classe abstraite qui doit être implémenté par les classes éxecutant des scripts en ligne de commande.
5
 *
6
 * @category	PHP 5.2
7
 * @package	Framework
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
10
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
11
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
13
 * @version	SVN : $Id$
14
 * @link		/doc/framework/
15
 */
16
 
17
abstract class Script {
18
	/** Niveau de message de type LOG */
19
	const MSG_LOG = 0;
20
	/** Niveau de message de type ERREUR */
21
	const MSG_ERREUR = 1;
22
	/** Niveau de message de type AVERTISSEMENT */
23
	const MSG_AVERTISSEMENT = 2;
24
	/** Niveau de message de type INFORMATION */
25
	const MSG_INFO = 3;
26
 
27
	/** Inititulé des différents types de message. */
28
	private static $msg_niveaux_txt = array('LOG', 'ERREUR','AVERTISSEMENT', 'INFO');
29
 
30
	/**
31
	 * Le nom du script tel que passé dans la ligne de commande.
32
	 * @var string
33
	 */
34
	private $script_nom = null;
35
 
36
	/**
37
	 * Paramêtres par défaut disponibles pour la ligne de commande
38
	 * le tableau se construit de la forme suivante :
39
	 * - clé =  nom du paramêtre '-foo'
40
	 * - value = contient un nouveau tableau composé de cette façon :
41
	 *  - booléen: true si le paramêtre est obligatoire
42
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
43
	 *  - string: description du contenu du paramêtre
44
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
45
	 * Le dernier parametre du tableau peut avoir la valeur '...',
46
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
47
	 * @var array
48
	 */
49
	private $parametres_autorises_defaut = array(
50
		'-a' => array(true, true, 'Action à réaliser'),
51
		'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'));
52
 
53
	/**
54
	 * Paramêtres autorisés par le script.
55
	 * le tableau est de la forme suivante :
56
	 * - clé =  nom du paramêtre '-foo'
57
	 * - value = contient un nouveau tableau composé de cette façon :
58
	 *  - booléen: true si le paramêtre est obligatoire
59
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
60
	 *  - string: description du contenu du paramêtre
61
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
62
	 * Le dernier parametre du tableau peut avoir la valeur '...',
63
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
64
	 * @var array
65
	 */
66
	protected $parametres_autorises = null;
67
 
68
	/**
69
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
70
	 * le tableau se construit de la forme suivnate :
71
	 * - clé =  nom du paramêtre '-foo'
72
	 * - valeur = la valeur récupérée sur la ligne de commande
73
	 * @var array
74
	 */
75
	private $parametres_cli = null;
76
 
77
	/**
78
	 * Contient le tableau des paramètres disponible après vérification :
79
	 * le tableau est de la forme suivante :
80
	 * - clé =  nom du paramêtre '-foo'
81
	 * - valeur = la valeur récupérée sur la ligne de commande
82
	 * @var array
83
	 */
84
	protected $parametres = null;
85
 
86
	public function __construct($script_nom, $parametres_cli) {
87
		$this->script_nom = $script_nom;
88
		$this->parametres_cli = $parametres_cli;
89
 
90
		$fichier_ini_script = $this->getScriptChemin().'config.ini';
91
		Config::charger($fichier_ini_script);
92
 
93
		$this->chargerParametresAutorises();
94
		$this->chargerParametres();
95
	}
96
 
97
	private static function getMsgNiveauTxt($niveau) {
98
		return self::$msg_niveaux_txt[$niveau];
99
	}
100
 
101
	protected function getScriptNom() {
102
		return $this->script_nom;
103
	}
104
 
105
	protected function getScriptChemin($doit_exister = true) {
106
		$chemin = Config::get('chemin_modules').$this->getScriptNom().DS;
107
		if (!file_exists($chemin) && $doit_exister) {
108
			trigger_error("Erreur: le module '".$this->getScriptNom()."' n'existe pas ($chemin)\n", E_USER_ERROR);
109
		}
110
		return $chemin;
111
	}
112
 
113
	protected function getParametre($parametre) {
114
		$retour = false;
115
		if (!is_null($parametre)) {
116
			$parametre = ltrim($parametre, '-');
117
 
118
			if (isset($this->parametres[$parametre])) {
119
				$retour = $this->parametres[$parametre];
120
			} else {
121
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$parametre'\n", E_USER_WARNING);
122
			}
123
		}
124
		return $retour;
125
	}
126
 
127
	abstract public function executer();
128
 
129
	private function chargerParametresAutorises() {
130
		foreach ($this->parametres_autorises_defaut as $c => $v) {
131
			if (isset($this->parametres_autorises[$c])) {
132
				trigger_error("Erreur: le script '".$this->getScriptNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
133
			} else {
134
				$this->parametres_autorises[$c] = $v;
135
			}
136
		}
137
	}
138
 
139
	private function chargerParametres() {
140
		$parametres_cli = $this->parametres_cli;
141
 
142
		// Récupération des paramêtresgetMsgNiveauTxt
143
		foreach ($this->parametres_autorises as $p_nom => $p_val) {
144
			if (count($parametres_cli) == 0) {
145
				if ($p_val[0]) {
146
					trigger_error("Erreur: paramêtre manquant '".$p_nom."' \n", E_USER_WARNING);
147
				}
148
			}
149
			if ($p_nom == '...') {
150
				$this->parametres['...'] = array();
151
				foreach ($parametres_cli as $arg) {
152
					$this->parametres['...'][] = $arg;
153
				}
154
				$parametres_cli = array();
155
				break;
156
			} else {
157
				if (isset($parametres_cli[$p_nom])) {
158
					// Attribution de la valeur issue de la ligne de commande
159
					$this->parametres[ltrim($p_nom, '-')] = $parametres_cli[$p_nom];
160
					unset($parametres_cli[$p_nom]);
161
				} else {
162
					// Attribution de la valeur par défaut
163
					if ($p_val[1] !== true) {
164
						$this->parametres[ltrim($p_nom, '-')] = $p_val[1];
165
						unset($parametres_cli[$p_nom]);
166
					}
167
				}
168
			}
169
		}
170
 
171
		// Gestion de l'excédant de paramêtres
172
		if (count($parametres_cli)) {
173
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
174
		}
175
	}
176
 
177
	/**
178
	 * Affiche un message d'erreur formaté.
179
	 * Si le paramétre de verbosité (-v) vaut 1 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
180
	 *
181
	 * @param string le message d'erreur avec des %s.
182
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
183
	 * @return void.
184
	 */
185
	protected function traiterErreur($message, $tab_arguments = array()) {
186
		$this->traiterMessage($message, $tab_arguments, self::MSG_ERREUR);
187
	}
188
 
189
	/**
190
	 * Affiche un message d'avertissement formaté.
191
	 * Si le paramétre de verbosité (-v) vaut 1, le message est écrit dans le fichier de log.
192
	 * Si le paramétre de verbosité (-v) vaut 2 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
193
	 *
194
	 * @param string le message d'erreur avec des %s.
195
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
196
	 * @return void.
197
	 */
198
	protected function traiterAvertissement($message, $tab_arguments = array()) {
199
		$this->traiterMessage($message, $tab_arguments, self::MSG_AVERTISSEMENT);
200
	}
201
 
202
	/**
203
	 * Retourne un message d'information formaté.
204
	 * Si le paramétre de verbosité (-v) vaut 1 ou 2 , le message est écrit dans le fichier de log.
205
	 * Si le paramétre de verbosité (-v) vaut 3 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
206
	 *
207
	 * @param string le message d'information avec des %s.
208
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
209
	 * @return void.
210
	 */
211
	protected function traiterInfo($message, $tab_arguments = array()) {
212
		$this->traiterMessage($message, $tab_arguments, self::MSG_INFO);
213
	}
214
 
215
	/**
216
	 * Retourne un message formaté en le stockant dans un fichier de log si nécessaire.
217
	 *
218
	 * @param string le message d'erreur avec des %s.
219
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
220
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
221
	 * @return void.
222
	 */
223
	private function traiterMessage($message, $tab_arguments, $niveau = self::MSG_LOG) {
224
		$log = $this->formaterMsg($message, $tab_arguments, $niveau);
225
		if ($this->getParametre('v') > ($niveau - 1)) {
226
			echo $log;
227
			if (Config::get('script_logs')) {
228
				// TODO : lancer le log
229
			}
230
		}
231
	}
232
 
233
	/**
234
	 * Retourne un message d'information formaté.
235
	 *
236
	 * @param string le message d'information avec des %s.
237
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
238
	 * @return string le message d'erreur formaté.
239
	 */
240
	protected function formaterMsg($message, $tab_arguments = array(), $niveau = null) {
241
		$texte = vsprintf($message, $tab_arguments);
242
		$prefixe = date('Y-m-j_H:i:s', time());
243
		$prefixe .= is_null($niveau) ? ' : ' : ' - '.self::getMsgNiveauTxt($niveau).' : ';
244
		$log = $prefixe.$texte."\n";
245
		return $log;
246
	}
247
}
248
?>