Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 653 | Rev 792 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 653 Rev 791
1
<?php
1
<?php
2
/**
2
/**
3
* Description :
3
* Description :
4
* Classe principale de chargement des services d'eFlore.
4
* Classe principale de chargement des services d'eFlore.
5
*
5
*
6
* Encodage en entrée : utf8
6
* Encodage en entrée : utf8
7
* Encodage en sortie : utf8
7
* Encodage en sortie : utf8
8
* @package eflore-projets
8
* @package eflore-projets
9
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
9
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
10
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
10
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
11
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
* @version 0.1
14
* @version 0.1
15
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
15
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
16
*/
16
*/
17
class Projets extends RestService {
17
class Projets extends RestService {
18
 
18
 
19
	/** Contients les paramètres.*/
19
	/** Contients les paramètres.*/
20
	private $parametres = array();
20
	private $parametres = array();
21
	/** Contients les ressources.*/
21
	/** Contients les ressources.*/
22
	private $ressources = array();
22
	private $ressources = array();
23
 
23
 
24
	/** Nom du projet courrant. */
24
	/** Nom du projet courrant. */
25
	private $projetNom = array();
25
	private $projetNom = array();
26
	/** Nom du service demandé. */
26
	/** Nom du service demandé. */
27
	private $serviceNom = array();
27
	private $serviceNom = array();
28
	/** Chemin vers le dossier courrant. */
28
	/** Chemin vers le dossier courrant. */
29
	private $cheminCourrant = null;
29
	private $cheminCourrant = null;
-
 
30
	private $classe = null;
30
 
31
 
31
	private $cache;
32
	private $cache;
32
 
33
 
33
	/** Indique si oui (true) ou non (false), on veut utiliser les paramètres brutes. */
34
	/** Indique si oui (true) ou non (false), on veut utiliser les paramètres brutes. */
34
	protected $utilisationParametresBruts = true;
35
	protected $utilisationParametresBruts = true;
35
 
36
 
36
	public function __construct() {
37
	public function __construct() {
37
		$this->cheminCourrant = dirname(__FILE__).DS;
38
		$this->cheminCourrant = dirname(__FILE__).DS;
38
	}
39
	}
39
 
40
 
40
	public function consulter($ressources, $parametres) {
41
	public function consulter($ressources, $parametres) {
41
		$resultat = '';
42
		$resultat = '';
42
		$reponseHttp = new ReponseHttp();
43
		$reponseHttp = new ReponseHttp();
43
		try {
44
		try {
44
			$this->initialiserRessourcesEtParametres($ressources, $parametres);
45
			$this->initialiserRessourcesEtParametres($ressources, $parametres);
45
			$resultat = $this->traiterRessources();
46
			$resultat = $this->traiterRessources();
46
			$reponseHttp->setResultatService($resultat);
47
			$reponseHttp->setResultatService($resultat);
47
		} catch (Exception $e) {
48
		} catch (Exception $e) {
48
			$reponseHttp->ajouterErreur($e);
49
			$reponseHttp->ajouterErreur($e);
49
		}
50
		}
50
		$reponseHttp->emettreLesEntetes();
51
		$reponseHttp->emettreLesEntetes();
51
		$corps = $reponseHttp->getCorps();
52
		$corps = $reponseHttp->getCorps();
52
		return $corps;
53
		return $corps;
53
	}
54
	}
54
 
55
 
55
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
56
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
56
		$this->ressources = $ressources;
57
		$this->ressources = $ressources;
57
		$this->parametres = $parametres;
58
		$this->parametres = $parametres;
58
	}
59
	}
59
 
60
 
60
	private function traiterRessources() {
61
	private function traiterRessources() {
61
		$retour = '';
62
		$retour = '';
62
		if ($this->avoirRessources()) {
63
		if ($this->avoirRessources()) {
63
			if ($this->avoirRessourceProjet()) {
64
			if ($this->avoirRessourceProjet()) {
-
 
65
				$this->chargerNomDuService(); // défini $this->serviceNom
64
				$this->initialiserProjet();
66
				$this->initialiserProjet(); // autoload defined here
65
				if ($this->avoirRessourceService()) {
67
				if ($this->avoirRessourceService()) {
-
 
68
					$this->classe = self::definirClasseNeeded($this->projetNom, $this->serviceNom);
66
					$retour = $this->initialiserService();
69
					$retour = $this->initialiserService();
67
				}
70
				}
68
			}
71
			}
69
		}
72
		}
70
		return $retour;
73
		return $retour;
71
	}
74
	}
72
 
75
 
73
	private function avoirRessources() {
76
	private function avoirRessources() {
74
		$presenceDeRessources = false;
77
		$presenceDeRessources = false;
75
		if (isset($this->ressources) && count($this->ressources) > 0) {
78
		if (isset($this->ressources) && count($this->ressources) > 0) {
76
			$presenceDeRessources = true;
79
			$presenceDeRessources = true;
77
		} else {
80
		} else {
78
			$message = "Aucune ressource n'a été indiquée.\n".
81
			$message = "Aucune ressource n'a été indiquée.\n".
79
				"Veuillez indiquer au moins un code de projet et un type de service.";
82
				"Veuillez indiquer au moins un code de projet et un type de service.";
80
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
83
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
81
			throw new Exception($message, $code);
84
			throw new Exception($message, $code);
82
		}
85
		}
83
		return $presenceDeRessources;
86
		return $presenceDeRessources;
84
	}
87
	}
85
 
88
 
86
	private function avoirRessourceProjet() {
89
	private function avoirRessourceProjet() {
87
		$presenceRessourceProjet = false;
90
		$presenceRessourceProjet = false;
88
		$projet = $this->ressources[0];
91
		$projet = $this->ressources[0];
89
		$projetsDispo = Outils::recupererTableauConfig('projetsDispo');
92
		$projetsDispo = Outils::recupererTableauConfig('projetsDispo');
90
		if (in_array($projet, $projetsDispo)) {
93
		if (in_array($projet, $projetsDispo)) {
91
			$presenceRessourceProjet = true;
94
			$presenceRessourceProjet = true;
92
		} else {
95
		} else {
93
			$message = "La ressource '$projet' n'indique pas un projet existant.\n".
96
			$message = "La ressource '$projet' n'indique pas un projet existant.\n".
94
				"Les projets existant sont :\n".implode(', ', $projetsDispo);
97
				"Les projets existant sont :\n".implode(', ', $projetsDispo);
95
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
98
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
96
			throw new Exception($message, $code);
99
			throw new Exception($message, $code);
97
		}
100
		}
98
		return $presenceRessourceProjet;
101
		return $presenceRessourceProjet;
99
	}
102
	}
100
 
103
 
101
	private function initialiserProjet() {
104
	private function initialiserProjet() {
102
		$this->chargerNomDuProjet();
105
		$this->chargerNomDuProjet();
103
		$this->chargerConfigProjet();
106
		$this->chargerConfigProjet();
104
 
107
 
105
		// php5.3 : Enregistrement en première position des autoload de la méthode gérant les classes des services
108
		// php5.3 : Enregistrement en première position des autoload de la méthode gérant les classes des services
106
		if (phpversion() < 5.3) {
109
		if (phpversion() < 5.3) {
107
			spl_autoload_register(array($this, 'chargerClasseProjet'));
110
			spl_autoload_register(array($this, 'chargerClasseProjet'));
108
		} else {
111
		} else {
109
			spl_autoload_register(array($this, 'chargerClasseProjet'), true , true);
112
			spl_autoload_register(array($this, 'chargerClasseProjet'), true , true);
110
		}
113
		}
111
	}
114
	}
112
 
115
 
113
	private function chargerNomDuProjet() {
116
	private function chargerNomDuProjet() {
114
		$this->projetNom = $this->ressources[0];
117
		$this->projetNom = $this->ressources[0];
115
	}
118
	}
116
 
119
 
117
	private function chargerConfigProjet() {
120
	private function chargerConfigProjet() {
118
		$projet = $this->projetNom;
121
		$projet = $this->projetNom;
119
		$chemin = Config::get('chemin_configurations')."config_$projet.ini";
122
		$chemin = Config::get('chemin_configurations')."config_$projet.ini";
120
		Config::charger($chemin);
123
		Config::charger($chemin);
121
	}
124
	}
-
 
125
 
-
 
126
	/*
-
 
127
	  1) jusqu'à présent:
-
 
128
	  * le principe pour URL = a/b est: de charger
-
 
129
	  * require_once($chemin/a/ucfirst(c).php)
-
 
130
	  * new ucfirst(c); ucfirst(c)->consulter()
-
 
131
	  * sachant que ucfirst(c).php et la classe ucfirst(c) apparaîssent à de multiples emplacements (selon a)
-
 
132
 
-
 
133
	  1") Beurk... (php-className conflicts en PHP 5.2)
-
 
134
 
-
 
135
	  Ici nous faisons des cas particuliers pour Ontologies, mais en suivant ce principe, sont affectés:
-
 
136
	  Cartes, EfloreOntologiesTest, Images, Informations, InformationsTaxonsSup,
-
 
137
	  LegendeCartes, NomCommune, Noms, NomsVernaculaires, Projets, Statuts,
-
 
138
	  Taxons, TaxonsCartes, Textes, ZoneGeo
-
 
139
 
-
 
140
	  cf:
-
 
141
	  $ grep -r '^[cC]lass '|grep -F '.php:'|egrep -w " \($(grep -rh '^[cC]lass '|awk '{print $2}'|sort|uniq -d|tr "\n" '|')\) " \
-
 
142
	  |sort -k2
-
 
143
 
-
 
144
	  PS: "Using two class with the same name"
-
 
145
	  http://stackoverflow.com/questions/4555186/using-two-class-with-the-same-name
-
 
146
	  > Stop.
-
 
147
	  > Whatever you are doing is wrong. Backup. Re-evaluate what you are doing and why.
-
 
148
	*/
-
 
149
	private static function definirClasseNeeded($p, $s) {
-
 
150
		if($s != 'ontologies') return NULL;
-
 
151
 
-
 
152
		switch($p) {
-
 
153
		case 'baseflor':
-
 
154
			return 'BaseFloreOntologies';
-
 
155
		case 'eflore':
-
 
156
			return 'EfloreOntologies';
-
 
157
		case 'chorodep':
-
 
158
			return 'ChorodepOntologies';
-
 
159
		case 'baseveg':
-
 
160
			return 'BasevegOntologies';
-
 
161
		case 'moissonnage':
-
 
162
			return 'MoissonnnageOntologies';
-
 
163
		case 'commun':
-
 
164
			return 'Ontologies';
-
 
165
		}
-
 
166
		return NULL;
-
 
167
	}
122
 
168
 
123
	private function chargerClasseProjet($classe) {
169
	private function chargerClasseProjet($classe) {
124
		if (class_exists($classe)) {
170
		if (class_exists($classe)) {
125
			return null;
171
			return null;
126
		}
172
		}
-
 
173
 
-
 
174
		if($this->serviceNom == 'ontologies') {
-
 
175
			$c = NULL;
-
 
176
			switch($this->projetNom) {
-
 
177
			case 'baseflor':
-
 
178
				$c = 'BaseFloreOntologies';
-
 
179
				break;
-
 
180
			case 'eflore':
-
 
181
				$c = 'EfloreOntologies';
-
 
182
				break;
-
 
183
			case 'chorodep':
-
 
184
				$c = 'ChorodepOntologies';
-
 
185
				break;
-
 
186
			case 'baseveg':
-
 
187
				$c = 'BasevegOntologies';
-
 
188
				break;
-
 
189
			case 'moissonnage':
-
 
190
				$c = 'MoissonnnageOntologies';
-
 
191
				break;
-
 
192
			case 'commun':
-
 
193
				$c = 'Ontologies';
-
 
194
				break;
-
 
195
			}
-
 
196
			if($c) {
-
 
197
				require_once($this->cheminCourrant . 'commun' . DS . 'Commun.php');
-
 
198
				require_once($this->cheminCourrant . $this->projetNom . DS . $this->obtenirNomClasseService($this->serviceNom) . '.php');
-
 
199
				return;
-
 
200
			}
-
 
201
		}
127
 
202
 
128
		$cheminBiblio = Config::get('chemin_bibliotheque');
203
		$cheminBiblio = Config::get('chemin_bibliotheque');
129
		$chemins = array();
204
		$chemins = array();
130
		$chemins[] = $this->cheminCourrant.$this->projetNom.DS;
205
		$chemins[] = $this->cheminCourrant.$this->projetNom.DS;
131
		$chemins[] = $this->cheminCourrant.'commun'.DS;
206
		$chemins[] = $this->cheminCourrant.'commun'.DS;
132
		$chemins[] = $cheminBiblio;
207
		$chemins[] = $cheminBiblio;
133
		$chemins[] = $cheminBiblio.'robots'.DS;
208
		$chemins[] = $cheminBiblio.'robots'.DS;
134
 
209
 
135
		foreach ($chemins as $chemin) {
210
		foreach ($chemins as $chemin) {
136
			$chemin = $chemin.$classe.'.php';
211
			$chemin = $chemin.$classe.'.php';
137
			if (file_exists($chemin)) {
212
			if (file_exists($chemin)) {
138
				require_once $chemin;
213
				require_once $chemin;
139
				break;
214
				break;
140
			}
215
			}
141
		}
216
		}
142
	}
217
	}
143
 
218
 
144
	private function avoirRessourceService() {
219
	private function avoirRessourceService() {
145
		$presenceRessourceService = false;
220
		$presenceRessourceService = false;
146
		$servicesDispo = Outils::recupererTableauConfig('servicesDispo');
221
		$servicesDispo = Outils::recupererTableauConfig('servicesDispo');
147
		if (isset($this->ressources[1])) {
222
		if (isset($this->ressources[1])) {
148
			$service = $this->ressources[1];
223
			$service = $this->ressources[1];
149
			if (in_array($service, $servicesDispo)) {
224
			if (in_array($service, $servicesDispo)) {
150
				$presenceRessourceService = true;
225
				$presenceRessourceService = true;
151
			} else {
226
			} else {
152
				$message = "La service demandé '$service' n'est pas disponible pour le projet {$this->projetNom} !\n".
227
				$message = "La service demandé '$service' n'est pas disponible pour le projet {$this->projetNom} !\n".
153
					"Les services disponibles sont : ".implode(', ', $servicesDispo);
228
					"Les services disponibles sont : ".implode(', ', $servicesDispo);
154
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
229
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
155
				throw new Exception($message, $code);
230
				throw new Exception($message, $code);
156
			}
231
			}
157
		} else {
232
		} else {
158
			$message = "Vous n'avez pas indiqué de service pour le projet {$this->projetNom} !\n".
233
			$message = "Vous n'avez pas indiqué de service pour le projet {$this->projetNom} !\n".
159
				"Les services disponibles sont : ".implode(', ', $servicesDispo);
234
				"Les services disponibles sont : ".implode(', ', $servicesDispo);
160
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
235
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
161
			throw new Exception($message, $code);
236
			throw new Exception($message, $code);
162
		}
237
		}
163
		return $presenceRessourceService;
238
		return $presenceRessourceService;
164
	}
239
	}
165
 
240
 
166
	private function initialiserService() {
241
	private function initialiserService() {
167
		$this->chargerNomDuService();
242
		if($this->classe) {
-
 
243
			$classe = $this->classe;
-
 
244
			$service = new $classe($this->getBdd());
-
 
245
			return $service->consulter($ressourcesPourService, $this->parametres);
-
 
246
		}
-
 
247
 
168
		$classe = $this->obtenirNomClasseService($this->serviceNom);
248
		$classe = $this->obtenirNomClasseService($this->serviceNom);
169
		$chemins = array();
249
		$chemins = array();
170
		$chemins[] = $this->cheminCourrant.$this->projetNom.DS.$classe.'.php';
250
		$chemins[] = $this->cheminCourrant.$this->projetNom.DS.$classe.'.php';
171
		$chemins[] = $this->cheminCourrant.'commun'.DS.$classe.'.php';
251
		$chemins[] = $this->cheminCourrant.'commun'.DS.$classe.'.php';
172
 
-
 
173
		$retour = '';
252
 
174
		$service = null;
253
		$service = null;
175
		foreach ($chemins as $chemin) {
254
		foreach ($chemins as $chemin) {
176
			if (file_exists($chemin)) {
255
			if (file_exists($chemin)) {
177
				$service = new $classe($this->getBdd());
256
				$service = new $classe($this->getBdd());
178
				$ressourcesPourService = $this->filtrerRessourcesPourService();
257
				$ressourcesPourService = $this->filtrerRessourcesPourService();
179
				$this->cache = new CacheEflore($service, $this->projetNom, $this->serviceNom, Config::get('cache'));
258
				$this->cache = new CacheEflore($service, $this->projetNom, $this->serviceNom, Config::get('cache'));
180
				$retour = $this->cache->consulter($ressourcesPourService, $this->parametres);
259
				return $this->cache->consulter($ressourcesPourService, $this->parametres);
181
			}
260
			}
182
		}
261
		}
183
		if (is_null($service)) {
262
		if (is_null($service)) {
184
			$message = "La service demandé '{$this->serviceNom}' n'existe pas dans le projet {$this->projetNom} !";
263
			$message = "La service demandé '{$this->serviceNom}' n'existe pas dans le projet {$this->projetNom} !";
185
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
264
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
186
			throw new Exception($message, $code);
265
			throw new Exception($message, $code);
187
		}
266
		}
188
		return $retour;
267
		return NULL;
189
	}
268
	}
190
 
269
 
191
	private function chargerNomDuService() {
270
	private function chargerNomDuService() {
192
		$this->serviceNom = $this->ressources[1];
271
		$this->serviceNom = $this->ressources[1];
193
	}
272
	}
194
 
273
 
195
	private function obtenirNomClasseService($mot) {
274
	private function obtenirNomClasseService($mot) {
196
		$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
275
		return str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
197
		return $classeNom;
-
 
198
	}
276
	}
199
 
277
 
200
	private function filtrerRessourcesPourService() {
278
	private function filtrerRessourcesPourService() {
201
		$ressourcesPourService = array();
279
		$ressourcesPourService = array();
202
		$nbreDeRessources = count($this->ressources);
280
		$nbreDeRessources = count($this->ressources);
203
		for ($i = 2; $i < $nbreDeRessources; $i++) {
281
		for ($i = 2; $i < $nbreDeRessources; $i++) {
204
			$ressourcesPourService[] = $this->ressources[$i];
282
			$ressourcesPourService[] = $this->ressources[$i];
205
		}
283
		}
206
		return $ressourcesPourService;
284
		return $ressourcesPourService;
207
	}
285
	}
208
}
286
}
209
?>
287
?>