Subversion Repositories eFlore/Applications.cel

Rev

Rev 32 | Go to most recent revision | Details | Compare with Previous | 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;
15 david 15
import com.google.gwt.json.client.JSONArray;
16
import com.google.gwt.json.client.JSONParser;
17
import com.google.gwt.json.client.JSONString;
18
import com.google.gwt.json.client.JSONValue;
19
 
20
/**
21
 * DAO  liste noms scientifiques
22
 * @author David Delon
23
 *
24
 */
25
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
26
 
27
 
28
 
29
	/**
30
	 * Le modèle associé au DAO
31
	 */
32
	private ObservationModele observationModele = null ;
33
 
151 david 34
 
35
	/**
36
	 * Cache
37
	 *
38
	 */
39
 
40
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
41
 
42
 
15 david 43
	public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele)
44
	{
45
 
46
		this.observationModele=observationModele;
47
	}
48
 
49
 
50
	/**
51
	 * Envoie une requete au serveur jrest pour obtenir les communes  correspondant
52
	 * à des critères données en paramètres
53
	 * @param r le rafraichissable qui demande la mise à jour
54
	 * @param criteres un string contenant le terme a rechercher
55
	 */
56
 
57
 
151 david 58
	public void obtenirListeDonnees(final Rafraichissable r, final String critere)
15 david 59
	{
60
 
151 david 61
 
62
		ListeReferentielNom referentielNomData=null;
63
 
64
 
65
		// En cache ?
66
		if ((referentielNomData=getFromCache(critere))!=null) {
67
			r.rafraichir(referentielNomData,true);
68
	    }
69
 
70
		else {
71
 
72
 
73
 
74
 
75
 
32 jpm 76
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, observationModele.getConfig().getServiceBaseUrl()+"/NameSearch/"+critere) ;
15 david 77
 
32 jpm 78
		try {
79
 
80
			rb.sendRequest(null, new RequestCallback() {
15 david 81
 
32 jpm 82
				public void onError(Request request, Throwable exception) {
83
					// TODO Auto-generated method stub
84
 
85
				}
15 david 86
 
32 jpm 87
				public void onResponseReceived(Request request,
88
						Response response) {
15 david 89
 
32 jpm 90
					final ListeReferentielNom referentielNomData ;
15 david 91
 
32 jpm 92
					final JSONValue responseValue = JSONParser.parse(response.getText());
15 david 93
 
32 jpm 94
					JSONArray reponse=null;
95
 
96
 
97
					// si c'est un tableau
98
					if ((reponse=responseValue.isArray()) != null) {
99
 
100
						JSONArray noms;
101
						final int taillemax = reponse.size();
102
 
103
						referentielNomData = new ListeReferentielNom(taillemax);
104
 
105
						for (int i = 0; i < taillemax; i++) {
106
							if ((noms=reponse.get(i).isArray()) != null) {
107
 
108
 
109
 
110
								String nom=Util.toCelString(((JSONString) noms.get(0)).toString());
111
								String numeroNom=Util.toCelString(((JSONString) noms.get(1)).toString());
112
 
113
								ReferentielNom nomScientifique=new ReferentielNom(nom, numeroNom);
114
 
115
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
116
 
117
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
118
 
119
 
120
							}
121
 
15 david 122
						}
32 jpm 123
					} else {
124
 
125
						referentielNomData = new ListeReferentielNom(0) ;
15 david 126
					}
32 jpm 127
 
15 david 128
					// dans tous les cas on transmet la liste crée au rafraichissable en lui demandant de répandre les données car il est
129
					// le premier à les recevoir
130
 
151 david 131
					addToCache(critere, referentielNomData);
132
 
15 david 133
					r.rafraichir(referentielNomData,true);
32 jpm 134
 
15 david 135
				}
32 jpm 136
 
137
 
138
			}) ;
139
 
140
		} catch(RequestException e) {
141
 
151 david 142
		}
143
 
144
		} // fin else si pas de cache
32 jpm 145
 
15 david 146
	}
151 david 147
 
148
	  private void addToCache(String query, ListeReferentielNom result)	  {
149
		  cache.put(query.toLowerCase(),result);
150
	  }
151
 
152
	  private ListeReferentielNom getFromCache (String query) {
153
		  return (ListeReferentielNom) cache.get(query.toLowerCase());
154
	  }
155
 
156
 
157
 
15 david 158
}