Subversion Repositories eFlore/Applications.coel

Rev

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