]> git.mxchange.org Git - addressbook-war.git/blob - src/java/org/mxchange/addressbook/beans/user/list/AddressbookUserListWebViewBean.java
Don't cherry-pick:
[addressbook-war.git] / src / java / org / mxchange / addressbook / beans / user / list / AddressbookUserListWebViewBean.java
1 /*
2  * Copyright (C) 2016 - 2022 Free Software Foundation
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License as
6  * published by the Free Software Foundation, either version 3 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Affero General Public License for more details.
13  *
14  * You should have received a copy of the GNU Affero General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.addressbook.beans.user.list;
18
19 import fish.payara.cdi.jsr107.impl.NamedCache;
20 import java.text.MessageFormat;
21 import java.util.Comparator;
22 import java.util.LinkedList;
23 import java.util.List;
24 import java.util.Objects;
25 import javax.annotation.PostConstruct;
26 import javax.cache.Cache;
27 import javax.ejb.EJB;
28 import javax.enterprise.event.Observes;
29 import javax.faces.view.ViewScoped;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import org.mxchange.addressbook.beans.BaseAddressbookBean;
33 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
34 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
35 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
36 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
37 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
38 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
39 import org.mxchange.jusercore.exceptions.UserNotFoundException;
40 import org.mxchange.jusercore.model.user.User;
41 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
42 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
43 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
44 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
45 import org.mxchange.jusercore.events.user.update.post.ObservableAdminPostUserDataUpdatedEvent;
46 import org.mxchange.jusercore.events.user.update.post.ObservablePostUserPersonalDataUpdatedEvent;
47
48 /**
49  * A user list bean (controller)
50  * <p>
51  * @author Roland Häder<roland@mxchange.org>
52  */
53 @Named ("userListController")
54 @ViewScoped
55 public class AddressbookUserListWebViewBean extends BaseAddressbookBean implements AddressbookUserListWebViewController {
56
57         /**
58          * Serial number
59          */
60         private static final long serialVersionUID = 542_145_347_918L;
61
62         /**
63          * List of all users
64          */
65         private final List<User> allUsers;
66
67         /**
68          * List of filtered users
69          */
70         private List<User> filteredUsers;
71
72         /**
73          * Selected user instance
74          */
75         private User selectedUser;
76
77         /**
78          * Remote user bean
79          */
80         @EJB (lookup = "java:global/addressbook-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote")
81         private UserSessionBeanRemote userBean;
82
83         /**
84          * A list of all user profiles
85          */
86         @Inject
87         @NamedCache (cacheName = "userCache")
88         private transient Cache<Long, User> userCache;
89
90         /**
91          * Default constructor
92          */
93         public AddressbookUserListWebViewBean () {
94                 // Call super constructor
95                 super();
96
97                 // Init list
98                 this.allUsers = new LinkedList<>();
99         }
100
101         /**
102          * Event observer for newly added users by administrator
103          * <p>
104          * @param event Event being fired
105          */
106         public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
107                 // Event and contained entity instance should not be null
108                 if (null == event) {
109                         // Throw NPE
110                         throw new NullPointerException("event is null"); //NOI18N
111                 } else if (event.getAddedUser() == null) {
112                         // Throw NPE again
113                         throw new NullPointerException("event.addedUser is null"); //NOI18N
114                 } else if (event.getAddedUser().getUserId() == null) {
115                         // userId is null
116                         throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
117                 } else if (event.getAddedUser().getUserId() < 1) {
118                         // Not avalid id
119                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
120                 }
121
122                 // Update user list
123                 this.updateList(event.getAddedUser());
124         }
125
126         /**
127          * Event observer for deleted user accounts (by administrator)
128          * <p>
129          * @param event Event being fired
130          */
131         public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
132                 // Event and contained entity instance should not be null
133                 if (null == event) {
134                         // Throw NPE
135                         throw new NullPointerException("event is null"); //NOI18N
136                 } else if (event.getDeletedUser() == null) {
137                         // Throw NPE again
138                         throw new NullPointerException("event.deletedUser is null"); //NOI18N
139                 } else if (event.getDeletedUser().getUserId() == null) {
140                         // userId is null
141                         throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
142                 } else if (event.getDeletedUser().getUserId() < 1) {
143                         // Not avalid id
144                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
145                 }
146
147                 // Update user list
148                 this.removeFromList(event.getDeletedUser());
149         }
150
151         /**
152          * Event observer for linked users with existing contact data
153          * <p>
154          * @param event Event being fired
155          */
156         public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
157                 // Event and contained entity instance should not be null
158                 if (null == event) {
159                         // Throw NPE
160                         throw new NullPointerException("event is null"); //NOI18N
161                 } else if (event.getLinkedUser() == null) {
162                         // Throw NPE again
163                         throw new NullPointerException("event.linkedUser is null"); //NOI18N
164                 } else if (event.getLinkedUser().getUserId() == null) {
165                         // userId is null
166                         throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
167                 } else if (event.getLinkedUser().getUserId() < 1) {
168                         // Not avalid id
169                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
170                 }
171
172                 // Update user list
173                 this.updateList(event.getLinkedUser());
174         }
175
176         /**
177          * Event observer for locked users
178          * <p>
179          * @param event Event being fired
180          */
181         public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
182                 // Event and contained entity instance should not be null
183                 if (null == event) {
184                         // Throw NPE
185                         throw new NullPointerException("event is null"); //NOI18N
186                 } else if (event.getLockedUser() == null) {
187                         // Throw NPE again
188                         throw new NullPointerException("event.lockedUser is null"); //NOI18N
189                 } else if (event.getLockedUser().getUserId() == null) {
190                         // userId is null
191                         throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
192                 } else if (event.getLockedUser().getUserId() < 1) {
193                         // Not avalid id
194                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
195                 }
196
197                 // Update user list
198                 this.updateList(event.getLockedUser());
199         }
200
201         /**
202          * Event observer for unlocked users
203          * <p>
204          * @param event Event being fired
205          */
206         public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
207                 // Event and contained entity instance should not be null
208                 if (null == event) {
209                         // Throw NPE
210                         throw new NullPointerException("event is null"); //NOI18N
211                 } else if (event.getUnlockedUser() == null) {
212                         // Throw NPE again
213                         throw new NullPointerException("event.unlockedUser is null"); //NOI18N
214                 } else if (event.getUnlockedUser().getUserId() == null) {
215                         // userId is null
216                         throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
217                 } else if (event.getUnlockedUser().getUserId() < 1) {
218                         // Not avalid id
219                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
220                 }
221
222                 // Update user list
223                 this.updateList(event.getUnlockedUser());
224         }
225
226         /**
227          * Event observer for updated user data by administrator
228          * <p>
229          * @param event Event being updated
230          */
231         public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminPostUserDataUpdatedEvent event) {
232                 // Event and contained entity instance should not be null
233                 if (null == event) {
234                         // Throw NPE
235                         throw new NullPointerException("event is null"); //NOI18N
236                 } else if (event.getUpdatedUser() == null) {
237                         // Throw NPE again
238                         throw new NullPointerException("event.updatedUser is null"); //NOI18N
239                 } else if (event.getUpdatedUser().getUserId() == null) {
240                         // userId is null
241                         throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
242                 } else if (event.getUpdatedUser().getUserId() < 1) {
243                         // Not avalid id
244                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
245                 }
246
247                 // Update user list
248                 this.updateList(event.getUpdatedUser());
249         }
250
251         /**
252          * Event observer when user confirmed account.
253          * <p>
254          * @param event Event being fired
255          */
256         public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
257                 // Event and contained entity instance should not be null
258                 if (null == event) {
259                         // Throw NPE
260                         throw new NullPointerException("event is null"); //NOI18N
261                 } else if (event.getConfirmedUser() == null) {
262                         // Throw NPE again
263                         throw new NullPointerException("event.confirmedUser is null"); //NOI18N
264                 } else if (event.getConfirmedUser().getUserId() == null) {
265                         // userId is null
266                         throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
267                 } else if (event.getConfirmedUser().getUserId() < 1) {
268                         // Not avalid id
269                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
270                 }
271
272                 // Update user list
273                 this.updateList(event.getConfirmedUser());
274         }
275
276         /**
277          * Event observer for new user registrations
278          * <p>
279          * @param event User registration event
280          */
281         public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
282                 // Event and contained entity instance should not be null
283                 if (null == event) {
284                         // Throw NPE
285                         throw new NullPointerException("event is null"); //NOI18N
286                 } else if (event.getRegisteredUser() == null) {
287                         // Throw NPE again
288                         throw new NullPointerException("event.registeredUser is null"); //NOI18N
289                 } else if (event.getRegisteredUser().getUserId() == null) {
290                         // userId is null
291                         throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
292                 } else if (event.getRegisteredUser().getUserId() < 1) {
293                         // Not avalid id
294                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
295                 }
296
297                 // Update user list
298                 this.updateList(event.getRegisteredUser());
299         }
300
301         /**
302          * Method being call after user's password has been updated (and history
303          * entry has been created).
304          * <p>
305          * @param event Event being observed
306          */
307         public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
308                 // Check parameter
309                 if (null == event) {
310                         // Throw NPE
311                         throw new NullPointerException("event is null"); //NOI18N
312                 } else if (event.getPasswordHistory() == null) {
313                         // Throw NPE again
314                         throw new NullPointerException("event.passwordHistory is null"); //NOI18N
315                 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
316                         // ... and again
317                         throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
318                 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
319                         // Invalid value
320                         throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
321                 }
322
323                 // Update user list
324                 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
325         }
326
327         /**
328          * Listens to fired event when user updated personal data
329          * <p>
330          * @param event Event being fired
331          */
332         public void afterUserUpdatedPersonalDataEvent (@Observes final ObservablePostUserPersonalDataUpdatedEvent event) {
333                 // Check parameter
334                 if (null == event) {
335                         // Throw NPE
336                         throw new NullPointerException("event is null"); //NOI18N
337                 } else if (event.getUpdatedUser() == null) {
338                         // Throw NPE again
339                         throw new NullPointerException("event.updatedUser is null"); //NOI18N
340                 } else if (event.getUpdatedUser().getUserId() == null) {
341                         // ... and again
342                         throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
343                 } else if (event.getUpdatedUser().getUserId() < 1) {
344                         // Invalid value
345                         throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
346                 }
347
348                 // Update user list
349                 this.updateList(event.getUpdatedUser());
350         }
351
352         @Override
353         public User findUserById (final Long userId) throws UserNotFoundException {
354                 // Validate parameter
355                 if (null == userId) {
356                         // Throw NPE
357                         throw new NullPointerException("userId is null"); //NOI18N
358                 } else if (userId < 1) {
359                         // Throw IAE
360                         throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
361                 } else if (!this.userCache.containsKey(userId)) {
362                         // Not found
363                         throw new UserNotFoundException(userId);
364                 }
365
366                 // Get it from cache
367                 final User user = this.userCache.get(userId);
368
369                 // Return it
370                 return user;
371         }
372
373         @Override
374         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
375         public List<User> getAllUsers () {
376                 return this.allUsers;
377         }
378
379         /**
380          * Getter for filtered users list
381          * <p>
382          * @return Filtered users list
383          */
384         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
385         public List<User> getFilteredUsers () {
386                 return this.filteredUsers;
387         }
388
389         /**
390          * Setter for filtered users list
391          * <p>
392          * @param filteredUsers Filtered users list
393          */
394         @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
395         public void setFilteredUsers (final List<User> filteredUsers) {
396                 this.filteredUsers = filteredUsers;
397         }
398
399         /**
400          * Getter for selected user instance
401          * <p>
402          * @return Selected user instance
403          */
404         public User getSelectedUser () {
405                 return this.selectedUser;
406         }
407
408         /**
409          * Setter for selected user instance
410          * <p>
411          * @param selectedUser Selected user instance
412          */
413         public void setSelectedUser (final User selectedUser) {
414                 this.selectedUser = selectedUser;
415         }
416
417         @Override
418         public boolean ifUserIdExists (final Long userId) {
419                 // Validate parameter
420                 if (null == userId) {
421                         // Throw NPE
422                         throw new NullPointerException("userId is null"); //NOI18N
423                 } else if (userId < 1) {
424                         // Throw IAE
425                         throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
426                 }
427
428                 // Check if key is there
429                 boolean isFound = this.userCache.containsKey(userId);
430
431                 // Return flag
432                 return isFound;
433         }
434
435         /**
436          * Post-initialization of this class
437          */
438         @PostConstruct
439         public void initializeList () {
440                 // Is cache there?
441                 if (!this.userCache.iterator().hasNext()) {
442                         // Add all
443                         for (final User user : this.userBean.fetchAllUsers()) {
444                                 // Add it to cache
445                                 this.userCache.put(user.getUserId(), user);
446                         }
447                 }
448
449                 // Is cache filled and list is empty
450                 if ((this.userCache.iterator().hasNext()) && (this.getAllUsers().isEmpty())) {
451                         // Build up list
452                         for (final Cache.Entry<Long, User> currentEntry : this.userCache) {
453                                 // Add to list
454                                 this.getAllUsers().add(currentEntry.getValue());
455                         }
456
457                         // Sort list
458                         this.getAllUsers().sort(new Comparator<User>() {
459                                 @Override
460                                 public int compare (final User user1, final User user2) {
461                                         return user1.getUserId() > user2.getUserId() ? 1 : user1.getUserId() < user2.getUserId() ? -1 : 0;
462                                 }
463                         });
464
465                         // Set full list
466                         this.setFilteredUsers(this.getAllUsers());
467                 }
468         }
469
470         @Override
471         public boolean isUserNameRegistered (final User user) {
472                 // Default is not found
473                 boolean isFound = false;
474
475                 // Determine it
476                 for (final User currentUser : this.getAllUsers()) {
477                         // Is same name found?
478                         if (Objects.equals(user.getUserName(), currentUser.getUserName())) {
479                                 // Yes, then set flag and abort loop
480                                 isFound = true;
481                                 break;
482                         }
483                 }
484
485                 // Return flag
486                 return isFound;
487         }
488
489         @Override
490         public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
491                 // Parameter must be valid
492                 if (null == emailAddress) {
493                         // Throw NPE
494                         throw new NullPointerException("emailAddress is null"); //NOI18N
495                 } else if (emailAddress.isEmpty()) {
496                         // Not valid
497                         throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
498                 }
499
500                 // Init variable
501                 User user = null;
502
503                 // Try to lookup it in visible user list
504                 for (final Cache.Entry<Long, User> currentUser : this.userCache) {
505                         // Contact should be set
506                         if (currentUser.getValue().getUserContact() == null) {
507                                 // Contact is null
508                                 throw new NullPointerException(MessageFormat.format("currentUser.userContact is null for user id {0}", currentUser.getKey())); //NOI18N
509                         } else if (currentUser.getValue().getUserContact().getContactEmailAddress() == null) {
510                                 // Email address should be set
511                                 throw new NullPointerException(MessageFormat.format("currentUser.userContact.contactEmailAddress is null for user id {0}", currentUser.getKey())); //NOI18N
512                         }
513
514                         // Is the email address found?
515                         if (Objects.equals(currentUser.getValue().getUserContact().getContactEmailAddress(), emailAddress)) {
516                                 // Copy to other variable
517                                 user = currentUser.getValue();
518                                 break;
519                         }
520                 }
521
522                 // Is it still null?
523                 if (null == user) {
524                         // Not visible for the current user
525                         throw new UserEmailAddressNotFoundException(emailAddress);
526                 }
527
528                 // Return it
529                 return user;
530         }
531
532         @Override
533         public User lookupUserById (final Long userId) throws UserNotFoundException {
534                 // Parameter must be valid
535                 if (null == userId) {
536                         // Throw NPE
537                         throw new NullPointerException("userId is null"); //NOI18N
538                 } else if (userId < 1) {
539                         // Not valid
540                         throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
541                 }
542
543                 // Init variable
544                 User user = null;
545
546                 // Try to lookup it in visible user list
547                 for (final Cache.Entry<Long, User> currentUser : this.userCache) {
548                         // Is the user id found?
549                         if (Objects.equals(currentUser.getKey(), userId)) {
550                                 // Copy to other variable
551                                 user = currentUser.getValue();
552                                 break;
553                         }
554                 }
555
556                 // Is it still null?
557                 if (null == user) {
558                         // Not visible for the current user
559                         throw new UserNotFoundException(userId);
560                 }
561
562                 // Return it
563                 return user;
564         }
565
566         /**
567          * Removes user from all lists
568          * <p>
569          * @param user User to remove
570          */
571         private void removeFromList (final User user) {
572                 // Remove it from lists
573                 this.getAllUsers().remove(user);
574                 this.userCache.remove(user.getUserId());
575         }
576
577         /**
578          * Updates list with given user instance
579          * <p>
580          * @param user User instance
581          */
582         private void updateList (final User user) {
583                 // Add/update user
584                 this.userCache.put(user.getUserId(), user);
585                 this.getAllUsers().add(user);
586         }
587
588 }