Subversion Repositories eFlore/Applications.cel

Rev

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