Subversion Repositories eFlore/Applications.cel

Rev

Rev 989 | Rev 1542 | 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;
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
	 */
59
 
60
 
1293 aurelien 61
	@Override
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
 
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
 
146
	  private void addToCache(String query, ListeReferentielNom result)	  {
147
		  cache.put(query.toLowerCase(),result);
148
	  }
149
 
150
	  private ListeReferentielNom getFromCache (String query) {
1293 aurelien 151
		  return cache.get(query.toLowerCase());
151 david 152
	  }
153
 
154
 
155
 
15 david 156
}