Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
15 david 1
package org.tela_botanica.client.modeles;
2
 
151 david 3
import java.util.HashMap;
4
 
15 david 5
import org.tela_botanica.client.Util;
6
import org.tela_botanica.client.interfaces.FournisseurListe;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
8
import org.tela_botanica.client.observation.ObservationModele;
9
 
32 jpm 10
import com.google.gwt.http.client.Request;
11
import com.google.gwt.http.client.RequestBuilder;
12
import com.google.gwt.http.client.RequestCallback;
13
import com.google.gwt.http.client.RequestException;
14
import com.google.gwt.http.client.Response;
15 david 15
import com.google.gwt.json.client.JSONArray;
16
import com.google.gwt.json.client.JSONParser;
17
import com.google.gwt.json.client.JSONString;
18
import com.google.gwt.json.client.JSONValue;
19
 
20
/**
153 david 21
 * DAO  liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.
15 david 22
 * @author David Delon
23
 *
24
 */
25
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
26
 
27
 
153 david 28
	//TODO : limiter taille du cache ? (si pb performance)
15 david 29
 
30
	/**
31
	 * Le modèle associé au DAO
32
	 */
33
	private ObservationModele observationModele = null ;
34
 
151 david 35
 
36
	/**
37
	 * Cache
38
	 *
39
	 */
40
 
41
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
42
 
43
 
153 david 44
 
45
 
15 david 46
	public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele)
47
	{
48
 
49
		this.observationModele=observationModele;
50
	}
51
 
52
 
53
	/**
54
	 * Envoie une requete au serveur jrest pour obtenir les communes  correspondant
55
	 * à des critères données en paramètres
56
	 * @param r le rafraichissable qui demande la mise à jour
57
	 * @param criteres un string contenant le terme a rechercher
58
	 */
59
 
60
 
151 david 61
	public void obtenirListeDonnees(final Rafraichissable r, final String critere)
15 david 62
	{
63
 
151 david 64
 
153 david 65
		ListeReferentielNom referentielNomDataFromCache=null;
151 david 66
 
67
 
68
		// En cache ?
153 david 69
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
70
			r.rafraichir(referentielNomDataFromCache,true);
151 david 71
	    }
72
 
73
		else {
74
 
75
 
76
 
77
 
78
 
32 jpm 79
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, observationModele.getConfig().getServiceBaseUrl()+"/NameSearch/"+critere) ;
15 david 80
 
32 jpm 81
		try {
82
 
83
			rb.sendRequest(null, new RequestCallback() {
15 david 84
 
32 jpm 85
				public void onError(Request request, Throwable exception) {
86
					// TODO Auto-generated method stub
87
 
88
				}
15 david 89
 
32 jpm 90
				public void onResponseReceived(Request request,
91
						Response response) {
15 david 92
 
32 jpm 93
					final ListeReferentielNom referentielNomData ;
15 david 94
 
32 jpm 95
					final JSONValue responseValue = JSONParser.parse(response.getText());
15 david 96
 
32 jpm 97
					JSONArray reponse=null;
98
 
99
 
100
					// si c'est un tableau
101
					if ((reponse=responseValue.isArray()) != null) {
102
 
103
						JSONArray noms;
104
						final int taillemax = reponse.size();
105
 
106
						referentielNomData = new ListeReferentielNom(taillemax);
107
 
108
						for (int i = 0; i < taillemax; i++) {
109
							if ((noms=reponse.get(i).isArray()) != null) {
110
 
111
 
112
 
113
								String nom=Util.toCelString(((JSONString) noms.get(0)).toString());
114
								String numeroNom=Util.toCelString(((JSONString) noms.get(1)).toString());
115
 
116
								ReferentielNom nomScientifique=new ReferentielNom(nom, numeroNom);
117
 
118
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
119
 
120
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
121
 
122
 
123
							}
124
 
15 david 125
						}
32 jpm 126
					} else {
127
 
128
						referentielNomData = new ListeReferentielNom(0) ;
15 david 129
					}
32 jpm 130
 
15 david 131
					// dans tous les cas on transmet la liste crée au rafraichissable en lui demandant de répandre les données car il est
132
					// le premier à les recevoir
133
 
151 david 134
					addToCache(critere, referentielNomData);
135
 
15 david 136
					r.rafraichir(referentielNomData,true);
32 jpm 137
 
15 david 138
				}
32 jpm 139
 
140
 
141
			}) ;
142
 
143
		} catch(RequestException e) {
144
 
151 david 145
		}
146
 
147
		} // fin else si pas de cache
32 jpm 148
 
15 david 149
	}
151 david 150
 
151
	  private void addToCache(String query, ListeReferentielNom result)	  {
152
		  cache.put(query.toLowerCase(),result);
153
	  }
154
 
155
	  private ListeReferentielNom getFromCache (String query) {
156
		  return (ListeReferentielNom) cache.get(query.toLowerCase());
157
	  }
158
 
159
 
160
 
15 david 161
}