2 * Copyright (C) 2016 - 2022 Free Software Foundation
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.
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.
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/>.
17 package org.mxchange.addressbook.beans.user.list;
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;
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;
49 * A user list bean (controller)
51 * @author Roland Häder<roland@mxchange.org>
53 @Named ("userListController")
55 public class AddressbookUserListWebViewBean extends BaseAddressbookBean implements AddressbookUserListWebViewController {
60 private static final long serialVersionUID = 542_145_347_918L;
65 private final List<User> allUsers;
68 * List of filtered users
70 private List<User> filteredUsers;
73 * Selected user instance
75 private User selectedUser;
80 @EJB (lookup = "java:global/addressbook-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote")
81 private UserSessionBeanRemote userBean;
84 * A list of all user profiles
87 @NamedCache (cacheName = "userCache")
88 private transient Cache<Long, User> userCache;
93 public AddressbookUserListWebViewBean () {
94 // Call super constructor
98 this.allUsers = new LinkedList<>();
102 * Event observer for newly added users by administrator
104 * @param event Event being fired
106 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
107 // Event and contained entity instance should not be null
110 throw new NullPointerException("event is null"); //NOI18N
111 } else if (event.getAddedUser() == null) {
113 throw new NullPointerException("event.addedUser is null"); //NOI18N
114 } else if (event.getAddedUser().getUserId() == null) {
116 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
117 } else if (event.getAddedUser().getUserId() < 1) {
119 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
123 this.updateList(event.getAddedUser());
127 * Event observer for deleted user accounts (by administrator)
129 * @param event Event being fired
131 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
132 // Event and contained entity instance should not be null
135 throw new NullPointerException("event is null"); //NOI18N
136 } else if (event.getDeletedUser() == null) {
138 throw new NullPointerException("event.deletedUser is null"); //NOI18N
139 } else if (event.getDeletedUser().getUserId() == null) {
141 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
142 } else if (event.getDeletedUser().getUserId() < 1) {
144 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
148 this.removeFromList(event.getDeletedUser());
152 * Event observer for linked users with existing contact data
154 * @param event Event being fired
156 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
157 // Event and contained entity instance should not be null
160 throw new NullPointerException("event is null"); //NOI18N
161 } else if (event.getLinkedUser() == null) {
163 throw new NullPointerException("event.linkedUser is null"); //NOI18N
164 } else if (event.getLinkedUser().getUserId() == null) {
166 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
167 } else if (event.getLinkedUser().getUserId() < 1) {
169 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
173 this.updateList(event.getLinkedUser());
177 * Event observer for locked users
179 * @param event Event being fired
181 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
182 // Event and contained entity instance should not be null
185 throw new NullPointerException("event is null"); //NOI18N
186 } else if (event.getLockedUser() == null) {
188 throw new NullPointerException("event.lockedUser is null"); //NOI18N
189 } else if (event.getLockedUser().getUserId() == null) {
191 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
192 } else if (event.getLockedUser().getUserId() < 1) {
194 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
198 this.updateList(event.getLockedUser());
202 * Event observer for unlocked users
204 * @param event Event being fired
206 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
207 // Event and contained entity instance should not be null
210 throw new NullPointerException("event is null"); //NOI18N
211 } else if (event.getUnlockedUser() == null) {
213 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
214 } else if (event.getUnlockedUser().getUserId() == null) {
216 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
217 } else if (event.getUnlockedUser().getUserId() < 1) {
219 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
223 this.updateList(event.getUnlockedUser());
227 * Event observer for updated user data by administrator
229 * @param event Event being updated
231 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminPostUserDataUpdatedEvent event) {
232 // Event and contained entity instance should not be null
235 throw new NullPointerException("event is null"); //NOI18N
236 } else if (event.getUpdatedUser() == null) {
238 throw new NullPointerException("event.updatedUser is null"); //NOI18N
239 } else if (event.getUpdatedUser().getUserId() == null) {
241 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
242 } else if (event.getUpdatedUser().getUserId() < 1) {
244 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
248 this.updateList(event.getUpdatedUser());
252 * Event observer when user confirmed account.
254 * @param event Event being fired
256 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
257 // Event and contained entity instance should not be null
260 throw new NullPointerException("event is null"); //NOI18N
261 } else if (event.getConfirmedUser() == null) {
263 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
264 } else if (event.getConfirmedUser().getUserId() == null) {
266 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
267 } else if (event.getConfirmedUser().getUserId() < 1) {
269 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
273 this.updateList(event.getConfirmedUser());
277 * Event observer for new user registrations
279 * @param event User registration event
281 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
282 // Event and contained entity instance should not be null
285 throw new NullPointerException("event is null"); //NOI18N
286 } else if (event.getRegisteredUser() == null) {
288 throw new NullPointerException("event.registeredUser is null"); //NOI18N
289 } else if (event.getRegisteredUser().getUserId() == null) {
291 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
292 } else if (event.getRegisteredUser().getUserId() < 1) {
294 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
298 this.updateList(event.getRegisteredUser());
302 * Method being call after user's password has been updated (and history
303 * entry has been created).
305 * @param event Event being observed
307 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
311 throw new NullPointerException("event is null"); //NOI18N
312 } else if (event.getPasswordHistory() == null) {
314 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
315 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
317 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
318 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
320 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
324 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
328 * Listens to fired event when user updated personal data
330 * @param event Event being fired
332 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservablePostUserPersonalDataUpdatedEvent event) {
336 throw new NullPointerException("event is null"); //NOI18N
337 } else if (event.getUpdatedUser() == null) {
339 throw new NullPointerException("event.updatedUser is null"); //NOI18N
340 } else if (event.getUpdatedUser().getUserId() == null) {
342 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
343 } else if (event.getUpdatedUser().getUserId() < 1) {
345 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
349 this.updateList(event.getUpdatedUser());
353 public User findUserById (final Long userId) throws UserNotFoundException {
354 // Validate parameter
355 if (null == userId) {
357 throw new NullPointerException("userId is null"); //NOI18N
358 } else if (userId < 1) {
360 throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
361 } else if (!this.userCache.containsKey(userId)) {
363 throw new UserNotFoundException(userId);
367 final User user = this.userCache.get(userId);
374 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
375 public List<User> getAllUsers () {
376 return this.allUsers;
380 * Getter for filtered users list
382 * @return Filtered users list
384 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
385 public List<User> getFilteredUsers () {
386 return this.filteredUsers;
390 * Setter for filtered users list
392 * @param filteredUsers Filtered users list
394 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
395 public void setFilteredUsers (final List<User> filteredUsers) {
396 this.filteredUsers = filteredUsers;
400 * Getter for selected user instance
402 * @return Selected user instance
404 public User getSelectedUser () {
405 return this.selectedUser;
409 * Setter for selected user instance
411 * @param selectedUser Selected user instance
413 public void setSelectedUser (final User selectedUser) {
414 this.selectedUser = selectedUser;
418 public boolean ifUserIdExists (final Long userId) {
419 // Validate parameter
420 if (null == userId) {
422 throw new NullPointerException("userId is null"); //NOI18N
423 } else if (userId < 1) {
425 throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
428 // Check if key is there
429 boolean isFound = this.userCache.containsKey(userId);
436 * Post-initialization of this class
439 public void initializeList () {
441 if (!this.userCache.iterator().hasNext()) {
443 for (final User user : this.userBean.fetchAllUsers()) {
445 this.userCache.put(user.getUserId(), user);
449 // Is cache filled and list is empty
450 if ((this.userCache.iterator().hasNext()) && (this.getAllUsers().isEmpty())) {
452 for (final Cache.Entry<Long, User> currentEntry : this.userCache) {
454 this.getAllUsers().add(currentEntry.getValue());
458 this.getAllUsers().sort(new Comparator<User>() {
460 public int compare (final User user1, final User user2) {
461 return user1.getUserId() > user2.getUserId() ? 1 : user1.getUserId() < user2.getUserId() ? -1 : 0;
466 this.setFilteredUsers(this.getAllUsers());
471 public boolean isUserNameRegistered (final User user) {
472 // Default is not found
473 boolean isFound = false;
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
490 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
491 // Parameter must be valid
492 if (null == emailAddress) {
494 throw new NullPointerException("emailAddress is null"); //NOI18N
495 } else if (emailAddress.isEmpty()) {
497 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
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) {
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
514 // Is the email address found?
515 if (Objects.equals(currentUser.getValue().getUserContact().getContactEmailAddress(), emailAddress)) {
516 // Copy to other variable
517 user = currentUser.getValue();
524 // Not visible for the current user
525 throw new UserEmailAddressNotFoundException(emailAddress);
533 public User lookupUserById (final Long userId) throws UserNotFoundException {
534 // Parameter must be valid
535 if (null == userId) {
537 throw new NullPointerException("userId is null"); //NOI18N
538 } else if (userId < 1) {
540 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
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();
558 // Not visible for the current user
559 throw new UserNotFoundException(userId);
567 * Removes user from all lists
569 * @param user User to remove
571 private void removeFromList (final User user) {
572 // Remove it from lists
573 this.getAllUsers().remove(user);
574 this.userCache.remove(user.getUserId());
578 * Updates list with given user instance
580 * @param user User instance
582 private void updateList (final User user) {
584 this.userCache.put(user.getUserId(), user);
585 this.getAllUsers().add(user);