Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
12 david 1
package org.tela_botanica.client.modeles;
2
 
154 david 3
import java.util.HashMap;
4
 
12 david 5
import org.tela_botanica.client.interfaces.FournisseurListe;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.observation.ObservationModele;
8
 
32 jpm 9
import com.google.gwt.http.client.Request;
10
import com.google.gwt.http.client.RequestBuilder;
11
import com.google.gwt.http.client.RequestCallback;
12
import com.google.gwt.http.client.RequestException;
13
import com.google.gwt.http.client.Response;
12 david 14
import com.google.gwt.json.client.JSONArray;
15
import com.google.gwt.json.client.JSONParser;
16
import com.google.gwt.json.client.JSONString;
17
import com.google.gwt.json.client.JSONValue;
18
 
19
/**
154 david 20
 * DAO la liste des communes. Utilisation d'un cache pour eviter les requetes inutiles
12 david 21
 * @author David Delon
22
 *
23
 */
24
public class ListeReferentielCommuneAsynchroneDAO implements FournisseurListe {
25
 
26
 
27
 
28
 
29
	/**
65 david 30
	 * Le modèle associé au DAO.
12 david 31
	 */
65 david 32
	private ObservationModele observationModele = null;
12 david 33
 
34
 
65 david 35
	/**
154 david 36
	 * Cache
37
	 *
38
	 */
39
 
40
	private HashMap<String,ListeReferentielCommune> cache = new HashMap();
41
 
42
 
43
 
44
	/**
65 david 45
	 *  Constructeur.
46
	 * @param obs : Modele
47
	 */
48
 
49
	public ListeReferentielCommuneAsynchroneDAO(final ObservationModele obs) {
50
		this.observationModele = obs;
12 david 51
	}
52
 
53
 
54
	/**
55
	 * Envoie une requete au serveur jrest pour obtenir les communes  correspondant
65 david 56
	 * à des critères données en paramètres.
12 david 57
	 * @param r le rafraichissable qui demande la mise à jour
65 david 58
	 * @param critere un string contenant le terme a rechercher
12 david 59
	 */
60
 
61
 
65 david 62
	public final void obtenirListeDonnees(final Rafraichissable r, final String critere) {
32 jpm 63
 
154 david 64
 
65
		ListeReferentielCommune referentielCommuneDataFromCache=null;
66
 
67
 
68
		// En cache ?
69
		if ((referentielCommuneDataFromCache=getFromCache(critere))!=null) {
70
			r.rafraichir(referentielCommuneDataFromCache,true);
71
	    }
72
 
73
		else {
74
 
75
 
76
 
77
 
65 david 78
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, observationModele.getConfig().getServiceBaseUrl() + "/LocationSearch/" + critere);
32 jpm 79
 
80
		try {
81
 
82
			rb.sendRequest(null, new RequestCallback() {
83
 
65 david 84
				public void onError(final Request request, final Throwable exception) {
32 jpm 85
					// TODO Auto-generated method stub
86
 
87
				}
88
 
65 david 89
				public void onResponseReceived(final Request request,
90
						final Response response) {
32 jpm 91
 
65 david 92
					final ListeReferentielCommune referentielCommuneData;
32 jpm 93
 
94
					final JSONValue responseValue = JSONParser.parse(response.getText());
95
 
65 david 96
					JSONArray reponse = null;
32 jpm 97
 
98
 
99
					// si c'est un tableau
65 david 100
					if ((reponse = responseValue.isArray()) != null) {
32 jpm 101
 
102
						JSONArray communes;
103
						final int taillemax = reponse.size();
104
 
105
						referentielCommuneData = new ListeReferentielCommune(taillemax);
106
 
107
						for (int i = 0; i < taillemax; i++) {
65 david 108
							if ((communes = reponse.get(i).isArray()) != null) {
32 jpm 109
 
65 david 110
								String commune = ((JSONString) communes.get(0)).stringValue();
111
								String departement  = ((JSONString) communes.get(1)).stringValue();
32 jpm 112
 
113
 
65 david 114
								ReferentielCommune com = new ReferentielCommune(commune, departement);
12 david 115
 
65 david 116
								referentielCommuneData.put(com.getCommune() + com.getDepartement(), com);
32 jpm 117
 
118
							}
119
						}
120
					} else {
121
 
65 david 122
						referentielCommuneData = new ListeReferentielCommune(0);
32 jpm 123
 
124
					}
125
					// dans tous les cas on transmet la liste crée au rafraichissable en lui demandant de répandre les données car il est
65 david 126
					// le premier à les recevoir
32 jpm 127
 
154 david 128
					addToCache(critere, referentielCommuneData);
65 david 129
					r.rafraichir(referentielCommuneData, true);
130
 
32 jpm 131
				}
132
 
65 david 133
			});
32 jpm 134
 
135
		} catch (RequestException e) {
136
 
65 david 137
			e.printStackTrace();
32 jpm 138
		}
12 david 139
 
154 david 140
		} // Fin else si pas de cache
141
 
12 david 142
	}
154 david 143
 
144
	  private void addToCache(String query, ListeReferentielCommune result)	  {
145
		  cache.put(query.toLowerCase(),result);
146
	  }
147
 
148
	  private ListeReferentielCommune getFromCache (String query) {
149
		  return (ListeReferentielCommune) cache.get(query.toLowerCase());
150
	  }
151
 
152
 
153
 
12 david 154
}