Subversion Repositories eFlore/Applications.cel

Rev

Details | 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
 
220 aurelien 76
	    // On vérifie si un genre et une espèce sont demandées
77
		// et ajoute le / manuellement car sinon il devient urlencode
78
		String[] criteres =critere.split("/");
79
		String urlParams = "/NameSearch/";
80
	    if(criteres.length > 1) {
81
	    	String critere1 = criteres[0];
82
	    	String critere2 = criteres[1];
83
 
84
	    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
85
	    } else {
86
	    	urlParams += URL.encode(critere);
87
	    }
151 david 88
 
220 aurelien 89
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()+urlParams);
15 david 90
 
32 jpm 91
		try {
92
 
93
			rb.sendRequest(null, new RequestCallback() {
15 david 94
 
32 jpm 95
				public void onError(Request request, Throwable exception) {
96
					// TODO Auto-generated method stub
97
 
98
				}
15 david 99
 
32 jpm 100
				public void onResponseReceived(Request request,
101
						Response response) {
15 david 102
 
32 jpm 103
					final ListeReferentielNom referentielNomData ;
15 david 104
 
32 jpm 105
					final JSONValue responseValue = JSONParser.parse(response.getText());
15 david 106
 
32 jpm 107
					JSONArray reponse=null;
108
 
109
 
110
					// si c'est un tableau
111
					if ((reponse=responseValue.isArray()) != null) {
112
 
113
						JSONArray noms;
114
						final int taillemax = reponse.size();
115
 
116
						referentielNomData = new ListeReferentielNom(taillemax);
117
 
118
						for (int i = 0; i < taillemax; i++) {
119
							if ((noms=reponse.get(i).isArray()) != null) {
120
 
121
 
122
								String nom=Util.toCelString(((JSONString) noms.get(0)).toString());
123
								String numeroNom=Util.toCelString(((JSONString) noms.get(1)).toString());
389 david 124
								String statut=Util.toCelString(((JSONString) noms.get(2)).toString());
32 jpm 125
 
389 david 126
 
127
								ReferentielNom nomScientifique=new ReferentielNom(nom, numeroNom, statut);
32 jpm 128
 
129
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
130
 
131
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
132
 
133
 
134
							}
135
 
15 david 136
						}
32 jpm 137
					} else {
138
 
139
						referentielNomData = new ListeReferentielNom(0) ;
15 david 140
					}
32 jpm 141
 
15 david 142
					// dans tous les cas on transmet la liste crée au rafraichissable en lui demandant de répandre les données car il est
143
					// le premier à les recevoir
144
 
151 david 145
					addToCache(critere, referentielNomData);
146
 
15 david 147
					r.rafraichir(referentielNomData,true);
32 jpm 148
 
15 david 149
				}
32 jpm 150
 
151
 
152
			}) ;
153
 
154
		} catch(RequestException e) {
155
 
151 david 156
		}
157
 
158
		} // fin else si pas de cache
32 jpm 159
 
15 david 160
	}
151 david 161
 
162
	  private void addToCache(String query, ListeReferentielNom result)	  {
163
		  cache.put(query.toLowerCase(),result);
164
	  }
165
 
166
	  private ListeReferentielNom getFromCache (String query) {
167
		  return (ListeReferentielNom) cache.get(query.toLowerCase());
168
	  }
169
 
170
 
171
 
15 david 172
}