Subversion Repositories eFlore/Applications.cel

Rev

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

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