| 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 |
}
|