2 * Copyright (C) 2016 - 2020 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.jjobs.beans.user;
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.Locale;
25 import java.util.Objects;
26 import javax.annotation.PostConstruct;
27 import javax.cache.Cache;
29 import javax.enterprise.context.RequestScoped;
30 import javax.enterprise.event.Event;
31 import javax.enterprise.event.Observes;
32 import javax.enterprise.inject.Any;
33 import javax.faces.context.FacesContext;
34 import javax.faces.view.facelets.FaceletException;
35 import javax.inject.Inject;
36 import javax.inject.Named;
37 import org.mxchange.jcontacts.model.contact.Contact;
38 import org.mxchange.jcoreee.events.locale.ObservableLocaleChangeEvent;
39 import org.mxchange.jjobs.beans.BaseJobsBean;
40 import org.mxchange.jjobs.beans.contact.JobsContactWebRequestController;
41 import org.mxchange.jjobs.beans.features.JobsFeaturesWebApplicationController;
42 import org.mxchange.jjobs.beans.user.login.JobsUserLoginWebSessionController;
43 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
44 import org.mxchange.jusercore.events.user.clear.password.ObservableClearUserPasswordEvent;
45 import org.mxchange.jusercore.events.user.clear.username.ObservableClearUserNameEvent;
46 import org.mxchange.jusercore.events.user.created.ObservableCreatedUserEvent;
47 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
48 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
49 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
50 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
51 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
52 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
53 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
54 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
55 import org.mxchange.jusercore.exceptions.UserNotFoundException;
56 import org.mxchange.jusercore.model.user.LoginUser;
57 import org.mxchange.jusercore.model.user.User;
58 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
59 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
60 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
61 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
62 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
63 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
64 import org.mxchange.juserlogincore.exceptions.UserPasswordMismatchException;
65 import org.mxchange.juserlogincore.login.UserLoginUtils;
68 * A user controller (bean)
70 * @author Roland Häder<roland@mxchange.org>
72 @Named ("userController")
74 public class JobsUserWebRequestBean extends BaseJobsBean implements JobsUserWebRequestController {
79 private static final long serialVersionUID = 542_145_347_916L;
84 private final List<User> allUsers;
87 * General contact controller
90 private JobsContactWebRequestController contactController;
96 private JobsFeaturesWebApplicationController featureController;
99 * List of filtered users
101 private List<User> filteredUsers;
106 private Locale locale;
109 * Event being fired when user updated personal data
113 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
118 @EJB (lookup = "java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote")
119 private UserSessionBeanRemote userBean;
122 * A list of all user profiles
125 @NamedCache (cacheName = "userCache")
126 private Cache<Long, User> userCache;
134 * Login controller (bean)
137 private JobsUserLoginWebSessionController userLoginController;
142 private String userName;
145 * User password (clear-text from web form)
147 private String userPassword;
150 * User password repeated (clear-text from web form)
152 private String userPasswordRepeat;
155 * Whether the user wants a public profile
157 private ProfileMode userProfileMode;
160 * Default constructor
162 public JobsUserWebRequestBean () {
163 // Call super constructor
167 this.allUsers = new LinkedList<>();
171 * Event observer for newly added users by administrator
173 * @param event Event being fired
175 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
176 // event should not be null
179 throw new NullPointerException("event is null"); //NOI18N
180 } else if (event.getAddedUser() == null) {
182 throw new NullPointerException("event.addedUser is null"); //NOI18N
183 } else if (event.getAddedUser().getUserId() == null) {
185 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
186 } else if (event.getAddedUser().getUserId() < 1) {
188 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
192 this.updateList(event.getAddedUser());
198 this.setUserId(event.getAddedUser().getUserId());
202 * Event observer for deleted user accounts (by administrator)
204 * @param event Event being fired
206 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
207 // event should not be null
210 throw new NullPointerException("event is null"); //NOI18N
211 } else if (event.getDeletedUser() == null) {
213 throw new NullPointerException("event.deletedUser is null"); //NOI18N
214 } else if (event.getDeletedUser().getUserId() == null) {
216 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
217 } else if (event.getDeletedUser().getUserId() < 1) {
219 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
223 this.removeFromList(event.getDeletedUser());
230 * Event observer for linked users with existing contact data
232 * @param event Event being fired
234 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
235 // event should not be null
238 throw new NullPointerException("event is null"); //NOI18N
239 } else if (event.getLinkedUser() == null) {
241 throw new NullPointerException("event.linkedUser is null"); //NOI18N
242 } else if (event.getLinkedUser().getUserId() == null) {
244 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
245 } else if (event.getLinkedUser().getUserId() < 1) {
247 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
251 this.updateList(event.getLinkedUser());
257 this.setUserId(event.getLinkedUser().getUserId());
261 * Event observer for locked users
263 * @param event Event being fired
265 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
266 // event should not be null
269 throw new NullPointerException("event is null"); //NOI18N
270 } else if (event.getLockedUser() == null) {
272 throw new NullPointerException("event.lockedUser is null"); //NOI18N
273 } else if (event.getLockedUser().getUserId() == null) {
275 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
276 } else if (event.getLockedUser().getUserId() < 1) {
278 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
282 this.updateList(event.getLockedUser());
286 * Event observer for unlocked users
288 * @param event Event being fired
290 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
291 // event should not be null
294 throw new NullPointerException("event is null"); //NOI18N
295 } else if (event.getUnlockedUser() == null) {
297 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
298 } else if (event.getUnlockedUser().getUserId() == null) {
300 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
301 } else if (event.getUnlockedUser().getUserId() < 1) {
303 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
307 this.updateList(event.getUnlockedUser());
311 * Event observer for updated user data by administrator
313 * @param event Event being updated
315 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
316 // event should not be null
319 throw new NullPointerException("event is null"); //NOI18N
320 } else if (event.getUpdatedUser() == null) {
322 throw new NullPointerException("event.updatedUser is null"); //NOI18N
323 } else if (event.getUpdatedUser().getUserId() == null) {
325 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
326 } else if (event.getUpdatedUser().getUserId() < 1) {
328 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
332 this.updateList(event.getUpdatedUser());
339 * Event observer for when a bean helper has successfully created a user
340 * instance, means the user exists. If the user does not exist, this event
341 * should not fire but instead a proper exception must be thrown.
343 * @param event User created event
345 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
346 // Is the instance valid?
349 throw new NullPointerException("event is null"); //NOI18N
350 } else if (event.getCreatedUser() == null) {
352 throw new NullPointerException("event.createdUser is null"); //NOI18N
353 } else if (event.getCreatedUser().getUserId() == null) {
355 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
356 } else if (event.getCreatedUser().getUserId() < 1) {
358 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
362 final User user = event.getCreatedUser();
364 // Set all fields here
369 * Observer method for events being fired when the application's locale has
372 * @param event Event being fired
374 public void afterLocaleChangeEvent (@Observes final ObservableLocaleChangeEvent event) {
375 // Is the parameter valid?
378 throw new NullPointerException("event is null"); //NOI18N
379 } else if (event.getLocale() == null) {
381 throw new NullPointerException("event.locale is null"); //NOI18N
385 this.setLocale(event.getLocale());
389 * Event observer when user confirmed account.
391 * @param event Event being fired
393 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
394 // event should not be null
397 throw new NullPointerException("event is null"); //NOI18N
398 } else if (event.getConfirmedUser() == null) {
400 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
401 } else if (event.getConfirmedUser().getUserId() == null) {
403 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
404 } else if (event.getConfirmedUser().getUserId() < 1) {
406 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
410 this.updateList(event.getConfirmedUser());
414 * Event observer for logged-in user
416 * @param event Event instance
418 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
419 // event should not be null
422 throw new NullPointerException("event is null"); //NOI18N
423 } else if (event.getLoggedInUser() == null) {
425 throw new NullPointerException("event.registeredUser is null"); //NOI18N
426 } else if (event.getLoggedInUser().getUserId() == null) {
428 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
429 } else if (event.getLoggedInUser().getUserId() < 1) {
431 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
434 // "Cache" user instance
435 final User loggedInUser = event.getLoggedInUser();
437 // Copy all data to this bean
438 this.copyUser(loggedInUser);
442 * Event observer for user password changes
444 * @param event Event being fired
446 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
450 throw new NullPointerException("event is null"); //NOI18N
451 } else if (event.getUserPassword() == null) {
453 throw new NullPointerException("event.userPassword is null"); //NOI18N
454 } else if (event.getUserPassword().isEmpty()) {
456 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
460 this.setUserPassword(event.getUserPassword());
461 this.setUserPasswordRepeat(event.getUserPassword());
465 * Event observer for new user registrations
467 * @param event User registration event
469 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
470 // event should not be null
473 throw new NullPointerException("event is null"); //NOI18N
474 } else if (event.getRegisteredUser() == null) {
476 throw new NullPointerException("event.registeredUser is null"); //NOI18N
477 } else if (event.getRegisteredUser().getUserId() == null) {
479 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
480 } else if (event.getRegisteredUser().getUserId() < 1) {
482 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
486 final User registeredUser = event.getRegisteredUser();
488 // Copy all data from registered->user
489 this.copyUser(registeredUser);
495 this.updateList(registeredUser);
498 this.setUserId(registeredUser.getUserId());
502 * Method being call after user's password has been updated (and history
503 * entry has been created).
505 * @param event Event being observed
507 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
511 throw new NullPointerException("event is null"); //NOI18N
512 } else if (event.getPasswordHistory() == null) {
514 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
515 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
517 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
518 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
520 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
524 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
528 * Listens to fired event when user updated personal data
530 * @param event Event being fired
532 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
536 throw new NullPointerException("event is null"); //NOI18N
537 } else if (event.getUpdatedUser() == null) {
539 throw new NullPointerException("event.updatedUser is null"); //NOI18N
540 } else if (event.getUpdatedUser().getUserId() == null) {
542 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
543 } else if (event.getUpdatedUser().getUserId() < 1) {
545 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
549 this.updateList(event.getUpdatedUser());
553 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
554 public List<User> allUsers () {
555 return this.allUsers;
559 * Event observer for when a user name should be cleared
561 * @param event Event being fired
563 public void clearUserNameEvent (@Observes final ObservableClearUserNameEvent event) {
567 throw new NullPointerException("event is null"); //NOI18N
571 this.clearUserName();
575 * Event observer for when both user passwords should be cleared
577 * @param event Event being fired
579 public void clearUserPasswordEvent (@Observes final ObservableClearUserPasswordEvent event) {
583 throw new NullPointerException("event is null"); //NOI18N
587 this.clearUserPasswords();
591 public User createUserInstance (final boolean createContactData) {
592 // Required personal data must be set
593 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
595 // Create new user instance
596 final User user = new LoginUser();
598 // Is user name required?
599 if (!this.isUserNameRequired()) {
600 // Generate pseudo-random user name
601 // @TODO Refacture this to avoid EJB call
602 final String randomName = this.userBean.generateRandomUserName();
604 // Set it and inivisible profile
605 this.setUserName(randomName);
606 this.setUserProfileMode(ProfileMode.INVISIBLE);
608 // Generate random password
609 final String randomPassword = UserLoginUtils.createRandomPassword(JobsUserWebRequestController.MINIMUM_PASSWORD_LENGTH);
611 // Set random password
612 this.setUserPassword(randomPassword);
613 this.setUserPasswordRepeat(randomPassword);
616 // Set user name profile mode and locale
617 user.setUserName(this.getUserName());
618 user.setUserProfileMode(this.getUserProfileMode());
619 user.setUserLocale(this.getLocale());
621 // Is multiple registration page
622 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
623 // Create contact instance
624 final Contact contact = this.contactController.createContactInstance();
626 // Set contact in user
627 user.setUserContact(contact);
635 public User createUserLogin () {
637 if (this.getUserName() == null) {
639 throw new NullPointerException("userName is null"); //NOI18N
640 } else if (this.getUserName().isEmpty()) {
642 throw new IllegalStateException("userName is empty."); //NOI18N
645 // Create new user instance
646 final User user = new LoginUser();
648 // Update all data ...
649 user.setUserName(this.getUserName());
651 // Return the new instance
656 public String doChangePersonalData () {
657 // This method shall only be called if the user is logged-in
658 if (!this.userLoginController.isUserLoggedIn()) {
660 throw new IllegalStateException("User is not logged-in"); //NOI18N
661 } else if (!this.isRequiredChangePersonalDataSet()) {
662 // Not all required fields are set
663 throw new FaceletException("Not all required fields are set."); //NOI18N
664 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
665 // Password not matching
666 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
667 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
668 // Editing is not allowed
669 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
673 final User user = this.userLoginController.getLoggedInUser();
675 // Copy contact data to contact instance
676 this.contactController.updateContactDataFromController(user.getUserContact());
678 // It should be there, so run some tests on it
679 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
680 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
681 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
682 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
683 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
684 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
687 user.setUserProfileMode(this.getUserProfileMode());
689 // Send it to the EJB
690 final User updatedUser = this.userBean.updateUserPersonalData(user);
693 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
696 return "user_contact_data_saved"; //NOI18N
700 public User findUserById (final Long userId) throws UserNotFoundException {
701 // Validate parameter
702 if (null == userId) {
704 throw new NullPointerException("userId is null"); //NOI18N
705 } else if (userId < 1) {
707 throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
708 } else if (!this.userCache.containsKey(userId)) {
710 throw new UserNotFoundException(userId);
714 final User user = this.userCache.get(userId);
721 * Getter for filtered users list
723 * @return Filtered users list
725 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
726 public List<User> getFilteredUsers () {
727 return this.filteredUsers;
731 * Setter for filtered users list
733 * @param filteredUsers Filtered users list
735 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
736 public void setFilteredUsers (final List<User> filteredUsers) {
737 this.filteredUsers = filteredUsers;
745 public Long getUserId () {
752 * @param userId User id
754 public void setUserId (final Long userId) {
755 this.userId = userId;
759 * Getter for user name
763 public String getUserName () {
764 return this.userName;
768 * Setter for user name
770 * @param userName User name
772 public void setUserName (final String userName) {
773 this.userName = userName;
777 public String getUserPassword () {
778 return this.userPassword;
782 * Setter for clear-text user password
784 * @param userPassword Clear-text user password
786 public void setUserPassword (final String userPassword) {
787 this.userPassword = userPassword;
791 * Getter for clear-text user password repeated
793 * @return Clear-text user password repeated
795 public String getUserPasswordRepeat () {
796 return this.userPasswordRepeat;
800 * Setter for clear-text user password repeated
802 * @param userPasswordRepeat Clear-text user password repeated
804 public void setUserPasswordRepeat (final String userPasswordRepeat) {
805 this.userPasswordRepeat = userPasswordRepeat;
809 * Getter for user profile mode
811 * @return User profile mode
813 public ProfileMode getUserProfileMode () {
814 return this.userProfileMode;
818 * Setter for user profile mode
820 * @param userProfileMode User profile mode
822 public void setUserProfileMode (final ProfileMode userProfileMode) {
823 this.userProfileMode = userProfileMode;
827 public boolean ifBothPasswordsEmptyAllowed () {
828 // Check feature first
829 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
830 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
831 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
835 public boolean ifUserIdExists (final Long userId) {
836 // Validate parameter
837 if (null == userId) {
839 throw new NullPointerException("userId is null"); //NOI18N
840 } else if (userId < 1) {
842 throw new IllegalArgumentException("userId=" + userId + " is invalid."); //NOI18N
845 // Check if key is there
846 boolean isFound = this.userCache.containsKey(userId);
853 * Post-initialization of this class
856 public void init () {
858 if (!this.userCache.iterator().hasNext()) {
859 // Get whole list from EJB
860 final List<User> users = this.userBean.allUsers();
863 for (final User user : users) {
865 this.userCache.put(user.getUserId(), user);
869 // Is cache filled and list is empty
870 if ((this.userCache.iterator().hasNext()) && (this.allUsers.isEmpty())) {
872 for (final Cache.Entry<Long, User> currentEntry : this.userCache) {
874 this.allUsers.add(currentEntry.getValue());
878 this.allUsers.sort(new Comparator<User>() {
880 public int compare (final User user1, final User user2) {
881 return user1.getUserId() > user2.getUserId() ? 1 : user1.getUserId() < user2.getUserId() ? -1 : 0;
888 public boolean isContactFound (final Contact contact) {
889 // The contact must be valid
890 if (null == contact) {
892 throw new NullPointerException("contact is null"); //NOI18N
893 } else if (contact.getContactId() == null) {
895 throw new NullPointerException("contact.contactId is null"); //NOI18N
896 } else if (contact.getContactId() < 1) {
898 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
901 // Default is not found
902 boolean isFound = false;
904 // Loop through all entries
905 for (final User currentUser : this.allUsers()) {
906 // Compare both objects
907 if (Objects.equals(contact, currentUser.getUserContact())) {
919 public boolean isRequiredChangePersonalDataSet () {
920 return ((this.getUserProfileMode() != null) &&
921 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
922 (this.contactController.isRequiredChangePersonalDataSet()));
926 public boolean isRequiredPersonalDataSet () {
927 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
928 // Multiple registration page
929 return this.contactController.isRequiredPersonalDataSet();
931 // Single registration page
932 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
933 (this.getUserProfileMode() != null) &&
934 (this.contactController.isRequiredPersonalDataSet()) &&
935 (this.getUserPassword() != null) &&
936 (this.getUserPasswordRepeat() != null));
941 public boolean isSamePasswordEntered () {
942 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
946 public boolean isUserIdEmpty () {
947 return ((this.getUserId() == null) || (this.getUserId() == 0));
951 public boolean isUserNameRegistered (final User user) {
952 // Default is not found
953 boolean isFound = false;
956 for (final User currentUser : this.allUsers()) {
957 // Is same name found?
958 if (Objects.equals(user.getUserName(), currentUser.getUserName())) {
959 // Yes, then set flag and abort loop
970 public boolean isUserNameRequired () {
971 // Get context parameter
972 final String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
975 final boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
982 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
983 // Parameter must be valid
984 if (null == emailAddress) {
986 throw new NullPointerException("emailAddress is null"); //NOI18N
987 } else if (emailAddress.isEmpty()) {
989 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
995 // Try to lookup it in visible user list
996 for (final Cache.Entry<Long, User> currentUser : this.userCache) {
997 // Contact should be set
998 if (currentUser.getValue().getUserContact() == null) {
1000 throw new NullPointerException(MessageFormat.format("currentUser.userContact is null for user id {0}", currentUser.getKey())); //NOI18N
1001 } else if (currentUser.getValue().getUserContact().getContactEmailAddress() == null) {
1002 // Email address should be set
1003 throw new NullPointerException(MessageFormat.format("currentUser.userContact.contactEmailAddress is null for user id {0}", currentUser.getKey())); //NOI18N
1006 // Is the email address found?
1007 if (Objects.equals(currentUser.getValue().getUserContact().getContactEmailAddress(), emailAddress)) {
1008 // Copy to other variable
1009 user = currentUser.getValue();
1014 // Is it still null?
1016 // Not visible for the current user
1017 throw new UserEmailAddressNotFoundException(emailAddress);
1025 public User lookupUserById (final Long userId) throws UserNotFoundException {
1026 // Parameter must be valid
1027 if (null == userId) {
1029 throw new NullPointerException("userId is null"); //NOI18N
1030 } else if (userId < 1) {
1032 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
1038 // Try to lookup it in visible user list
1039 for (final Cache.Entry<Long, User> currentUser : this.userCache) {
1040 // Is the user id found?
1041 if (Objects.equals(currentUser.getKey(), userId)) {
1042 // Copy to other variable
1043 user = currentUser.getValue();
1048 // Is it still null?
1050 // Not visible for the current user
1051 throw new UserNotFoundException(userId);
1061 private void clear () {
1064 this.setUserId(null);
1065 this.setUserProfileMode(null);
1068 this.clearUserName();
1069 this.clearUserPasswords();
1070 this.setLocale(null);
1076 private void clearUserName () {
1078 this.setUserName(null);
1082 * Clears both user passwords
1084 private void clearUserPasswords () {
1086 this.setUserPassword(null);
1087 this.setUserPasswordRepeat(null);
1091 * Copies given user into the controller
1093 * @param user User instance
1095 private void copyUser (final User user) {
1096 // Make sure the instance is valid
1099 throw new NullPointerException("user is null"); //NOI18N
1100 } else if (user.getUserContact() == null) {
1102 throw new NullPointerException("user.userContact is null"); //NOI18N
1107 this.setUserId(user.getUserId());
1108 this.setUserProfileMode(user.getUserProfileMode());
1112 * Getter for locale instance
1114 * @return Locale instance
1116 private Locale getLocale () {
1121 * Setter for locale instance
1123 * @param locale Locale instance
1125 private void setLocale (final Locale locale) {
1126 this.locale = locale;
1130 * Removes user from all lists
1132 * @param user User to remove
1134 private void removeFromList (final User user) {
1135 // The user should be valid
1138 throw new NullPointerException("user is null"); //NOI18N
1139 } else if (user.getUserId() == null) {
1141 throw new NullPointerException("user.userId is null"); //NOI18N
1142 } else if (user.getUserId() < 1) {
1144 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1147 // Remove it from lists
1148 this.allUsers().remove(user);
1149 this.userCache.remove(user.getUserId());
1153 * Updates list with given user instance
1155 * @param user User instance
1157 private void updateList (final User user) {
1158 // The user should be valid
1161 throw new NullPointerException("user is null"); //NOI18N
1162 } else if (user.getUserId() == null) {
1164 throw new NullPointerException("user.userId is null"); //NOI18N
1165 } else if (user.getUserId() < 1) {
1167 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1168 } else if (user.getUserContact() == null) {
1170 throw new NullPointerException("user.userContact is null"); //NOI18N
1171 } else if (user.getUserContact().getContactId() == null) {
1173 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1174 } else if (user.getUserContact().getContactId() < 1) {
1176 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1180 this.userCache.put(user.getUserId(), user);
1181 this.allUsers.add(user);