4A Server -  2.0
 All Classes Namespaces Files Functions Variables Enumerator
EditUser.java
Go to the documentation of this file.
1 /*
2  * Project: Server for annotations sharing
3  * Author: Ing. Jaroslav Dytrych idytrych@fit.vutbr.cz
4  * File: EditUser.java
5  * Description: Backbean for pages for adding, editing and deleting of users
6  */
7 
8 /**
9  * @file EditUser.java
10  *
11  * @brief Backbean for adding, editing and deleting of users
12  */
13 
14 package cz.vutbr.fit.knot.annotations.web;
15 
23 import java.io.Serializable;
24 import java.security.MessageDigest;
25 import java.security.NoSuchAlgorithmException;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.ListIterator;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
31 import javax.faces.bean.ManagedBean;
32 import javax.faces.bean.ViewScoped;
33 import javax.faces.component.html.HtmlDataTable;
34 import javax.persistence.EntityManager;
35 import javax.persistence.EntityTransaction;
36 
37 /**
38  * Backbean for pages for adding, editing and deleting of users
39  *
40  * @brief Backbean for adding, editing and deleting of users
41  * @author idytrych
42  */
43 @ManagedBean
44 @ViewScoped
45 public class EditUser implements Serializable {
46  /**
47  * Value of login field in form
48  */
49  private String login = null;
50  /**
51  * Value of password field in form
52  */
53  private String password = null;
54  /**
55  * Value of password control field in form
56  */
57  private String passwordControl = null;
58  /**
59  * Value of user full name field in form
60  */
61  private String name = null;
62  /**
63  * Value of email field in form
64  */
65  private String email = null;
66  /**
67  * External system from which user come
68  */
69  private String comeFrom = null;
70  /**
71  * Error message displayed in form
72  */
73  private String errorMessage = "";
74  /**
75  * Table with user groups of given user
76  */
77  private HtmlDataTable listTable;
78  /**
79  * User group selected in the table
80  */
82  /**
83  * Edited user or user to be deleted
84  */
85  private User user = null;
86 
87  /**
88  * Constructor
89  */
90  public EditUser() {
91  }
92 
93  /**
94  * Action listener for save button in the page for editing of the user
95  *
96  * @return Returns page outcome (identificator of next page or null to stay here)
97  */
98  public String btnSaveAction() {
99  if(!SessionManager.getSession().isLoggedIn()){
100  SessionManager.getSession().setFormBackup(null);
101  SessionManager.getSession().setEditedUser(null);
102  return "login";
103  }
104 
105  boolean errorOccurred = false;
106  errorMessage = "";
107  if (login.isEmpty()) {
108  errorMessage = errorMessage + MessageProvider.getMessage("loginCantBeEmpty") + " ";
109  errorOccurred = true;
110  }
111  if (!(password == null ? passwordControl == null : password.equals(passwordControl))) {
112  errorMessage = errorMessage + MessageProvider.getMessage("passwordsMustMatch") + " ";
113  errorOccurred = true;
114  }
115  if (name.isEmpty()) { // if name is empty
116  errorMessage = errorMessage + MessageProvider.getMessage("fullNameCantBeEmpty") + " ";
117  errorOccurred = true;
118  }
119  if (errorOccurred) {
120  errorMessage = MessageProvider.getMessage("error") + " " + errorMessage;
121  return null;
122  }
123 
124  // update user data
125  user.setLogin(login);
126  user.setName(name);
127  user.setEmail(email);
128  user.setComeFrom(comeFrom);
129  if (!password.isEmpty()) {
130  String hash = null;
131  try {
132  MessageDigest md5 = MessageDigest.getInstance("MD5");
133  md5.update(password.getBytes());
134  hash = MessageProcessor.getHexString(md5.digest());
135  } catch (NoSuchAlgorithmException ex) {
136  hash = password;
137  }
138  user.setPassword(hash);
139  }
140  // persist changes
141  User saved = (User) AppBean.getPersistenceManager().saveEntityChanges(user);
142  if (saved == null) {
143  errorMessage = MessageProvider.getMessage("changesNSDatabaseFailure");
145  String msg = "Persisting of changes in the user account failed.";
146  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg);
147  }
148  return null;
149  } else { // if changes was successfully saved
150  user = saved;
151  }
152 
153  AppBean.refreshUsersInSessions(user); // refreshes data in sessions
154 
155  SessionManager.getSession().setFormBackup(null);
156  SessionManager.getSession().setEditedUser(null);
157  return "users";
158  } // btnSaveAction()
159 
160  /**
161  * Action listener for seve button on page for adding new users
162  *
163  * @return Returns page outcome (identificator of next page or null to stay here)
164  */
165  public String btnSaveNewAction() {
166  if(!SessionManager.getSession().isLoggedIn()){
167  SessionManager.getSession().setFormBackup(null);
168  SessionManager.getSession().setEditedUser(null);
169  return "login";
170  }
171 
172  boolean errorOccurred = false;
173  errorMessage = "";
174  if (login.isEmpty()) {
175  errorMessage = errorMessage + MessageProvider.getMessage("loginCantBeEmpty") + " ";
176  errorOccurred = true;
177  }
178  if (password.isEmpty()) {
179  errorMessage = errorMessage + MessageProvider.getMessage("passwordCantBeEmpty") + " ";
180  errorOccurred = true;
181  }
182  if (!(password == null ? passwordControl == null : password.equals(passwordControl))) {
183  errorMessage = errorMessage + MessageProvider.getMessage("passwordsMustMatch") + " ";
184  errorOccurred = true;
185  }
186  if (name.isEmpty()) { // if name is empty
187  errorMessage = errorMessage + MessageProvider.getMessage("fullNameCantBeEmpty") + " ";
188  errorOccurred = true;
189  }
190  if (errorOccurred) {
191  errorMessage = MessageProvider.getMessage("error") + " " + errorMessage;
192  return null;
193  }
194 
195  // create hash of password
196  String hash = null;
197  try {
198  MessageDigest md5 = MessageDigest.getInstance("MD5");
199  md5.update(password.getBytes());
200  hash = MessageProcessor.getHexString(md5.digest());
201  } catch (NoSuchAlgorithmException ex) {
202  hash = password;
203  }
204 
205  user = new User(login, name, email, hash); // create new user
206  user.setComeFrom(comeFrom);
207 
208  // persist new user
209  if (AppBean.getPersistenceManager().persistEntity(user)) {
210  errorMessage = MessageProvider.getMessage("newuserNSDatabaseFailure");
212  String msg = "Persisting of new user account failed.";
213  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg);
214  }
215  return null;
216  }
217 
218  Object[] params = {"login",login};
219  @SuppressWarnings("unchecked")
220  List<User> userList = AppBean.getPersistenceManager().queryDB("User.findByLogin",params);
221  if(userList != null) {
222  String resultError = loadDefaultSettings(userList.get(0));
223 
224  if(resultError != null){
225  errorMessage = resultError;
226  return null;
227  }
228  }
229 
230  SessionManager.getSession().setFormBackup(null);
231  SessionManager.getSession().setEditedUser(null);
232  return "users";
233  } // btnSaveNewAction()
234 
235  /**
236  * Action listener for cancel button
237  *
238  * @return Returns page outcome (identificator of next page or null to stay here)
239  */
240  public String btnCancelAction() {
241  SessionManager.getSession().setFormBackup(null);
242  SessionManager.getSession().setEditedUser(null); // clean up variable in session
243  if(!SessionManager.getSession().isLoggedIn()){
244  return "login";
245  }else return "users";
246  }
247 
248  /**
249  * Action listener for delete button on deleting page
250  *
251  * @return Returns page outcome (identificator of next page or null to stay here)
252  */
253  public String btnDeleteAction() {
254  // find annotations from this user
255  if(!SessionManager.getSession().isLoggedIn()){
256  SessionManager.getSession().setFormBackup(null);
257  SessionManager.getSession().setEditedUser(null);
258  return "login";
259  }
260 
261  Object[] params = new Object[2];
262  params[0] = "id";
263  params[1] = user.getId();
264  List gList = AppBean.getPersistenceManager().queryDB("Annotation.findByAuthor", params);
265  if (gList != null && !gList.isEmpty()) { // if annotation was found
266  errorMessage = MessageProvider.getMessage("ifAnnotationsExistsUserCantBeDeleted");
267  return null;
268  }
269 
270  // Is it last administrator?
271  for (Iterator<UserGroup> gIt = user.getGroups().iterator(); gIt.hasNext();) {
272  UserGroup ug = gIt.next();
273  if (ug.getName().equalsIgnoreCase(Constants.ADMIN_GROUP) && ug.getUsers().size() < 2) {
274  errorMessage = MessageProvider.getMessage("removeLastAdmin");
275  return null;
276  }
277  }
278 
279  //get all user settings
280  params[0] = "userId";
281  params[1] = user.getId();
282  @SuppressWarnings("unchecked")
283  List<Settings> settingsList = AppBean.getPersistenceManager().queryDB("Settings.findByUser",params);
284  if(settingsList != null && !settingsList.isEmpty()){
285  Iterator<Settings> settingsIt = settingsList.iterator();
286  while(settingsIt.hasNext()){
287  Settings actualSetting = settingsIt.next();
288  if (AppBean.getPersistenceManager().removeEntity(actualSetting)) {
289  errorMessage = MessageProvider.getMessage("userSettingsDeleteError");
291  String msg = "DB failure during deleting of user settings.";
292  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg);
293  }
294  return null;
295  }
296  }
297  }
298 
299  if (AppBean.getPersistenceManager().removeEntity(user)) {
300  errorMessage = MessageProvider.getMessage("userCantBeDeletedDatabaseFailure");
302  String msg = "DB failure during deleting of user account.";
303  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg);
304  }
305  return null;
306  }
307 
308  SessionManager.getSession().setFormBackup(null);
309  SessionManager.getSession().setEditedUser(null);
310  return "users";
311  } // btnDeleteAction()
312 
313  /**
314  * Gets edited user
315  * If user not set yet, pick up it from session
316  *
317  * @return Returns edited user
318  */
319  public User getUser() {
320  if (user == null) {
321  user = SessionManager.getSession().getEditedUser();
322  }
323  return user;
324  }
325 
326  /**
327  * Sets edited user
328  *
329  * @param user Edited user
330  */
331  public void setUser(User user) {
332  this.user = user;
333  }
334 
335  /**
336  * Gets value of user full name field in form
337  * If user not set yet, pick up it from session
338  *
339  * @return Returns value of user full name field in form
340  */
341  public String getName() {
342  if (user == null) {
343  user = SessionManager.getSession().getEditedUser();
344  }
345  User backup = null;
346  if (SessionManager.getSession().getFormBackup() != null) {
347  if (SessionManager.getSession().getFormBackup().getClass().getName().endsWith("User")) {
348  backup = (User) SessionManager.getSession().getFormBackup();
349  if (backup.getId() != user.getId()) {
350  backup = null;
351  }
352  }
353  }
354  if (name == null && backup != null) {
355  name = backup.getName();
356  } else if (name == null && user != null) {
357  name = user.getName();
358  } else if (name == null) {
359  name = "";
360  }
361  return name;
362  } // getName()
363 
364  /**
365  * Sets value of user full name field in form
366  *
367  * @param name Value of user full name field in form
368  */
369  public void setName(String name) {
370  this.name = name;
371  }
372 
373  /**
374  * Gets value of user login field in form
375  * If user not set yet, pick up it from session
376  *
377  * @return Returns value of user login field in form
378  */
379  public String getLogin() {
380  if (user == null) {
381  user = SessionManager.getSession().getEditedUser();
382  }
383  User backup = null;
384  if (SessionManager.getSession().getFormBackup() != null) {
385  if (SessionManager.getSession().getFormBackup().getClass().getName().endsWith("User")) {
386  backup = (User) SessionManager.getSession().getFormBackup();
387  if (backup.getId() != user.getId()) {
388  backup = null;
389  }
390  }
391  }
392  if (login == null && backup != null) {
393  login = backup.getLogin();
394  } else if (login == null && user != null) {
395  login = user.getLogin();
396  } else if (login == null) {
397  login = "";
398  }
399  return login;
400  } // getLogin()
401 
402  /**
403  * Sets value of user login field in form
404  *
405  * @param login Value of user login field in form
406  */
407  public void setLogin(String login) {
408  this.login = login;
409  }
410 
411  /**
412  * Gets value of come from field in form
413  * If user not set yet, pick up it from session
414  *
415  * @return Returns value of come from field in form
416  */
417  public String getComeFrom() {
418  if (user == null) {
419  user = SessionManager.getSession().getEditedUser();
420  }
421  User backup = null;
422  if (SessionManager.getSession().getFormBackup() != null) {
423  if (SessionManager.getSession().getFormBackup().getClass().getName().endsWith("User")) {
424  backup = (User) SessionManager.getSession().getFormBackup();
425  if (backup.getId() != user.getId()) {
426  backup = null;
427  }
428  }
429  }
430  if (comeFrom == null && backup != null) {
431  comeFrom = backup.getComeFrom();
432  } else if (comeFrom == null && user != null) {
433  comeFrom = user.getComeFrom();
434  } else if (comeFrom == null) {
435  comeFrom = "";
436  }
437  return comeFrom;
438  } // getComeFrom()
439 
440  /**
441  * Sets value of come from field in form
442  *
443  * @param comeFrom Value of come from field in form
444  */
445  public void setComeFrom(String comeFrom) {
446  this.comeFrom = comeFrom;
447  }
448 
449  /**
450  * Gets value of user email field in form
451  * If user not set yet, pick up it from session
452  *
453  * @return Returns value of user email field in form
454  */
455  public String getEmail() {
456  if (user == null) {
457  user = SessionManager.getSession().getEditedUser();
458  }
459  User backup = null;
460  if (SessionManager.getSession().getFormBackup() != null) {
461  if (SessionManager.getSession().getFormBackup().getClass().getName().endsWith("User")) {
462  backup = (User) SessionManager.getSession().getFormBackup();
463  if (backup.getId() != user.getId()) {
464  backup = null;
465  }
466  }
467  }
468  if (email == null && backup != null) {
469  email = backup.getEmail();
470  } else if (email == null && user != null) {
471  email = user.getEmail();
472  } else if (email == null) {
473  email = "";
474  }
475  return email;
476  } // getEmail()
477 
478  /**
479  * Sets value of user email field in form
480  *
481  * @param email Value of user email field in form
482  */
483  public void setEmail(String email) {
484  this.email = email;
485  }
486 
487  /**
488  * Gets value of user password field in form
489  *
490  * @return Returns empty string (password can't be decoded from MD5)
491  */
492  public String getPassword() {
493  return "";
494  }
495 
496  /**
497  * Sets value of user password field in form
498  *
499  * @param password Value of user password field in form
500  */
501  public void setPassword(String password) {
502  this.password = password;
503  }
504 
505  /**
506  * Gets value of user password control field in form
507  *
508  * @return Returns empty string (password can't be decoded from MD5)
509  */
510  public String getPasswordControl() {
511  return "";
512  }
513 
514  /**
515  * Sets value of user password control field in form
516  *
517  * @param passwordControl Value of user password control field in form
518  */
519  public void setPasswordControl(String passwordControl) {
520  this.passwordControl = passwordControl;
521  }
522  /**
523  * Gets error message displayed in form
524  *
525  * @return Returns error message displayed in form
526  */
527  public String getErrorMessage() {
528  return errorMessage;
529  }
530 
531  /**
532  * Sets error message to be displayed in form
533  *
534  * @param errorMessage Error message to be displayed in form
535  */
536  public void setErrorMessage(String errorMessage) {
537  this.errorMessage = errorMessage;
538  }
539 
540  /**
541  * Gets table with user groups of given user
542  *
543  * @return Returns table with user groups of given user
544  */
545  public HtmlDataTable getListTable() {
546  return listTable;
547  }
548 
549  /**
550  * Sets table with user groups of given user
551  *
552  * @param listTable Table with user groups of given user
553  */
554  public void setListTable(HtmlDataTable listTable) {
555  this.listTable = listTable;
556  }
557 
558  /**
559  * Gets list of all user groups of given user
560  *
561  * @return List of all user groups of given user
562  */
563  public List<UserGroup> getUserGroupsList() {
564  if (user == null) {
565  user = SessionManager.getSession().getEditedUser();
566  if(user == null) return null;
567  }
568  return user.getGroups();
569  }
570 
571  /**
572  * Gets user group selected in the table
573  *
574  * @return Returns user group selected in the table
575  */
577  return userGroup;
578  }
579 
580  /**
581  * Sets user group selected in the table
582  *
583  * @param userGroup User group selected in the table
584  */
586  this.userGroup = userGroup;
587  }
588 
589  /**
590  * Action listener for remove link in the table. Removes user from user group
591  *
592  * @return Returns null to stay in this page
593  */
594  public String actionRemoveUserFromGroup(Integer id) {
595  // Commented out row can be used only in session context. This is reason
596  // for my workaround.
597  // userGroup = (UserGroup) listTable.getRowData();
598 
599  // Get selected row data
600  if(!SessionManager.getSession().isLoggedIn()){
601  SessionManager.getSession().setFormBackup(null);
602  SessionManager.getSession().setEditedUser(null);
603  return "login";
604  }
605 
606  UserGroup refUG = new UserGroup(id);
607  int index = getUserGroupsList().indexOf(refUG);
608  userGroup = getUserGroupsList().get(index);
609  if (userGroup.getName().equalsIgnoreCase(Constants.ADMIN_GROUP) && userGroup.getUsers().size() < 2) {
610  // the last administrator can't be removed
611  errorMessage = MessageProvider.getMessage("removeLastAdmin");
612  return null;
613  }
614  try {
615  EntityManager em = AppBean.getPersistenceManager().getEM();
616  EntityTransaction transaction = em.getTransaction();
617  transaction.begin();
618  user = em.merge(user);
619  userGroup = em.merge(userGroup);
620  userGroup.getUsers().remove(user); // remove user from group
621  user.getGroups().remove(userGroup);
622  em.flush();
623  transaction.commit();
624  } catch (Exception e) {
625  errorMessage = MessageProvider.getMessage("userCantBeREmovedDFromGroup");
627  String msg = "Removing of user from the user group failed.";
628  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg, e);
629  }
630  return null;
631  }
632 
633  AppBean.refreshUsersInSessions(user); // refreshes data in sessions
634 
635  return null;
636  } // actionRemoveUserFromGroup()
637 
638  /**
639  * Action listener for link for join user to group
640  *
641  * @return GEturns page outcome (identificator of transition)
642  */
643  public String actionAddUserGroup() {
644  // backup form data
645  if(!SessionManager.getSession().isLoggedIn()){
646  SessionManager.getSession().setFormBackup(null);
647  SessionManager.getSession().setEditedUser(null);
648  return "login";
649  }
650  User backup = new User(user.getId(), login, name, email, password);
651  backup.setComeFrom(comeFrom);
652  SessionManager.getSession().setFormBackup(backup);
653  // pass edited user through the session
654  SessionManager.getSession().setEditedUser(user);
655  return "selectUserGroup";
656  }
657 
658  private String loadDefaultSettings(User user){
659  if(!SessionManager.getSession().isLoggedIn()){
660  SessionManager.getSession().setFormBackup(null);
661  SessionManager.getSession().setEditedUser(null);
662  return "login";
663  }
664  @SuppressWarnings("unchecked")
665  List<DefaultSettings> settingsList = AppBean.getPersistenceManager().queryDB("DefaultSettings.findAll");
666  if(settingsList != null){
667  String errorMessageOut;
668  ListIterator<DefaultSettings> resultIt = settingsList.listIterator();
669  while(resultIt.hasNext()){
670  DefaultSettings actualDefaultSetting = resultIt.next();
671  Settings newUserSetting = new Settings(user,actualDefaultSetting.getName(),actualDefaultSetting.getValue(),actualDefaultSetting.getDescription());
672 
673  if (AppBean.getPersistenceManager().persistEntity(newUserSetting)) {
674  errorMessageOut = MessageProvider.getMessage("newUserSettingDBFailure");
676  String msg = "Persisting of new user settings failed.";
677  Logger.getLogger(EditUser.class.getName()).log(Level.SEVERE, msg);
678  }
679  return errorMessageOut;
680  }
681  }
682  }
683 
684  return null;
685  }
686 
687 } // public class EditUser
void setUserGroup(UserGroup userGroup)
Definition: EditUser.java:585
Class for manipulating with session.
Singleton for storing global variables.
Definition: AppBean.java:47
Static class which parses and process XML with messages.
Class representing user group.
Definition: UserGroup.java:47
Class representing parameter of user settings.
Definition: Settings.java:45
void setPasswordControl(String passwordControl)
Definition: EditUser.java:519
void setErrorMessage(String errorMessage)
Definition: EditUser.java:536
Class representing user.
Definition: User.java:51
Backbean for adding, editing and deleting of users.
Definition: EditUser.java:45
Class representing parameter of default user settings.
void setListTable(HtmlDataTable listTable)
Definition: EditUser.java:554