Subversion Repositories eFlore/Applications.cel

Rev

Rev 1542 | 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;
11
 
32 jpm 12
import com.google.gwt.http.client.Request;
13
import com.google.gwt.http.client.RequestBuilder;
14
import com.google.gwt.http.client.RequestCallback;
15
import com.google.gwt.http.client.RequestException;
16
import com.google.gwt.http.client.Response;
204 david 17
import com.google.gwt.http.client.URL;
15 david 18
import com.google.gwt.json.client.JSONArray;
19
import com.google.gwt.json.client.JSONParser;
20
import com.google.gwt.json.client.JSONString;
21
import com.google.gwt.json.client.JSONValue;
22
 
23
/**
153 david 24
 * DAO  liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.
15 david 25
 * @author David Delon
26
 *
27
 */
28
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
29
 
30
 
153 david 31
	//TODO : limiter taille du cache ? (si pb performance)
15 david 32
 
33
	/**
34
	 * Le modèle associé au DAO
35
	 */
36
	private ObservationModele observationModele = null ;
37
 
151 david 38
 
39
	/**
40
	 * Cache
41
	 *
42
	 */
43
 
44
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
153 david 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
	 */
1293 aurelien 59
	@Override
1542 aurelien 60
	public void obtenirListeDonnees(final Rafraichissable r,final String referentiel, final String critere)
15 david 61
	{
153 david 62
		ListeReferentielNom referentielNomDataFromCache=null;
151 david 63
 
64
		// En cache ?
153 david 65
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
66
			r.rafraichir(referentielNomDataFromCache,true);
151 david 67
	    }
68
 
69
		else {
70
 
220 aurelien 71
	    // On vérifie si un genre et une espèce sont demandées
72
		// et ajoute le / manuellement car sinon il devient urlencode
73
		String[] criteres =critere.split("/");
1542 aurelien 74
		String urlParams = "/NameSearch/"+referentiel+"/";
220 aurelien 75
	    if(criteres.length > 1) {
76
	    	String critere1 = criteres[0];
77
	    	String critere2 = criteres[1];
78
 
79
	    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
80
	    } else {
81
	    	urlParams += URL.encode(critere);
82
	    }
151 david 83
 
220 aurelien 84
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()+urlParams);
15 david 85
 
32 jpm 86
		try {
87
 
88
			rb.sendRequest(null, new RequestCallback() {
15 david 89
 
1293 aurelien 90
				@Override
32 jpm 91
				public void onError(Request request, Throwable exception) {
92
					// TODO Auto-generated method stub
93
 
94
				}
15 david 95
 
1293 aurelien 96
				@Override
32 jpm 97
				public void onResponseReceived(Request request,
98
						Response response) {
15 david 99
 
32 jpm 100
					final ListeReferentielNom referentielNomData ;
15 david 101
 
32 jpm 102
					final JSONValue responseValue = JSONParser.parse(response.getText());
15 david 103
 
32 jpm 104
					JSONArray reponse=null;
105
 
106
 
107
					// si c'est un tableau
108
					if ((reponse=responseValue.isArray()) != null) {
109
 
110
						JSONArray noms;
111
						final int taillemax = reponse.size();
112
 
113
						referentielNomData = new ListeReferentielNom(taillemax);
114
						for (int i = 0; i < taillemax; i++) {
115
							if ((noms=reponse.get(i).isArray()) != null) {
1293 aurelien 116
								String nom = ((JSONString) noms.get(0)).stringValue();
117
								String numeroNom = ((JSONString) noms.get(1)).stringValue();
118
								String statut= ((JSONString) noms.get(2)).stringValue();
119
								ReferentielNom nomScientifique = new ReferentielNom(nom, numeroNom, statut);
120
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
121
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
32 jpm 122
							}
15 david 123
						}
32 jpm 124
					} else {
125
 
126
						referentielNomData = new ListeReferentielNom(0) ;
15 david 127
					}
151 david 128
					addToCache(critere, referentielNomData);
15 david 129
					r.rafraichir(referentielNomData,true);
130
				}
32 jpm 131
			}) ;
132
 
133
		} catch(RequestException e) {
134
 
151 david 135
		}
136
 
137
		} // fin else si pas de cache
32 jpm 138
 
15 david 139
	}
151 david 140
 
1542 aurelien 141
	@Override
142
	public void obtenirListeDonnees(Rafraichissable r, String critere) {
143
		obtenirListeDonnees(r, "bdtfx", critere);
144
	}
145
 
146
	private void addToCache(String query, ListeReferentielNom result)	  {
147
		cache.put(query.toLowerCase(),result);
148
	}
151 david 149
 
1542 aurelien 150
	private ListeReferentielNom getFromCache (String query) {
151
		return cache.get(query.toLowerCase());
152
	}
15 david 153
}