Subversion Repositories eFlore/Applications.coel

Rev

Rev 1732 | Rev 1908 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1732 Rev 1906
Line 1... Line 1...
1
package org.tela_botanica.client.modeles;
1
package org.tela_botanica.client.modeles;
Line -... Line 2...
-
 
2
 
-
 
3
import java.util.HashMap;
-
 
4
 
2
 
5
import org.tela_botanica.client.Coel;
3
import org.tela_botanica.client.RegistreId;
6
import org.tela_botanica.client.RegistreId;
4
import org.tela_botanica.client.http.JsonRestRequestBuilder;
7
import org.tela_botanica.client.http.JsonRestRequestBuilder;
5
import org.tela_botanica.client.http.JsonRestRequestCallback;
8
import org.tela_botanica.client.http.JsonRestRequestCallback;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
9
import org.tela_botanica.client.interfaces.Rafraichissable;
Line 7... Line 10...
7
import org.tela_botanica.client.util.UtilDAO;
10
import org.tela_botanica.client.util.UtilDAO;
8
 
11
 
-
 
12
import com.extjs.gxt.ui.client.Registry;
9
import com.extjs.gxt.ui.client.Registry;
13
import com.google.gwt.http.client.Request;
10
import com.google.gwt.core.client.GWT;
14
import com.google.gwt.http.client.Response;
-
 
15
import com.google.gwt.json.client.JSONArray;
-
 
16
import com.google.gwt.json.client.JSONBoolean;
11
import com.google.gwt.json.client.JSONArray;
17
import com.google.gwt.json.client.JSONNumber;
12
import com.google.gwt.json.client.JSONBoolean;
18
import com.google.gwt.json.client.JSONObject;
-
 
19
import com.google.gwt.json.client.JSONString;
Line 13... Line 20...
13
import com.google.gwt.json.client.JSONString;
20
import com.google.gwt.json.client.JSONValue;
14
import com.google.gwt.json.client.JSONValue;
21
import com.google.gwt.user.client.Timer;
15
 
22
 
16
/**
23
/**
17
 * Modele DAO, specifique, permettant la validation, l'acces aux donnees distantes et la présentation des donnees en retour
24
 * Modele DAO, specifique, permettant la validation, l'acces aux donnees distantes et la présentation des donnees en retour
18
 * 
25
 * 
Line 19... Line 26...
19
 */
26
 */
20
public class UtilisateurAsyncDao {
27
public class UtilisateurAsyncDao {
-
 
28
	private static final String SERVICE_NOM = "CoelUtilisateur";
-
 
29
	
Line 21... Line 30...
21
	private static final String SERVICE_NOM = "CoelUtilisateur";
30
	private Utilisateur utilisateur = null;
22
	
31
	private Rafraichissable vueARafraichir = null;
23
	private Utilisateur utilisateur = null;
32
 
24
	private Rafraichissable vueARafraichir = null;
33
	private static Timer rafraichisseurJeton = null;
25
	
34
	
26
	/**
35
	/**
27
	 * Constructeur
36
	 * Constructeur
28
	 * @param retour : méthode appellée en retour d'appel. 
37
	 * @param retour : méthode appellée en retour d'appel. 
29
	 */
38
	 */
30
	public UtilisateurAsyncDao(Rafraichissable vueARafraichirCourrante) {
39
	public UtilisateurAsyncDao(Rafraichissable vueARafraichirCourrante) {
31
		vueARafraichir = vueARafraichirCourrante;
40
		vueARafraichir = vueARafraichirCourrante;
-
 
41
		utilisateur = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
-
 
42
	}
-
 
43
 
-
 
44
	/**
32
		utilisateur = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
45
	 * Recupere des informations d'authentification à partir du JSON renvoyé par les
33
	}
46
	 * services Auth de l'annuaire (SSO)
-
 
47
	 * 
34
		
48
	 * @param valeurJson
-
 
49
	 * @return AuthInfo
35
	/**
50
	 */
-
 
51
	public static AuthInfo parserAuthJson(JSONValue valeurJson) {
-
 
52
		AuthInfo authInfo = new AuthInfo();
-
 
53
		JSONObject authJson = valeurJson.isObject();
-
 
54
 
-
 
55
		JSONValue erreurJSON = authJson.get("error");
36
	 * Méthode de classe d'appel du service des gestion d'identification. 
56
		// test si erreur
-
 
57
		if (erreurJSON != null) {
-
 
58
			JSONString erreur = erreurJSON.isString();
-
 
59
			if (erreur != null) {
37
	 */
60
				authInfo.error = erreur.stringValue();
-
 
61
			} else {
-
 
62
				authInfo.error = "erreur d'authentification";
-
 
63
			}
-
 
64
		} else {
-
 
65
			boolean session = authJson.get("session").isBoolean().booleanValue();
-
 
66
			authInfo.session = session;
38
	public void getEtatUtilisateur() {
67
			// test si session ouverte
39
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM);
68
			if (session) {
-
 
69
				JSONValue tokenJson = authJson.get("token");
40
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
70
				String token = null;
-
 
71
				// protection paranoïaque
-
 
72
				if (tokenJson != null) {
41
			@Override
73
					JSONString tokenString = tokenJson.isString();
42
			public void surReponse(JSONValue responseValue) {
74
					if (tokenString != null) {
43
				if (responseValue.isArray() != null) {
75
						token = tokenString.stringValue();
-
 
76
					}
-
 
77
				}
44
					final JSONArray reponse = responseValue.isArray();
78
				String tokenId = authJson.get("token_id").isString().stringValue();
45
					// Identifiant utilisateur ou identifiant de session si non identifié
79
				int duration = (int) authJson.get("duration").isNumber().doubleValue();
-
 
80
				JSONValue lastModifJson = authJson.get("last_modif");
-
 
81
 
46
					String login = ((JSONString) reponse.get(2)).stringValue();
82
				authInfo.token = token;
-
 
83
				authInfo.tokenId = tokenId;
-
 
84
				authInfo.duration = duration;
-
 
85
				// test si lastModif est null
47
					// Drapeau leve si utilisateur deja identifié
86
				if (lastModifJson != null) {
48
					boolean identifie = ((JSONBoolean) reponse.get(3)).booleanValue();
87
					JSONNumber lastModif = lastModifJson.isNumber();
-
 
88
					if (lastModif != null) {
-
 
89
						authInfo.lastModif = (int) lastModif.doubleValue();
-
 
90
					}
-
 
91
				}
-
 
92
			}
-
 
93
		}
-
 
94
		
-
 
95
		return authInfo;
-
 
96
	}
-
 
97
 
-
 
98
	/**
-
 
99
	 * Enregistre le jeton (potentiellement NULL), sa durée de vie; appelle le service Coel pour
-
 
100
	 * obtenir les données de l'utilisateur relatives à l'application; lorsque le jeton
-
 
101
	 * n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
-
 
102
	 * périodique du jeton
-
 
103
	 * 
-
 
104
	 * @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
-
 
105
	 */
-
 
106
	protected void gererRetourAuthInfo(AuthInfo objetRetour) {
-
 
107
		// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
-
 
108
		Utilisateur.setJeton(objetRetour.token);
-
 
109
		Utilisateur.setDureeJeton(objetRetour.duration);
-
 
110
 
-
 
111
		// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
-
 
112
		if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
-
 
113
			if (rafraichisseurJeton == null) { // on sait jamais
-
 
114
				// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
-
 
115
				int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
-
 
116
				delaiRepetition = 10000; // debug
-
 
117
				rafraichisseurJeton = new Timer() {
-
 
118
					@Override
-
 
119
					public void run() {
-
 
120
						//Coel.LogVersFirebug("rafraichir utilisateur");
-
 
121
						// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
-
 
122
						getEtatUtilisateur();
-
 
123
					}
-
 
124
				};
-
 
125
				rafraichisseurJeton.scheduleRepeating(delaiRepetition);
-
 
126
			}
49
					utilisateur.setIdentification(identifie);
127
		} else {
-
 
128
			if (rafraichisseurJeton != null) { // on sait jamais non plus
-
 
129
				rafraichisseurJeton.cancel();
-
 
130
				rafraichisseurJeton = null;
-
 
131
			}
50
					utilisateur.setLogin(login);
132
		}
Line 51... Line 133...
51
					vueARafraichir.rafraichir(utilisateur);
133
 
52
				}
134
		// Obtention de l'utilisateur final d'après le service de préférences
53
			}
135
		//Coel.LogVersFirebug("va chercher utilisateur Coel");
54
		});
136
		getEtatUtilisateurSansAnnuaire();
55
	}
137
	}
56
 
138
 
57
	/**
-
 
58
	 * Méthode déconnectant un utilisateur de l'application. 
139
	/**
59
	 * @param identifiant de l'utilisateur à déconnecter.
140
	 * Méthode déconnectant un utilisateur de l'application. 
60
	 */
141
	 * @param identifiant de l'utilisateur à déconnecter.
61
	public void deconnecterUtilisateur() {
142
	 */
62
		String[] parametres = {utilisateur.getId()};
-
 
63
		
143
	public void deconnecterUtilisateur() {
64
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres);
-
 
65
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
144
		//Coel.LogVersFirebug("deconnexion");
66
			@Override
-
 
67
			public void surReponse(JSONValue responseValue) {
-
 
68
				if (responseValue.isArray() != null) {
-
 
69
					final JSONArray reponse = responseValue.isArray();
-
 
70
					// Identifiant utilisateur ou identifiant de session si non identifié
-
 
71
					String id = ((JSONString) reponse.get(1)).stringValue();
-
 
72
					// Drapeau levé si l'utilisateur est déjà identifié
145
		final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("deconnexion", null);
73
					boolean identifie = ((JSONBoolean) reponse.get(2)).booleanValue();
-
 
74
					
-
 
75
					// Nous réinitialisons l'utilisateur
146
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
76
					utilisateur = new Utilisateur(id, identifie);
147
			@Override
77
					
148
			public void surReponse(JSONValue responseValue) {
Line 78... Line 149...
78
					GWT.log(utilisateur.toString(), null);
149
				//Coel.LogVersFirebug(responseValue.toString());
79
					vueARafraichir.rafraichir(utilisateur);
150
				AuthInfo info = parserAuthJson(responseValue);
80
				}
-
 
81
			}
151
				gererRetourAuthInfo(info);
82
		});
152
			}
-
 
153
		});
-
 
154
	}
83
	}
155
	
84
	
-
 
-
 
156
	/**
85
	/**
157
	 * Méthode connectant un utilisateur à l'application
Line 86... Line 158...
86
	 * Méthode connectant un utilisateur à l'application. 
158
	 */
87
	 * @param Utilisateur l'utilisateur courant.
159
	public void connecterUtilisateur() {
88
	 */
160
		HashMap<String, String> parametres = new HashMap<String, String>();
-
 
161
		parametres.put("login", utilisateur.getLogin());
-
 
162
		parametres.put("password", utilisateur.getMotDePasse());
-
 
163
		//Coel.LogVersFirebug("connexion");
-
 
164
		final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("connexion", parametres);
-
 
165
		
-
 
166
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
-
 
167
			@Override
-
 
168
			public void surReponse(JSONValue responseValue) {
-
 
169
				AuthInfo info = parserAuthJson(responseValue);
-
 
170
				gererRetourAuthInfo(info);
-
 
171
			}
-
 
172
		});
-
 
173
	}
-
 
174
 
-
 
175
	/**
-
 
176
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
-
 
177
	 */
-
 
178
	public void getEtatUtilisateur() {
-
 
179
		getEtatUtilisateur(false);
-
 
180
	}
-
 
181
 
-
 
182
	/**
-
 
183
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
-
 
184
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
-
 
185
	 */
-
 
186
	public void getEtatUtilisateur(boolean ignorerAnnuaire) {
-
 
187
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
89
	public void connecterUtilisateur() {
188
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
-
 
189
		if (! ignorerAnnuaire) {
-
 
190
			//Coel.LogVersFirebug("get état");
-
 
191
			// sans header Authorization, sinon une déconnexion depuis une autre appli ne sera pas
-
 
192
			// prise en compte et le jeton sera rafraîchi indéfiniment
-
 
193
			final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("identite", null, false);
-
 
194
			rb.envoyerRequete(null, new JsonRestRequestCallback() {
-
 
195
				@Override
-
 
196
				public void surReponse(JSONValue responseValue) {
-
 
197
					AuthInfo info = parserAuthJson(responseValue);
-
 
198
					gererRetourAuthInfo(info);
-
 
199
				}
-
 
200
				@Override
-
 
201
				public void onErrorHTTP(Request request, Response reponse) {
-
 
202
					// Si on a été déconnecté, on va chercher un profil utilisateur "anonyme" et
-
 
203
					// on avertit l'interface
-
 
204
					gererRetourAuthInfo(new AuthInfo());
-
 
205
				}
-
 
206
			});
-
 
207
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
-
 
208
			getEtatUtilisateurSansAnnuaire();
-
 
209
		}
-
 
210
	}
-
 
211
 
-
 
212
	/**
-
 
213
	 * Va chercher les infos de l'utilisateur Coel sans vérifier l'identité auprès de l'annuaire;
90
		String[] parametres = {utilisateur.getLogin(), utilisateur.getMotDePasse()};
214
	 * transmet un jeton SSO à chaque fois pour que le service se base dessus
-
 
215
	 */
-
 
216
	public void getEtatUtilisateurSansAnnuaire() {
-
 
217
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM);
-
 
218
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
-
 
219
			@Override
-
 
220
			public void surReponse(JSONValue responseValue) {
-
 
221
				//Coel.LogVersFirebug("réponse reçue");
-
 
222
				JSONArray reponse = responseValue.isArray();
-
 
223
				if (reponse != null) {
91
		
224
					// Identifiant utilisateur ou identifiant de session si non identifié
92
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres);
225
					String login = ((JSONString) reponse.get(1)).stringValue();
93
		
226
 
94
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
227
					// Drapeau leve si utilisateur deja identifié
95
			@Override
228
					boolean identifie = ((JSONBoolean) reponse.get(2)).booleanValue();
96
			public void surReponse(JSONValue responseValue) {
229
 
97
				if (responseValue.isArray() != null) {
230
					utilisateur.setIdentification(identifie);
98
					final JSONArray reponse = responseValue.isArray();
231
					utilisateur.setLogin(login);
99
					
232
 
-
 
233
					//Ajout des informations licence
-
 
234
					if (reponse.get(0).isString() != null)	{
100
					//Ajout des informations licence
235
						utilisateur.setLicence(reponse.get(0).isString().stringValue());
-
 
236
					} else {
-
 
237
						utilisateur.setLicence("");						
-
 
238
					}
101
					if (reponse.get(0).isString() != null)	{
239
 
102
						utilisateur.setLicence(reponse.get(0).isString().stringValue());
240
					//Coel.LogVersFirebug("Utilisateur CoeL chargé !!");
103
					} else {
-
 
104
						utilisateur.setLicence("");						
241
					//Coel.LogVersFirebug("id: " + identifie + ", login: " + login + ", licence: " + utilisateur.getLicence());
105
					}
242
					//Coel.LogVersFirebug("Taille réponse:" + reponse.size());
106
					
243
 
107
					if (reponse.size() > 0) {
-
 
108
						
-
 
109
						// Identifiant de l'utilisateur ou identifiant de session si non identifié
244
					// Utilisateur connecté (non anonyme)
110
						utilisateur.setId(((JSONString) reponse.get(1)).stringValue());
245
					if (reponse.size() > 3) {
111
					
246
						//Coel.LogVersFirebug("Utilisateur identifié, on charge plus de trucs !");
-
 
247
						// Identifiant de l'utilisateur ou identifiant de session si non identifié
-
 
248
						String idUtilisateur = ((JSONString) reponse.get(1)).stringValue();
112
						// Drapeau levé si l'utilisateur est déjà identifié
249
						//Coel.LogVersFirebug("ID utilisateur: " + idUtilisateur);
113
						utilisateur.setIdentification(((JSONBoolean) reponse.get(2)).booleanValue());
250
						utilisateur.setId(idUtilisateur);
114
					
251
 
115
						// Plus de deux valeurs, l'utilisateur est identifié nous récupérons des données supplémentaires
252
						// Nom complet de l'utilisateur
-
 
253
						if (reponse.get(3).isString() != null) {
-
 
254
							String nomComplet = ((JSONString) reponse.get(3)).stringValue();
116
						if (reponse.size() > 3) {
255
							//Coel.LogVersFirebug("Nom complet: " + nomComplet);
117
							// Nom complet de l'utilisateur
-
 
118
							if (reponse.get(3).isString() != null) {
256
							utilisateur.setNomComplet(nomComplet);
119
								utilisateur.setNomComplet(((JSONString) reponse.get(3)).stringValue());
257
						}
120
							}
258
						// Prénom de l'utilisateur
-
 
259
						if (reponse.get(4).isString() != null) {
-
 
260
							String prenom = ((JSONString) reponse.get(4)).stringValue();
121
							// Prénom de l'utilisateur
261
							utilisateur.setPrenom(prenom);
122
							if (reponse.get(4).isString() != null) {
-
 
123
								utilisateur.setPrenom(((JSONString) reponse.get(4)).stringValue());
262
							//Coel.LogVersFirebug("Prénom: " + prenom);
124
							}
263
						}
125
							
264
						// Nom de l'utilisateur
126
							// Nom de l'utilisateur
265
						if (reponse.get(5).isString() != null) {
127
							if (reponse.get(5).isString() != null) {
-
 
-
 
266
							String nom = ((JSONString) reponse.get(5)).stringValue();
128
								utilisateur.setNom(((JSONString) reponse.get(5)).stringValue());
267
							utilisateur.setNom(nom);
129
							}
-
 
130
							
268
							//Coel.LogVersFirebug("Nom: " + nom);
-
 
269
						}
-
 
270
						// Paramètre => was ist das ?
-
 
271
						if (reponse.get(6).isString() != null) {
131
							// Paramètres
272
							String parametre = ((JSONString) reponse.get(6)).stringValue();
132
							if (reponse.get(6).isString() != null) {
273
							utilisateur.setParametre(parametre);
133
								utilisateur.setParametre(((JSONString) reponse.get(6)).stringValue());
274
							//Coel.LogVersFirebug("Paramètre: " + parametre);
134
							}
275
						}
135
							
276
					}
136
						}
277
 
-
 
278
					//Coel.LogVersFirebug("Rafraîchissement vue");
137
						vueARafraichir.rafraichir(utilisateur);
279
					vueARafraichir.rafraichir(utilisateur);
138
					}
280
				}
139
				}
281
			}
Line 140... Line 282...
140
			}
282
		});
141
		});
283
	}