Subversion Repositories eFlore/Applications.cel

Rev

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