Subversion Repositories eFlore/Applications.cel

Rev

Rev 1918 | 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;
2568 aurelien 8
import org.tela_botanica.client.modeles.objets.ListeReferentielLocalite;
9
import org.tela_botanica.client.modeles.objets.ReferentielLocalite;
12 david 10
import org.tela_botanica.client.observation.ObservationModele;
11
 
32 jpm 12
import com.google.gwt.http.client.Request;
1918 aurelien 13
import org.tela_botanica.client.util.RequestBuilderWithCredentials;
32 jpm 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
/**
2568 aurelien 24
 * DAO la liste des localites. Utilisation d'un cache pour eviter les requetes inutiles
12 david 25
 * @author David Delon
26
 *
27
 */
2568 aurelien 28
public class ListeReferentielLocaliteAsynchroneDAO implements FournisseurListe {
12 david 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
 
2568 aurelien 44
	private HashMap<String,ListeReferentielLocalite> cache = new HashMap();
154 david 45
 
46
 
47
 
48
	/**
65 david 49
	 *  Constructeur.
50
	 * @param obs : Modele
51
	 */
52
 
2568 aurelien 53
	public ListeReferentielLocaliteAsynchroneDAO(final ObservationModele obs) {
65 david 54
		this.observationModele = obs;
12 david 55
	}
56
 
57
 
58
	/**
2568 aurelien 59
	 * Envoie une requete au serveur jrest pour obtenir les localites  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
 
2568 aurelien 70
		ListeReferentielLocalite referentielLocaliteDataFromCache=null;
154 david 71
 
72
 
73
		// En cache ?
2568 aurelien 74
		if ((referentielLocaliteDataFromCache=getFromCache(critere))!=null) {
75
			r.rafraichir(referentielLocaliteDataFromCache,true);
154 david 76
	    }
77
 
78
		else {
1918 aurelien 79
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, Configuration.getServiceBaseUrl() + "/LocationSearch/" + URL.encodeComponent(critere));
1542 aurelien 80
			try {
81
 
82
				rb.sendRequest(null, new RequestCallback() {
83
 
84
					@Override
85
					public void onError(final Request request, final Throwable exception) {
86
						// TODO Auto-generated method stub
32 jpm 87
 
1542 aurelien 88
					}
89
 
90
					@Override
91
					public void onResponseReceived(final Request request,
92
							final Response response) {
32 jpm 93
 
2568 aurelien 94
						final ListeReferentielLocalite referentielLocaliteData;
1542 aurelien 95
						final JSONValue responseValue = JSONParser.parse(response.getText());
96
						JSONArray reponse = null;
97
 
98
						// si c'est un tableau
99
						if ((reponse = responseValue.isArray()) != null) {
100
 
2568 aurelien 101
							JSONArray localites;
1542 aurelien 102
							final int taillemax = reponse.size();
103
 
2568 aurelien 104
							referentielLocaliteData = new ListeReferentielLocalite(taillemax);
1542 aurelien 105
 
106
							for (int i = 0; i < taillemax; i++) {
2568 aurelien 107
								if ((localites = reponse.get(i).isArray()) != null) {
108
									String localite = ((JSONString) localites.get(0)).stringValue();
109
									String departement  = ((JSONString) localites.get(1)).stringValue();
110
									ReferentielLocalite com = new ReferentielLocalite(localite, departement);
111
									referentielLocaliteData.put(com.getLocalite() + com.getCodeLocalite(), com);
1542 aurelien 112
								}
113
							}
114
						} else {
2568 aurelien 115
							referentielLocaliteData = new ListeReferentielLocalite(0);
1542 aurelien 116
						}
2568 aurelien 117
						addToCache(critere, referentielLocaliteData);
118
						r.rafraichir(referentielLocaliteData, true);
32 jpm 119
 
1542 aurelien 120
					}
65 david 121
 
1542 aurelien 122
				});
32 jpm 123
 
1542 aurelien 124
			} catch (RequestException e) {
125
				e.printStackTrace();
126
			}
154 david 127
		} // Fin else si pas de cache
12 david 128
	}
154 david 129
 
1542 aurelien 130
	/**
131
	 * Fonction à implémenter dans le futur, lors de l'utilisation de plusieurs
132
	 * référentiels de localité
133
	 */
134
	@Override
135
	public void obtenirListeDonnees(Rafraichissable r, String referentiel, String critere) {
136
		// TODO Auto-generated method stub
137
	}
138
 
2568 aurelien 139
	private void addToCache(String query, ListeReferentielLocalite result)	  {
1542 aurelien 140
		cache.put(query.toLowerCase(),result);
141
	}
154 david 142
 
2568 aurelien 143
	private ListeReferentielLocalite getFromCache (String query) {
1542 aurelien 144
		return cache.get(query.toLowerCase());
145
	}
12 david 146
}