Subversion Repositories eFlore/Applications.cel

Rev

Rev 2568 | 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;
239 aurelien 2
 
3
import org.tela_botanica.client.interfaces.Rafraichissable;
989 aurelien 4
import org.tela_botanica.client.modeles.objets.Configuration;
5
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
1293 aurelien 6
import org.tela_botanica.client.util.Util;
239 aurelien 7
 
8
import com.google.gwt.http.client.Request;
1918 aurelien 9
import org.tela_botanica.client.util.RequestBuilderWithCredentials;
239 aurelien 10
import com.google.gwt.http.client.RequestCallback;
11
import com.google.gwt.http.client.RequestException;
12
import com.google.gwt.http.client.Response;
13
import com.google.gwt.http.client.URL;
14
import com.google.gwt.json.client.JSONObject;
15
import com.google.gwt.json.client.JSONParser;
16
import com.google.gwt.json.client.JSONValue;
17
import com.google.gwt.user.client.Window;
18
 
2568 aurelien 19
public class InformationLocaliteDAO {
239 aurelien 20
 
21
	private final String NOM_SERVICE = "CoordSearch";
22
	private final String CODE_PAYS = "FR";
2558 aurelien 23
 
24
	// Ce DAO peut être fréquemment sollicité lors de l'utilisation de la carte
25
	// et peut empiler beaucoup de longues requête, ceci permet donc de les annuler facilement
26
	private static Request requeteEnCours = null;
253 aurelien 27
 
28
	Rafraichissable r = null;
29
 
2568 aurelien 30
	public InformationLocaliteDAO(Rafraichissable r) {
253 aurelien 31
		this.r = r;
239 aurelien 32
	}
33
 
2568 aurelien 34
	public void obtenirLocalitePlusProche(final Rafraichissable r, final double lng,
2558 aurelien 35
			final double lat) {
36
 
37
		annulerRequeteEnCours();
253 aurelien 38
 
39
		String adresseAppel = Configuration.getServiceBaseUrl() + "/"
2568 aurelien 40
				+ NOM_SERVICE + "?lat="+URL.encode("" + lat) + "&lon="+URL.encode("" + lng);
1918 aurelien 41
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, adresseAppel);
253 aurelien 42
 
239 aurelien 43
		try {
2558 aurelien 44
			requeteEnCours = rb.sendRequest(null, new RequestCallback() {
253 aurelien 45
 
1293 aurelien 46
				@Override
253 aurelien 47
				public void onError(Request request, Throwable exception) {
239 aurelien 48
					Window.alert(exception.getMessage());
2558 aurelien 49
					requeteEnCours = null;
239 aurelien 50
				}
253 aurelien 51
 
1293 aurelien 52
				@Override
253 aurelien 53
				public void onResponseReceived(Request request,
54
						Response response) {
751 aurelien 55
 
56
					EntiteGeographiqueObservation infos;
57
					String idLocalite = "";
2568 aurelien 58
					String nomLocalite = "";
2558 aurelien 59
					String pays = "";
253 aurelien 60
 
61
					if (response.getStatusCode() == Response.SC_BAD_REQUEST) {
239 aurelien 62
						Window.alert("Requete mal formée");
253 aurelien 63
					} else {
646 aurelien 64
 
65
						if(response.getText().equals("")) {
66
 
2568 aurelien 67
							infos = new EntiteGeographiqueObservation(idLocalite, nomLocalite, null, null);
646 aurelien 68
							infos.setLat(""+lat);
69
							infos.setLon(""+lng);
70
 
71
							r.rafraichir(infos, false);
72
						}
73
 
253 aurelien 74
						final JSONValue responseValue = JSONParser
75
								.parse(response.getText());
76
 
77
						if (responseValue.isObject() != null) {
266 aurelien 78
 
751 aurelien 79
							JSONObject objectRetour = responseValue.isObject();
80
 
81
							if(objectRetour.get("nom").isString() != null) {
2568 aurelien 82
								nomLocalite = objectRetour.get("nom").isString().stringValue();
253 aurelien 83
							}
84
 
2558 aurelien 85
							if(objectRetour.get("code_zone").isString() != null) {
86
								idLocalite = objectRetour.get("code_zone").isString().stringValue().substring(0, 2);
751 aurelien 87
							}
2558 aurelien 88
 
89
							if(objectRetour.get("code_pays").isString() != null) {
90
								pays = objectRetour.get("code_pays").isString().stringValue();
91
							}
239 aurelien 92
						}
93
					}
751 aurelien 94
 
2568 aurelien 95
					infos = new EntiteGeographiqueObservation(idLocalite, nomLocalite, null, null);
751 aurelien 96
					infos.setLat(""+lat);
97
					infos.setLon(""+lng);
2558 aurelien 98
					infos.setPays(pays);
751 aurelien 99
 
100
					r.rafraichir(infos, false);
253 aurelien 101
				}
239 aurelien 102
			});
253 aurelien 103
		} catch (RequestException e) {
239 aurelien 104
			Window.alert(e.getMessage());
105
		}
106
	}
107
 
2568 aurelien 108
	public void obtenirInfosLocalite(final Rafraichissable r,
109
			String valeurLocalite, String codeLoc) {
253 aurelien 110
 
2558 aurelien 111
		annulerRequeteEnCours();
258 aurelien 112
 
2558 aurelien 113
		codeLoc = codeLoc.replaceAll("000null", "*");
114
		codeLoc = codeLoc.replaceAll("\"", "");
115
 
2568 aurelien 116
		valeurLocalite = valeurLocalite.split(" \\([0-9][0-9]\\)")[0];
117
		valeurLocalite = valeurLocalite.replaceAll("000null", "*");
118
		valeurLocalite = valeurLocalite.replaceAll("\"", "");
253 aurelien 119
 
120
 
121
		String adresseAppel = Configuration.getServiceBaseUrl() + "/"
2568 aurelien 122
				+ NOM_SERVICE+"?zone="+ URL.encode(valeurLocalite);
2558 aurelien 123
 
124
		if(!codeLoc.trim().isEmpty()) {
125
			// Cas du code de département ou postal
126
			if(Util.estUnNombre(codeLoc)) {
2568 aurelien 127
				adresseAppel += "&code="+URL.encode(codeLoc)+"&pays="+URL.encode(CODE_PAYS);
2558 aurelien 128
			} else {
129
				//cas du code pays
2568 aurelien 130
				adresseAppel += "&pays="+URL.encode(codeLoc);
2558 aurelien 131
			}
132
 
133
		}
134
 
1918 aurelien 135
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, adresseAppel);
239 aurelien 136
 
137
		try {
2558 aurelien 138
			requeteEnCours = rb.sendRequest(null, new RequestCallback() {
253 aurelien 139
 
1293 aurelien 140
				@Override
239 aurelien 141
				public void onError(Request request, Throwable exception) {
253 aurelien 142
					Window.alert(exception.getMessage());
239 aurelien 143
				}
253 aurelien 144
 
1293 aurelien 145
				@Override
253 aurelien 146
				public void onResponseReceived(Request request,
147
						Response response) {
148
 
149
					if (response.getStatusCode() == Response.SC_BAD_REQUEST) {
150
						r.rafraichir("Impossible de géolocaliser cette observation", false);
1317 aurelien 151
					} else {
253 aurelien 152
						final JSONValue responseValue = JSONParser
153
								.parse(response.getText());
779 aurelien 154
 
253 aurelien 155
						if (responseValue.isObject() != null) {
266 aurelien 156
 
157
							EntiteGeographiqueObservation infos;
158
							Double lng = 0.0;
159
							Double lat = 0.0;
779 aurelien 160
 
161
							JSONObject objectRetour = responseValue.isObject();
266 aurelien 162
 
2568 aurelien 163
							String nomLocalite = Util.getValeurJsonOuVide(objectRetour, "nom");
2558 aurelien 164
							String idLocalite = Util.getValeurJsonOuVide(objectRetour, "code_zone");
1293 aurelien 165
							lat = Util.jsonNonNull(objectRetour,"lat") ? objectRetour.get("lat").isNumber().doubleValue(): 0.0;
166
							lng = Util.jsonNonNull(objectRetour,"lng") ? objectRetour.get("lng").isNumber().doubleValue(): 0.0;
2558 aurelien 167
							String pays = Util.getValeurJsonOuVide(objectRetour, "code_pays");
168
 
2568 aurelien 169
							infos = new EntiteGeographiqueObservation(idLocalite, nomLocalite, null, null);
266 aurelien 170
							infos.setLat(""+lat);
171
							infos.setLon(""+lng);
2558 aurelien 172
							infos.setPays(pays);
779 aurelien 173
 
266 aurelien 174
							r.rafraichir(infos, false);
1317 aurelien 175
						} else {
176
							EntiteGeographiqueObservation infos;
177
							String idLocalite = "";
2568 aurelien 178
							String nomLocalite = "";
1317 aurelien 179
 
2568 aurelien 180
							infos = new EntiteGeographiqueObservation(idLocalite, nomLocalite, null, null);
1317 aurelien 181
							infos.setLat("");
182
							infos.setLon("");
183
 
184
							r.rafraichir(infos, false);
239 aurelien 185
						}
186
					}
253 aurelien 187
				}
239 aurelien 188
			});
253 aurelien 189
		} catch (RequestException e) {
239 aurelien 190
			Window.alert(e.getMessage());
191
		}
192
	}
2558 aurelien 193
 
194
	public static void annulerRequeteEnCours() {
195
		if(requeteEnCours != null) {
196
			requeteEnCours.cancel();
197
			requeteEnCours = null;
198
		}
199
	}
239 aurelien 200
}