Subversion Repositories eFlore/Applications.coel

Rev

Rev 1415 | Rev 1513 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
69 jpm 1
package org.tela_botanica.client.modeles;
2
 
570 jp_milcent 3
import java.util.HashMap;
4
 
1367 cyprien 5
import org.tela_botanica.client.Mediateur;
773 jpm 6
import org.tela_botanica.client.http.JsonRestRequestBuilder;
7
import org.tela_botanica.client.http.JsonRestRequestCallback;
69 jpm 8
import org.tela_botanica.client.interfaces.Rafraichissable;
1319 gduche 9
import org.tela_botanica.client.synchronisation.Reponse;
10
import org.tela_botanica.client.synchronisation.Sequenceur;
1292 cyprien 11
import org.tela_botanica.client.util.Debug;
299 gduche 12
import org.tela_botanica.client.util.UtilDAO;
69 jpm 13
 
14
import com.google.gwt.json.client.JSONArray;
1292 cyprien 15
import com.google.gwt.json.client.JSONBoolean;
16
import com.google.gwt.json.client.JSONNumber;
91 jpm 17
import com.google.gwt.json.client.JSONObject;
18
import com.google.gwt.json.client.JSONString;
69 jpm 19
import com.google.gwt.json.client.JSONValue;
20
 
21
public class ValeurListeAsyncDao {
570 jp_milcent 22
 
1292 cyprien 23
	private static HashMap<String, Object> ontologieCache = new HashMap<String, Object>();
24
 
268 jp_milcent 25
	private static final String SERVICE_NOM = "CoelValeurListe";
570 jp_milcent 26
	private Rafraichissable vueARafraichir = null;
1292 cyprien 27
	private int cptPage = 0;
1329 cyprien 28
	// FIXME : limiteJREST devrait être récupéré depuis un registre/dictionnaire
1292 cyprien 29
	private int limiteJREST = 150;
30
 
570 jp_milcent 31
	public ValeurListeAsyncDao(Rafraichissable vueCourante) {
32
		vueARafraichir = vueCourante;
1367 cyprien 33
		if (Mediateur.DEBUG) System.out.println("|| ValeurListeAsyncDao > vueARafraichir = "+vueARafraichir.getClass().toString());
268 jp_milcent 34
	}
35
 
1292 cyprien 36
	public static HashMap<String, Object> getOntologieCache() {
37
		return ontologieCache;
292 gduche 38
	}
39
 
1367 cyprien 40
	public void obtenirListe(Integer cle, Integer seqId) {
1319 gduche 41
		selectionner("id", cle, null, null, false, null, -1, -1, seqId);
1292 cyprien 42
	}
43
 
1367 cyprien 44
	public void obtenirListe(String type, String identifiantValeur, Integer seqId) {
1319 gduche 45
		selectionner(type, null, null, identifiantValeur, false, null, -1, -1, seqId);
1292 cyprien 46
	}
47
 
1367 cyprien 48
	public void obtenirListe(Integer cle, boolean pagination, String recherche, int start, int limit, Integer seqId) {
1319 gduche 49
		selectionner("nom", cle, null, null, pagination, recherche, start, limit, seqId);
1292 cyprien 50
	}
51
 
1319 gduche 52
	public void selectionner(String type, Integer cle, String abv, String idValeur, Integer seqId) {
53
		selectionner(type, cle, abv, idValeur, false, null, -1, -1, seqId);
1292 cyprien 54
	}
55
 
1329 cyprien 56
	/****************************************************************************************************
57
	 ** selectionner(final String type, final Integer cle, final String abv, final String idValeur, final boolean pagination, final String recherche, final int start, final int limit)
58
	/****************************************************************************************************
59
	 * Action :
60
	 * --------
61
	 * 		Récupère un nombre défini de Valeurs en s'aidant du nom partiel ou complet d'une valeur.
62
	 * 		Cette méthode gère deux types de sélection de données :
63
	 * 		- la sélection en cache (ontologieCache) --> pagination = FALSE
64
	 * 		- la sélection "au fur et à mesure" --> pagination = TRUE
65
	 *
66
	 * 		Gestion du cache :
67
	 * 		------------------
68
	 * 		- Le cache est utilisé si et seulement si 'pagination' est à FAUX car dans le cas où PAGINATION est
69
	 * 			à VRAI, les enregistrements sont chargés au fur et à mesure de la consultation des pages par
70
	 * 			l'utilisateur.
71
	 * 		- Si la taille de la liste chargée est supérieure au nombre maximum d'enregistrements retourné
72
	 * 		par le service JREST, alors on charge des blocs de valeurs jusqu'à ce que la totalité de la
73
	 * 		liste soit chargée.
74
	 *
75
	 * Description des paramètres :
76
	 * ----------------------------
77
	 *  @param 'type' est un paramètre directement destiné au service JREST. Il permet de définir le type
78
	 *  		de requête SQL à exécuter.
79
	 *  @param 	'cle' est l'identifiant de la liste de valeurs à récupérer (cas d'un noeud dans l'arbre).
80
	 *  @param 	'abv' sert pour la liste des régions. Il représente l'abréviation du nom d'un pays. Ce
81
	 *  		paramètre est concaténé à la clé pour former une clé particulière dont on se sert pour
82
	 *  		stocker la liste en cache.
83
	 *  @param	'idValeur' est l'identifiant de la valeur à récupérer (cas d'une feuille dans l'arbre).
84
	 *  @param	'pagination' est un booléen qui définit si la requête doit être paginée ou non.
85
	 *  @param	'recherche' est une chaîne de caractères représentant tout ou partie du nom d'un projet.
86
	 *  		Si la chaîne est vide, alors tous les projets sont recherchés.
87
	 *  @param	'start' et 'limit' sont les paramètres indispensables à la pagination. 'start'
88
	 *  		est le paramètre qui décrit le numéro du tuple de départ et 'limit' le nombre
89
	 *  		d'éléments à collecter.
90
	 *
91
	 *****************************************************************************************************/
1367 cyprien 92
	public void selectionner(final String type, final Integer cle, final String abv, final String idValeur, final boolean pagination, final String recherche, final int start, final int limit, final Integer seqId) {
1329 cyprien 93
		/**
94
		 * La cleParent en Integer est insuffisante pour les liste valeurs comme Région qui on plusieurs
95
		 * sections sur leur liste (ex : on ne sélectionne que les régions FR.__ puis les régions ES.__ sur la liste 1078 ....
96
		 **/
1292 cyprien 97
		final String cleParentPourCache = cle + (abv == null ? "" : abv);
98
		final String cleParent = cle+"";
1038 gduche 99
 
1329 cyprien 100
		/** GESTION DU PARAMETRE 'recherche' **/
1292 cyprien 101
		String nom = "";
102
		if ( (recherche == null) || (recherche.equals("")) ) nom = "";
103
		else {
104
			nom = recherche+"%";
105
		}
106
 
1329 cyprien 107
		/** GESTION DU PARAMETRE 'abréviation' **/
1292 cyprien 108
		String abreviation = "";
109
		String paramAbv = "";
110
		if (type.equals("ab") || type.equals("abv")) {
111
			int positionPoint = abv.indexOf(".");
112
			if (positionPoint != -1) abreviation = abv.substring(0, positionPoint)+"%";
113
			else abreviation=abv+"%";
114
		}
115
		paramAbv = abreviation;
116
 
1329 cyprien 117
		/** GESTION DES PARAMETRES à transmettre au JREST **/
1292 cyprien 118
		String[] parametres = {type, cleParent, paramAbv, idValeur, nom};
119
		HashMap<String, String> restrictions = new HashMap<String, String>();
120
 
1329 cyprien 121
		/** GESTION DE LA REQUETE dans le cas d'une liste paginée **/
1292 cyprien 122
		if (pagination)	{
123
 
124
			restrictions.put("limit", String.valueOf(limit));
125
			restrictions.put("start", String.valueOf(start));
126
			restrictions.put("orderby", "cmlv_nom");
127
 
1329 cyprien 128
			/** CONSTRUCTION DE LA REQUETE **/
1292 cyprien 129
    		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres, restrictions);
1329 cyprien 130
 
131
    		/** ENVOI DE LA REQUETE **/
1292 cyprien 132
    		rb.envoyerRequete(null, new JsonRestRequestCallback()
133
    		{
1329 cyprien 134
    			/** RECEPTION DE LA REPONSE **/
1292 cyprien 135
    			public void surReponse(JSONValue responseValue)
1367 cyprien 136
    			{
1319 gduche 137
    				if (vueARafraichir instanceof Sequenceur)	{
1367 cyprien 138
    					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste paginée, retour au sequenceur");
1319 gduche 139
    					Reponse reponse = new Reponse(responseValue, seqId);
140
    					vueARafraichir.rafraichir(reponse);
1329 cyprien 141
 
142
    				/** Dans le cas d'une liste paginée, vueARafraichir est un objet Proxy.
143
    				 * On retourne l'objet JSON au proxy afin que ce soit lui qui le traite **/
1319 gduche 144
    				} else {
1367 cyprien 145
    					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste paginée, retour à "+vueARafraichir.getClass().toString());
1319 gduche 146
    					vueARafraichir.rafraichir(responseValue);
147
    				}
773 jpm 148
    			}
149
    		});
1292 cyprien 150
		}
1329 cyprien 151
		/** GESTION DE LA REQUETE dans le cas d'une liste NON paginée **/
1292 cyprien 152
		else
153
		{
1329 cyprien 154
			/** si start est supérieur à zéro, alors cela signifie que l'on doit charger une nouvelle page **/
1292 cyprien 155
			boolean nextPage = (start > 0);
156
 
1329 cyprien 157
			/** définition des contraintes sur la requête SQL **/
158
			if (nextPage) {
1292 cyprien 159
				restrictions.put("start", String.valueOf(start));
160
				restrictions.put("limit", String.valueOf(limit));
161
				restrictions.put("orderby", "cmlv_nom");
162
			}
1329 cyprien 163
			else {
1292 cyprien 164
				restrictions.put("orderby", "cmlv_nom");
165
			}
166
 
1329 cyprien 167
			/** Si l'on est pas dans un processus de récupération d'une liste, alors si le cache contient déjà la liste recherchée **/
168
			if (!nextPage && ontologieCache.containsKey(cleParentPourCache)) {
169
 
1367 cyprien 170
				/** on retourne à la vue la liste contenue dans le cache **/
171
				if (vueARafraichir instanceof Sequenceur)	{
172
					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste en cache, retour au sequenceur");
173
					vueARafraichir = (Sequenceur) vueARafraichir;
174
					Reponse reponse = new Reponse(ontologieCache.get(cleParentPourCache), seqId);
175
					vueARafraichir.rafraichir(reponse);
176
				} else {
1369 cyprien 177
					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste en cache, retour à "+vueARafraichir.getClass().toString());
1367 cyprien 178
					vueARafraichir.rafraichir(ontologieCache.get(cleParentPourCache));
179
				}
1329 cyprien 180
			}
181
			/** Si l'on est en train de récupérer une liste (c-a-d que l'on est en train de charger des blocs de données afin de récupérer totalement une liste) **/
182
			else {
183
 
184
				/** CONSTRUCTION DE LA REQUETE **/
1292 cyprien 185
	    		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres, restrictions);
1329 cyprien 186
 
187
	    		/** ENVOI DE LA REQUETE **/
188
	    		rb.envoyerRequete(null, new JsonRestRequestCallback() {
189
 
190
	    			/** RECEPTION DE LA REPONSE **/
191
	    			public void surReponse(JSONValue responseValue) {
192
 
193
	    				/** Si la réponse n'est pas vide **/
194
	    				if (responseValue.isObject() != null) {
195
 
196
	    					/** Récupération des différents paramètres de la réponse JSON **/
1292 cyprien 197
							final JSONObject reponse = responseValue.isObject();
198
							JSONString listeId = reponse.get("id").isString();
199
							JSONArray listeValeurs = reponse.get("valeurs").isArray();
200
							JSONNumber nbElements = reponse.get("nbElements").isNumber();
201
							JSONBoolean getNextPage = reponse.get("getNextPage").isBoolean();
202
 
203
							/** Gestion de l'abreviation (pour la liste des régions) **/
204
							String abreviationStr = "";
205
							if (reponse.get("abreviation") != null) {
206
								abreviationStr = reponse.get("abreviation").isString().stringValue();
207
								int a = abreviationStr.indexOf("%", 1);
208
								abreviationStr = abreviationStr.substring(1, a);
209
							}
210
							else {
211
								abreviationStr = "";
212
							}
213
 
1329 cyprien 214
							/** Si l'on a bien reçu une liste de valeurs **/
1292 cyprien 215
							if (listeId != null)
216
							{
217
								/** Transformation du tableau JSON réponse en ValeurListe **/
218
								String id = listeId.stringValue();
219
								ValeurListe liste = new ValeurListe(new JSONString(id), abreviationStr, listeValeurs, nbElements);
220
 
221
								/** Si la liste existe deja en cache **/
222
								String identifiantCache = (abreviationStr=="") ? id : (id+abreviationStr);
223
								if (ontologieCache.get(id) != null)
224
								{
225
									/** Alors on concatène la liste existante avec celle qu'on vient de recevoir **/
226
									((ValeurListe)ontologieCache.get(identifiantCache)).concatenerListe(liste);
227
								}
228
								/** Sinon on l'insère simplement dans le cache **/
229
								else {
230
									ontologieCache.put(identifiantCache,liste);
231
								}
232
 
233
								/** Appel à la méthode qui gère le retour à l'appelant ou la suite du chargement **/
1319 gduche 234
								chargerListe(getNextPage.booleanValue(), type, liste.getId(), abv, idValeur, pagination, recherche, start, limit, seqId);
1292 cyprien 235
							}
236
	    				}
237
	    			}
238
	    		});
239
	    	}
240
		}
69 jpm 241
	}
1329 cyprien 242
 
243
	/********************************************************************************************************
244
	 * Action :
245
	 * --------
246
	 * 		Clotûre le chargement d'une liste de valeurs si le chargement est terminé, ou lance le chargement
247
	 * 		du prochain bloc de données si la liste n'est pas chargée en totalité.
248
	 *
249
	 * Paramètres :
250
	 * ------------
251
	 * @param nextPage : est VRAI s'il faut faut continuer de charger la liste car elle n'est pas entièrement chargée et FAUX sinon
252
	 * @param Tous les autres paramètres sont les mêmes que pour la méthode 'selectionner'
253
	 *
254
	 *********************************************************************************************************/
255
	public void chargerListe(boolean nextPage, String type, Integer cle, String abv, String idValeur, boolean pagination, String recherche, int start, int nbElements, final Integer seqId) {
256
 
257
		/** Si nextpage est VRAI, alors cela signifie que l'on doit relancer une requete pour obtenir
258
		la page suivante **/
259
		if (nextPage) {
260
			cptPage++;
261
			selectionner(type, cle, abv, idValeur, pagination, recherche, cptPage*limiteJREST, limiteJREST, seqId);
262
		}
263
 
264
		/** Sinon cela signifie que le chargement de la liste est terminé et on peut
265
		la mettre en cache et retourner la réponse au demandeur **/
266
		else {
267
			// recupération de l'idenfiant de la liste
268
			String id = String.valueOf(cle);
269
 
270
			// gestion de l'abréviation pour la liste des régions
271
			String abreviationStr = "";
272
			if (abv != null) {
273
				abreviationStr = abv;
274
				int indexPoint = abreviationStr.indexOf(".", 0);
275
				abreviationStr = abreviationStr.substring(0, indexPoint);
276
				id = id+abreviationStr;
277
			}
278
 
279
			/** On retourne la liste à la vue **/
280
			if (ontologieCache.get(id) != null) {
281
				if (vueARafraichir instanceof Sequenceur)	{
1373 cyprien 282
					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste en cache, retour au sequenceur (cptPage="+cptPage+")");
1329 cyprien 283
					vueARafraichir = (Sequenceur) vueARafraichir;
284
					Reponse reponse = new Reponse(ontologieCache.get(id), seqId);
285
					vueARafraichir.rafraichir(reponse);
286
				} else {
1369 cyprien 287
					if (Mediateur.DEBUG) System.out.println("<-- ValeurListeAsyncDao > Liste en cache, retour à "+vueARafraichir.getClass().toString());
1329 cyprien 288
					vueARafraichir.rafraichir(ontologieCache.get(id));
289
				}
290
			}
1373 cyprien 291
 
292
			// réinitialisation du compteur
293
			cptPage = 0;
1329 cyprien 294
		}
295
	}
1292 cyprien 296
}