Subversion Repositories eFlore/Applications.cel

Rev

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