Subversion Repositories eFlore/Applications.cel

Rev

Rev 989 | 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
 
1293 aurelien 66
	@Override
65 david 67
	public final void obtenirListeDonnees(final Rafraichissable r, final String critere) {
32 jpm 68
 
154 david 69
 
70
		ListeReferentielCommune referentielCommuneDataFromCache=null;
71
 
72
 
73
		// En cache ?
74
		if ((referentielCommuneDataFromCache=getFromCache(critere))!=null) {
75
			r.rafraichir(referentielCommuneDataFromCache,true);
76
	    }
77
 
78
		else {
79
 
80
 
81
 
82
 
254 aurelien 83
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl() + "/LocationSearch/" + URL.encodeComponent(critere));
32 jpm 84
 
85
		try {
86
 
87
			rb.sendRequest(null, new RequestCallback() {
88
 
1293 aurelien 89
				@Override
65 david 90
				public void onError(final Request request, final Throwable exception) {
32 jpm 91
					// TODO Auto-generated method stub
92
 
93
				}
94
 
1293 aurelien 95
				@Override
65 david 96
				public void onResponseReceived(final Request request,
97
						final Response response) {
32 jpm 98
 
1293 aurelien 99
					final ListeReferentielCommune referentielCommuneData;
100
					final JSONValue responseValue = JSONParser.parse(response.getText());
65 david 101
					JSONArray reponse = null;
1293 aurelien 102
 
32 jpm 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) {
113
								String commune = ((JSONString) communes.get(0)).stringValue();
114
								String departement  = ((JSONString) communes.get(1)).stringValue();
1293 aurelien 115
								ReferentielCommune com = new ReferentielCommune(commune, departement);
116
								referentielCommuneData.put(com.getCommune() + com.getDepartement(), com);
32 jpm 117
							}
118
						}
1293 aurelien 119
					} else {
65 david 120
						referentielCommuneData = new ListeReferentielCommune(0);
1293 aurelien 121
					}
154 david 122
					addToCache(critere, referentielCommuneData);
65 david 123
					r.rafraichir(referentielCommuneData, true);
124
 
32 jpm 125
				}
126
 
65 david 127
			});
32 jpm 128
 
129
		} catch (RequestException e) {
130
 
65 david 131
			e.printStackTrace();
32 jpm 132
		}
12 david 133
 
154 david 134
		} // Fin else si pas de cache
135
 
12 david 136
	}
154 david 137
 
138
	  private void addToCache(String query, ListeReferentielCommune result)	  {
139
		  cache.put(query.toLowerCase(),result);
140
	  }
141
 
142
	  private ListeReferentielCommune getFromCache (String query) {
1293 aurelien 143
		  return cache.get(query.toLowerCase());
154 david 144
	  }
145
 
146
 
147
 
12 david 148
}