Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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