Subversion Repositories eFlore/Applications.del

Rev

Rev 2077 | Rev 2087 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2077 Rev 2078
1
package org.tela_botanica.del.client.services.rest;
1
package org.tela_botanica.del.client.services.rest;
2
 
2
 
3
import org.tela_botanica.del.client.config.Config;
3
import org.tela_botanica.del.client.config.Config;
4
import org.tela_botanica.del.client.modeles.AuthInfo;
4
import org.tela_botanica.del.client.modeles.AuthInfo;
5
import org.tela_botanica.del.client.modeles.Utilisateur;
5
import org.tela_botanica.del.client.modeles.Utilisateur;
6
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
6
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
7
import org.tela_botanica.del.client.services.rest.async.AuthCallback;
7
import org.tela_botanica.del.client.services.rest.async.AuthCallback;
8
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
8
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
9
import org.tela_botanica.del.client.services.rest.async.PHPCallback.ModeRequete;
9
import org.tela_botanica.del.client.services.rest.async.PHPCallback.ModeRequete;
10
import org.tela_botanica.del.client.services.RequestBuilderWithCredentials;
10
import org.tela_botanica.del.client.services.RequestBuilderWithCredentials;
-
 
11
import org.tela_botanica.del.client.utils.StringUtils;
11
 
12
 
12
import com.google.gwt.core.shared.GWT;
13
import com.google.gwt.core.shared.GWT;
13
import com.google.gwt.user.client.Window;
14
import com.google.gwt.user.client.Window;
-
 
15
import com.google.gwt.user.client.Timer;
14
 
16
 
15
public class UtilisateurServiceConcret implements UtilisateurService {
17
public class UtilisateurServiceConcret implements UtilisateurService {
16
	
18
	
17
	private String baseUrl;
19
	private String baseUrl;
18
	private String authBaseUrl;
20
	private String authBaseUrl;
-
 
21
 
-
 
22
	private static Timer rafraichisseurJeton = null;
19
	
23
	
20
	public UtilisateurServiceConcret() {
24
	public UtilisateurServiceConcret() {
21
		this(new Config());
25
		this(new Config());
22
	}
26
	}
23
	
27
	
24
	public UtilisateurServiceConcret(Config config) {
28
	public UtilisateurServiceConcret(Config config) {
25
		this.baseUrl = config.getUrl("serviceUtilisateursBaseUrl");
29
		this.baseUrl = config.getUrl("serviceUtilisateursBaseUrl");
26
		this.authBaseUrl = config.getUrl("serviceAuthBaseUrl");
30
		this.authBaseUrl = config.getUrl("serviceAuthBaseUrl");
27
	}
31
	}
28
 
32
 
29
	/**
33
	/**
30
	 * Connecte l'utilisateur en appelant l'annuaire (auth::connexion, SSO), puis enchaîne avec
34
	 * Connecte l'utilisateur en appelant l'annuaire (auth::connexion, SSO), puis enchaîne avec
31
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
35
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
32
	 */
36
	 */
33
	@Override
37
	@Override
34
	public void connecterUtilisateur(String login, String motDePasse, final UtilisateurCallback callback) {
38
	public void connecterUtilisateur(String login, String motDePasse, final UtilisateurCallback callback) {
35
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "connexion?login=" + login + "&password=" + motDePasse);
39
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "connexion?login=" + login + "&password=" + motDePasse);
36
		try {
40
		try {
37
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
41
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
38
			rb.sendRequest(null, new AuthCallback() {
42
			rb.sendRequest(null, new AuthCallback() {
39
				public void surErreur(String message) {
43
				public void surErreur(String message) {
40
					// merci, de rien, au revoir messieurs-dames
44
					// merci, de rien, au revoir messieurs-dames
41
					callback.surErreur("");
45
					callback.surErreur("");
42
				}
46
				}
43
				@Override
47
				@Override
44
				public void surRetour(AuthInfo objetRetour) {
48
				public void surRetour(AuthInfo objetRetour) {
45
					// Stockage du jeton
-
 
46
					Utilisateur.setJeton(objetRetour.token);
49
					gererRetourAuthInfo(objetRetour, callback);
47
					// Obtention de l'utilisateur final d'après le service de préférences
-
 
48
					obtenirUtilisateurSansAnnuaire(callback); // RequestBulledair passe le jeton dans les headers HTTP
-
 
49
				}
50
				}
50
			});
51
			});
51
		} catch (Exception e) {
52
		} catch (Exception e) {
52
			Window.alert("Exception : " + e.getMessage());
53
			Window.alert("Exception : " + e.getMessage());
53
		}
54
		}
54
	}
55
	}
55
 
56
 
56
	/**
57
	/**
57
	 * Déconnecte l'utilisateur en appelant l'annuaire (auth::deconnexion, SSO), puis enchaîne avec
58
	 * Déconnecte l'utilisateur en appelant l'annuaire (auth::deconnexion, SSO), puis enchaîne avec
58
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
59
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
59
	 */
60
	 */
60
	@Override
61
	@Override
61
	public void deconnecterUtilisateur(final UtilisateurCallback callback) {
62
	public void deconnecterUtilisateur(final UtilisateurCallback callback) {
62
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "deconnexion");
63
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "deconnexion");
63
		try {
64
		try {
64
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
65
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
65
			rb.sendRequest(null, new AuthCallback() {
66
			rb.sendRequest(null, new AuthCallback() {
66
				public void surErreur(String message) {
67
				public void surErreur(String message) {
67
					callback.surErreur("");
68
					callback.surErreur("");
68
				}
69
				}
69
				@Override
70
				@Override
70
				public void surRetour(AuthInfo objetRetour) {
71
				public void surRetour(AuthInfo objetRetour) {
71
					// Stockage du jeton, qui devrait être NULL (mais on sait jamais à l'avenir)
-
 
72
					Utilisateur.setJeton(objetRetour.token);
72
					gererRetourAuthInfo(objetRetour, callback);
73
					// Obtention du pseudo-utilisateur non connecté (id de session) d'après le service de préférences
-
 
74
					obtenirUtilisateurSansAnnuaire(callback);
-
 
75
				}
73
				}
76
			});
74
			});
77
		} catch (Exception e) {
75
		} catch (Exception e) {
78
			GWT.log("Exception : " + e.getMessage());
76
			GWT.log("Exception : " + e.getMessage());
79
		}
77
		}
80
	}
78
	}
81
 
79
 
82
	/**
80
	/**
83
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
81
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
84
	 * @param callback
82
	 * @param callback
85
	 */
83
	 */
86
	@Override
84
	@Override
87
	public void obtenirUtilisateur(UtilisateurCallback callback) {
85
	public void obtenirUtilisateur(UtilisateurCallback callback) {
88
		obtenirUtilisateur(callback, false);
86
		obtenirUtilisateur(callback, false);
89
	}
87
	}
90
 
88
 
91
	/**
89
	/**
92
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
90
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
93
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
91
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
94
	 * @param callback
92
	 * @param callback
95
	 */
93
	 */
96
	@Override
94
	@Override
97
	public void obtenirUtilisateur(final UtilisateurCallback callback, boolean ignorerAnnuaire) {
95
	public void obtenirUtilisateur(final UtilisateurCallback callback, boolean ignorerAnnuaire) {
98
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
96
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
99
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
97
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
100
		if (! ignorerAnnuaire) {
98
		if (! ignorerAnnuaire) {
101
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "identite");
99
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "identite");
102
			try {
100
			try {
103
				rb.sendRequest(null, new AuthCallback() {
101
				rb.sendRequest(null, new AuthCallback() {
104
					public void surErreur(String message) {
102
					public void surErreur(String message) {
105
						// Même si l'annuaire n'est pas content, on va chercher un profil utilisateur "anonyme"
103
						// Même si l'annuaire n'est pas content, on va chercher un profil utilisateur "anonyme"
106
						obtenirUtilisateurSansAnnuaire(callback);
104
						obtenirUtilisateurSansAnnuaire(callback);
107
					}
105
					}
108
					@Override
106
					@Override
109
					public void surRetour(AuthInfo objetRetour) {
107
					public void surRetour(AuthInfo objetRetour) {
110
						// Stockage du jeton rafraîchi
-
 
111
						Utilisateur.setJeton(objetRetour.token);
108
						gererRetourAuthInfo(objetRetour, callback);
112
						// Obtention de l'utilisateur final d'après le service de préférences
-
 
113
						obtenirUtilisateurSansAnnuaire(callback);
-
 
114
					}
109
					}
115
				});
110
				});
116
			} catch (Exception e) {
111
			} catch (Exception e) {
117
				// TODO: handle exception
112
				// TODO: handle exception
118
			}
113
			}
119
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
114
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
120
			obtenirUtilisateurSansAnnuaire(callback);
115
			obtenirUtilisateurSansAnnuaire(callback);
121
		}
116
		}
122
	}
117
	}
123
 
118
 
124
	/**
119
	/**
125
	 * Va chercher les infos de l'utilisateur sans vérifier l'identité auprès de l'annuaire
120
	 * Va chercher les infos de l'utilisateur sans vérifier l'identité auprès de l'annuaire
126
	 * @param callback
121
	 * @param callback
127
	 */
122
	 */
128
	public void obtenirUtilisateurSansAnnuaire(UtilisateurCallback callback) {
123
	public void obtenirUtilisateurSansAnnuaire(UtilisateurCallback callback) {
129
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/");
124
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/");
130
		try {
125
		try {
131
			rb.sendRequest(null, callback);
126
			rb.sendRequest(null, callback);
132
		} catch (Exception e) {
127
		} catch (Exception e) {
133
			// TODO: handle exception
128
			// TODO: handle exception
134
		}
129
		}
135
	}
130
	}
136
 
131
 
137
	@Override
132
	@Override
138
	public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback) {
133
	public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback) {
139
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/"+idUtilisateur+"/activite");
134
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/"+idUtilisateur+"/activite");
140
		try {
135
		try {
141
			rb.sendRequest(null, callback);
136
			rb.sendRequest(null, callback);
142
		} catch (Exception e) {
137
		} catch (Exception e) {
143
			// TODO: handle exception
138
			// TODO: handle exception
144
		}
139
		}
145
	}
140
	}
-
 
141
 
-
 
142
	/**
-
 
143
	 * Enregistre le jeton (potentiellement NULL), sa durée de vie, et appelle
-
 
144
	 * le service Del pour obtenir le profil utilisateur associé; lorsque le jeton
-
 
145
	 * n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
-
 
146
	 * périodique du jeton
-
 
147
	 * 
-
 
148
	 * @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
-
 
149
	 * @param callback
-
 
150
	 */
-
 
151
	protected void gererRetourAuthInfo(AuthInfo objetRetour, UtilisateurCallback callback) {
-
 
152
		// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
-
 
153
		Utilisateur.setJeton(objetRetour.token);
-
 
154
		Utilisateur.setDureeJeton(objetRetour.duration);
-
 
155
 
-
 
156
		// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
-
 
157
		if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
-
 
158
			if (rafraichisseurJeton == null) { // on sait jamais
-
 
159
				// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
-
 
160
				int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
-
 
161
				rafraichisseurJeton = new Timer() {
-
 
162
					@Override
-
 
163
					public void run() {
-
 
164
						// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
-
 
165
						// @TODO gérer le possible changement de profil / coordonnées de l'utilisateur
-
 
166
						// en cours de connexion
-
 
167
						obtenirUtilisateur(null);
-
 
168
					}
-
 
169
				};
-
 
170
				rafraichisseurJeton.scheduleRepeating(delaiRepetition);
-
 
171
			}
-
 
172
		} else {
-
 
173
			if (rafraichisseurJeton != null) { // on sait jamais non plus
-
 
174
				rafraichisseurJeton.cancel();
-
 
175
				rafraichisseurJeton = null;
-
 
176
			}
-
 
177
		}
-
 
178
 
-
 
179
		// Obtention de l'utilisateur final d'après le service de préférences
-
 
180
		obtenirUtilisateurSansAnnuaire(callback);
-
 
181
	}
146
 
182
 
147
}
183
}