Subversion Repositories eFlore/Applications.cel

Rev

Rev 1918 | 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;
1918 aurelien 13
import org.tela_botanica.client.util.RequestBuilderWithCredentials;
32 jpm 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 ;
1672 aurelien 37
	private String referentiel = null;
15 david 38
 
151 david 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
 
1672 aurelien 64
		if(this.referentiel != referentiel) {
65
			cache.clear();
66
		}
67
 
151 david 68
		// En cache ?
153 david 69
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
70
			r.rafraichir(referentielNomDataFromCache,true);
151 david 71
	    }
72
 
73
		else {
74
 
220 aurelien 75
	    // On vérifie si un genre et une espèce sont demandées
76
		// et ajoute le / manuellement car sinon il devient urlencode
77
		String[] criteres =critere.split("/");
1542 aurelien 78
		String urlParams = "/NameSearch/"+referentiel+"/";
220 aurelien 79
	    if(criteres.length > 1) {
80
	    	String critere1 = criteres[0];
81
	    	String critere2 = criteres[1];
82
 
83
	    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
84
	    } else {
85
	    	urlParams += URL.encode(critere);
86
	    }
1672 aurelien 87
 
88
	    this.referentiel = referentiel;
1918 aurelien 89
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, Configuration.getServiceBaseUrl()+urlParams);
15 david 90
 
32 jpm 91
		try {
92
 
93
			rb.sendRequest(null, new RequestCallback() {
15 david 94
 
1293 aurelien 95
				@Override
32 jpm 96
				public void onError(Request request, Throwable exception) {
97
					// TODO Auto-generated method stub
98
 
99
				}
15 david 100
 
1293 aurelien 101
				@Override
32 jpm 102
				public void onResponseReceived(Request request,
103
						Response response) {
15 david 104
 
32 jpm 105
					final ListeReferentielNom referentielNomData ;
15 david 106
 
32 jpm 107
					final JSONValue responseValue = JSONParser.parse(response.getText());
15 david 108
 
32 jpm 109
					JSONArray reponse=null;
110
 
111
 
112
					// si c'est un tableau
113
					if ((reponse=responseValue.isArray()) != null) {
114
 
115
						JSONArray noms;
116
						final int taillemax = reponse.size();
117
 
118
						referentielNomData = new ListeReferentielNom(taillemax);
119
						for (int i = 0; i < taillemax; i++) {
120
							if ((noms=reponse.get(i).isArray()) != null) {
1293 aurelien 121
								String nom = ((JSONString) noms.get(0)).stringValue();
122
								String numeroNom = ((JSONString) noms.get(1)).stringValue();
123
								String statut= ((JSONString) noms.get(2)).stringValue();
124
								ReferentielNom nomScientifique = new ReferentielNom(nom, numeroNom, statut);
125
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
126
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
32 jpm 127
							}
15 david 128
						}
32 jpm 129
					} else {
130
 
131
						referentielNomData = new ListeReferentielNom(0) ;
15 david 132
					}
151 david 133
					addToCache(critere, referentielNomData);
15 david 134
					r.rafraichir(referentielNomData,true);
135
				}
32 jpm 136
			}) ;
137
 
138
		} catch(RequestException e) {
139
 
151 david 140
		}
141
 
142
		} // fin else si pas de cache
32 jpm 143
 
15 david 144
	}
151 david 145
 
1542 aurelien 146
	@Override
147
	public void obtenirListeDonnees(Rafraichissable r, String critere) {
148
		obtenirListeDonnees(r, "bdtfx", critere);
149
	}
150
 
151
	private void addToCache(String query, ListeReferentielNom result)	  {
152
		cache.put(query.toLowerCase(),result);
153
	}
151 david 154
 
1542 aurelien 155
	private ListeReferentielNom getFromCache (String query) {
156
		return cache.get(query.toLowerCase());
157
	}
15 david 158
}