2 * Copyright (C) 2016, 2017 Roland Häder
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.Iterator;
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;
82 * General contact controller
85 private JobsContactWebRequestController contactController;
91 private JobsFeaturesWebApplicationController featureController;
96 private Locale locale;
99 * Event being fired when user updated personal data
103 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
108 @EJB (lookup = "java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote")
109 private UserSessionBeanRemote userBean;
112 * A list of all user profiles
115 @NamedCache (cacheName = "userCache")
116 private Cache<Long, User> userCache;
124 * Login controller (bean)
127 private JobsUserLoginWebSessionController userLoginController;
132 private String userName;
138 @NamedCache (cacheName = "userNameCache")
139 private Cache<Long, String> userNameCache;
142 * User password (clear-text from web form)
144 private String userPassword;
147 * User password repeated (clear-text from web form)
149 private String userPasswordRepeat;
152 * Whether the user wants a public profile
154 private ProfileMode userProfileMode;
157 * Default constructor
159 public JobsUserWebRequestBean () {
160 // Call super constructor
165 * Event observer for newly added users by administrator
167 * @param event Event being fired
169 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
170 // event should not be null
173 throw new NullPointerException("event is null"); //NOI18N
174 } else if (event.getAddedUser() == null) {
176 throw new NullPointerException("event.addedUser is null"); //NOI18N
177 } else if (event.getAddedUser().getUserId() == null) {
179 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
180 } else if (event.getAddedUser().getUserId() < 1) {
182 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
186 this.updateList(event.getAddedUser());
192 this.setUserId(event.getAddedUser().getUserId());
196 * Event observer for deleted user accounts (by administrator)
198 * @param event Event being fired
200 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
201 // event should not be null
204 throw new NullPointerException("event is null"); //NOI18N
205 } else if (event.getDeletedUser() == null) {
207 throw new NullPointerException("event.deletedUser is null"); //NOI18N
208 } else if (event.getDeletedUser().getUserId() == null) {
210 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
211 } else if (event.getDeletedUser().getUserId() < 1) {
213 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
217 this.removeFromList(event.getDeletedUser());
224 * Event observer for linked users with existing contact data
226 * @param event Event being fired
228 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
229 // event should not be null
232 throw new NullPointerException("event is null"); //NOI18N
233 } else if (event.getLinkedUser() == null) {
235 throw new NullPointerException("event.linkedUser is null"); //NOI18N
236 } else if (event.getLinkedUser().getUserId() == null) {
238 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
239 } else if (event.getLinkedUser().getUserId() < 1) {
241 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
245 this.updateList(event.getLinkedUser());
251 this.setUserId(event.getLinkedUser().getUserId());
255 * Event observer for locked users
257 * @param event Event being fired
259 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
260 // event should not be null
263 throw new NullPointerException("event is null"); //NOI18N
264 } else if (event.getLockedUser() == null) {
266 throw new NullPointerException("event.lockedUser is null"); //NOI18N
267 } else if (event.getLockedUser().getUserId() == null) {
269 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
270 } else if (event.getLockedUser().getUserId() < 1) {
272 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
276 this.updateList(event.getLockedUser());
280 * Event observer for unlocked users
282 * @param event Event being fired
284 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
285 // event should not be null
288 throw new NullPointerException("event is null"); //NOI18N
289 } else if (event.getUnlockedUser() == null) {
291 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
292 } else if (event.getUnlockedUser().getUserId() == null) {
294 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
295 } else if (event.getUnlockedUser().getUserId() < 1) {
297 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
301 this.updateList(event.getUnlockedUser());
305 * Event observer for updated user data by administrator
307 * @param event Event being updated
309 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
310 // event should not be null
313 throw new NullPointerException("event is null"); //NOI18N
314 } else if (event.getUpdatedUser() == null) {
316 throw new NullPointerException("event.updatedUser is null"); //NOI18N
317 } else if (event.getUpdatedUser().getUserId() == null) {
319 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
320 } else if (event.getUpdatedUser().getUserId() < 1) {
322 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
326 this.updateList(event.getUpdatedUser());
333 * Event observer for when a bean helper has successfully created a user
334 * instance, means the user exists. If the user does not exist, this event
335 * should not fire but instead a proper exception must be thrown.
337 * @param event User created event
339 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
340 // Is the instance valid?
343 throw new NullPointerException("event is null"); //NOI18N
344 } else if (event.getCreatedUser() == null) {
346 throw new NullPointerException("event.createdUser is null"); //NOI18N
347 } else if (event.getCreatedUser().getUserId() == null) {
349 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
350 } else if (event.getCreatedUser().getUserId() < 1) {
352 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
356 final User user = event.getCreatedUser();
358 // Set all fields here
363 * Observer method for events being fired when the application's locale has
366 * @param event Event being fired
368 public void afterLocaleChangeEvent (@Observes final ObservableLocaleChangeEvent event) {
369 // Is the parameter valid?
372 throw new NullPointerException("event is null");
373 } else if (event.getLocale() == null) {
375 throw new NullPointerException("event.locale is null");
379 this.setLocale(event.getLocale());
383 * Event observer when user confirmed account.
385 * @param event Event being fired
387 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
388 // event should not be null
391 throw new NullPointerException("event is null"); //NOI18N
392 } else if (event.getConfirmedUser() == null) {
394 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
395 } else if (event.getConfirmedUser().getUserId() == null) {
397 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
398 } else if (event.getConfirmedUser().getUserId() < 1) {
400 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
404 this.updateList(event.getConfirmedUser());
408 * Event observer for logged-in user
410 * @param event Event instance
412 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
413 // event should not be null
416 throw new NullPointerException("event is null"); //NOI18N
417 } else if (event.getLoggedInUser() == null) {
419 throw new NullPointerException("event.registeredUser is null"); //NOI18N
420 } else if (event.getLoggedInUser().getUserId() == null) {
422 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
423 } else if (event.getLoggedInUser().getUserId() < 1) {
425 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
428 // "Cache" user instance
429 final User loggedInUser = event.getLoggedInUser();
431 // Copy all data to this bean
432 this.copyUser(loggedInUser);
436 * Event observer for user password changes
438 * @param event Event being fired
440 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
444 throw new NullPointerException("event is null"); //NOI18N
445 } else if (event.getUserPassword() == null) {
447 throw new NullPointerException("event.userPassword is null"); //NOI18N
448 } else if (event.getUserPassword().isEmpty()) {
450 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
454 this.setUserPassword(event.getUserPassword());
455 this.setUserPasswordRepeat(event.getUserPassword());
459 * Event observer for new user registrations
461 * @param event User registration event
463 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
464 // event should not be null
467 throw new NullPointerException("event is null"); //NOI18N
468 } else if (event.getRegisteredUser() == null) {
470 throw new NullPointerException("event.registeredUser is null"); //NOI18N
471 } else if (event.getRegisteredUser().getUserId() == null) {
473 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
474 } else if (event.getRegisteredUser().getUserId() < 1) {
476 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
480 final User registeredUser = event.getRegisteredUser();
482 // Copy all data from registered->user
483 this.copyUser(registeredUser);
489 this.updateList(registeredUser);
492 this.addUserName(registeredUser);
495 this.setUserId(registeredUser.getUserId());
499 * Method being call after user's password has been updated (and history
500 * entry has been created).
502 * @param event Event being observed
504 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
508 throw new NullPointerException("event is null"); //NOI18N
509 } else if (event.getPasswordHistory() == null) {
511 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
512 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
514 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
515 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
517 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
521 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
525 * Listens to fired event when user updated personal data
527 * @param event Event being fired
529 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
533 throw new NullPointerException("event is null"); //NOI18N
534 } else if (event.getUpdatedUser() == null) {
536 throw new NullPointerException("event.updatedUser is null"); //NOI18N
537 } else if (event.getUpdatedUser().getUserId() == null) {
539 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
540 } else if (event.getUpdatedUser().getUserId() < 1) {
542 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
546 this.updateList(event.getUpdatedUser());
550 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
551 public List<User> allUsers () {
553 final List<User> list = new LinkedList<>();
556 final Iterator<Cache.Entry<Long, User>> iterator = this.userCache.iterator();
559 while (iterator.hasNext()) {
561 final Cache.Entry<Long, User> next = iterator.next();
564 list.add(next.getValue());
572 * Event observer for when a user name should be cleared
574 * @param event Event being fired
576 public void clearUserNameEvent (@Observes final ObservableClearUserNameEvent event) {
580 throw new NullPointerException("event is null");
584 this.clearUserName();
588 * Event observer for when both user passwords should be cleared
590 * @param event Event being fired
592 public void clearUserPasswordEvent (@Observes final ObservableClearUserPasswordEvent event) {
596 throw new NullPointerException("event is null");
600 this.clearUserPasswords();
604 public User createUserInstance (final boolean createContactData) {
605 // Required personal data must be set
606 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
608 // Create new user instance
609 final User user = new LoginUser();
611 // Is user name required?
612 if (!this.isUserNameRequired()) {
613 // Generate pseudo-random user name
614 String randomName = this.userBean.generateRandomUserName();
616 // Set it and inivisible profile
617 this.setUserName(randomName);
618 this.setUserProfileMode(ProfileMode.INVISIBLE);
620 // Generate random password
621 String randomPassword = UserLoginUtils.createRandomPassword(JobsUserWebRequestController.MINIMUM_PASSWORD_LENGTH);
623 // Set random password
624 this.setUserPassword(randomPassword);
625 this.setUserPasswordRepeat(randomPassword);
628 // Set user name profile mode and locale
629 user.setUserName(this.getUserName());
630 user.setUserProfileMode(this.getUserProfileMode());
631 user.setUserLocale(this.getLocale());
633 // Is multiple registration page
634 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
635 // Create contact instance
636 final Contact contact = this.contactController.createContactInstance();
638 // Set contact in user
639 user.setUserContact(contact);
647 public User createUserLogin () {
649 if (this.getUserName() == null) {
651 throw new NullPointerException("userName is null"); //NOI18N
652 } else if (this.getUserName().isEmpty()) {
654 throw new IllegalStateException("userName is empty."); //NOI18N
657 // Create new user instance
658 final User user = new LoginUser();
660 // Update all data ...
661 user.setUserName(this.getUserName());
663 // Return the new instance
668 public String doChangePersonalData () {
669 // This method shall only be called if the user is logged-in
670 if (!this.userLoginController.isUserLoggedIn()) {
672 throw new IllegalStateException("User is not logged-in"); //NOI18N
673 } else if (!this.isRequiredChangePersonalDataSet()) {
674 // Not all required fields are set
675 throw new FaceletException("Not all required fields are set."); //NOI18N
676 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
677 // Password not matching
678 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
679 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
680 // Editing is not allowed
681 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
685 final User user = this.userLoginController.getLoggedInUser();
687 // Copy contact data to contact instance
688 this.contactController.updateContactDataFromController(user.getUserContact());
690 // It should be there, so run some tests on it
691 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
692 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
693 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
694 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
695 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
696 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
699 user.setUserProfileMode(this.getUserProfileMode());
701 // Send it to the EJB
702 final User updatedUser = this.userBean.updateUserPersonalData(user);
705 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
708 return "user_contact_data_saved"; //NOI18N
716 public Long getUserId () {
723 * @param userId User id
725 public void setUserId (final Long userId) {
726 this.userId = userId;
730 * Getter for user name
734 public String getUserName () {
735 return this.userName;
739 * Setter for user name
741 * @param userName User name
743 public void setUserName (final String userName) {
744 this.userName = userName;
748 public String getUserPassword () {
749 return this.userPassword;
753 * Setter for clear-text user password
755 * @param userPassword Clear-text user password
757 public void setUserPassword (final String userPassword) {
758 this.userPassword = userPassword;
762 * Getter for clear-text user password repeated
764 * @return Clear-text user password repeated
766 public String getUserPasswordRepeat () {
767 return this.userPasswordRepeat;
771 * Setter for clear-text user password repeated
773 * @param userPasswordRepeat Clear-text user password repeated
775 public void setUserPasswordRepeat (final String userPasswordRepeat) {
776 this.userPasswordRepeat = userPasswordRepeat;
780 * Getter for user profile mode
782 * @return User profile mode
784 public ProfileMode getUserProfileMode () {
785 return this.userProfileMode;
789 * Setter for user profile mode
791 * @param userProfileMode User profile mode
793 public void setUserProfileMode (final ProfileMode userProfileMode) {
794 this.userProfileMode = userProfileMode;
798 public boolean ifBothPasswordsEmptyAllowed () {
799 // Check feature first
800 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
801 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
802 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
806 * Post-initialization of this class
809 public void init () {
811 if (!this.userCache.iterator().hasNext()) {
813 final List<User> list = this.userBean.allUsers();
816 for (final Iterator<User> iterator = list.iterator(); iterator.hasNext();) {
818 final User next = iterator.next();
821 this.userCache.put(next.getUserId(), next);
822 this.userNameCache.put(next.getUserId(), next.getUserName());
828 public boolean isContactFound (final Contact contact) {
829 // The contact must be valid
830 if (null == contact) {
832 throw new NullPointerException("contact is null"); //NOI18N
833 } else if (contact.getContactId() == null) {
835 throw new NullPointerException("contact.contactId is null"); //NOI18N
836 } else if (contact.getContactId() < 1) {
838 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
841 // Default is not found
842 boolean isFound = false;
845 final Iterator<User> iterator = this.allUsers().iterator();
847 // Loop through all entries
848 while (iterator.hasNext()) {
850 final User next = iterator.next();
852 // Compare both objects
853 if (Objects.equals(contact, next.getUserContact())) {
865 public boolean isPublicUserProfileEnabled () {
866 // Get context parameter
867 final String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
870 final boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
872 // This requires user names being enabled, too.
873 if ((isEnabled) && (!this.isUserNameRequired())) {
874 // Not valid state, users must be able to modify their profile, especially when it is public
875 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
883 public boolean isRequiredChangePersonalDataSet () {
884 return ((this.getUserProfileMode() != null) &&
885 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
886 (this.contactController.isRequiredChangePersonalDataSet()));
890 public boolean isRequiredPersonalDataSet () {
891 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
892 // Multiple registration page
893 return this.contactController.isRequiredPersonalDataSet();
895 // Single registration page
896 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
897 (this.getUserProfileMode() != null) &&
898 (this.contactController.isRequiredPersonalDataSet()) &&
899 (this.getUserPassword() != null) &&
900 (this.getUserPasswordRepeat() != null));
905 public boolean isSamePasswordEntered () {
906 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
910 public boolean isUserIdEmpty () {
911 return ((this.getUserId() == null) || (this.getUserId() == 0));
915 public boolean isUserNameRegistered (final User user) {
916 return ((this.userNameCache instanceof List) && (this.userNameCache.containsKey(user.getUserId())));
920 public boolean isUserNameRequired () {
921 // Get context parameter
922 final String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
925 final boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
932 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
933 // Parameter must be valid
934 if (null == emailAddress) {
936 throw new NullPointerException("emailAddress is null"); //NOI18N
937 } else if (emailAddress.isEmpty()) {
939 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
945 // Try to lookup it in visible user list
946 for (final Iterator<Cache.Entry<Long, User>> iterator = this.userCache.iterator(); iterator.hasNext();) {
948 final Cache.Entry<Long, User> next = iterator.next();
950 // Contact should be set
951 if (next.getValue().getUserContact() == null) {
953 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getKey())); //NOI18N
954 } else if (next.getValue().getUserContact().getContactEmailAddress() == null) {
955 // Email address should be set
956 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getKey())); //NOI18N
959 // Is the email address found?
960 if (Objects.equals(next.getValue().getUserContact().getContactEmailAddress(), emailAddress)) {
961 // Copy to other variable
962 user = next.getValue();
969 // Not visible for the current user
970 throw new UserEmailAddressNotFoundException(emailAddress);
978 public User lookupUserById (final Long userId) throws UserNotFoundException {
979 // Parameter must be valid
980 if (null == userId) {
982 throw new NullPointerException("userId is null"); //NOI18N
983 } else if (userId < 1) {
985 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
991 // Try to lookup it in visible user list
992 for (final Iterator<Cache.Entry<Long, User>> iterator = this.userCache.iterator(); iterator.hasNext();) {
994 final Cache.Entry<Long, User> next = iterator.next();
996 // Is the user id found?
997 if (Objects.equals(next.getKey(), userId)) {
998 // Copy to other variable
999 user = next.getValue();
1004 // Is it still null?
1006 // Not visible for the current user
1007 throw new UserNotFoundException(userId);
1015 * Adds user's name to bean's internal list. It also updates the public user
1016 * list if the user has decided to have a public account,
1018 * @param user User instance
1020 private void addUserName (final User user) {
1021 // Make sure the entry is not added yet
1022 if (this.userNameCache.containsKey(user.getUserId())) {
1024 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1028 this.userNameCache.put(user.getUserId(), user.getUserName());
1034 private void clear () {
1037 this.setUserId(null);
1038 this.setUserProfileMode(null);
1041 this.clearUserName();
1042 this.clearUserPasswords();
1043 this.setLocale(null);
1049 private void clearUserName () {
1051 this.setUserName(null);
1055 * Clears both user passwords
1057 private void clearUserPasswords () {
1059 this.setUserPassword(null);
1060 this.setUserPasswordRepeat(null);
1064 * Copies given user into the controller
1066 * @param user User instance
1068 private void copyUser (final User user) {
1069 // Make sure the instance is valid
1072 throw new NullPointerException("user is null"); //NOI18N
1073 } else if (user.getUserContact() == null) {
1075 throw new NullPointerException("user.userContact is null"); //NOI18N
1080 this.setUserId(user.getUserId());
1081 this.setUserProfileMode(user.getUserProfileMode());
1085 * Getter for locale instance
1087 * @return Locale instance
1089 private Locale getLocale () {
1094 * Setter for locale instance
1096 * @param locale Locale instance
1098 private void setLocale (final Locale locale) {
1099 this.locale = locale;
1103 * Removes user from all lists
1105 * @param user User to remove
1107 private void removeFromList (final User user) {
1108 // The user should be valid
1111 throw new NullPointerException("user is null"); //NOI18N
1112 } else if (user.getUserId() == null) {
1114 throw new NullPointerException("user.userId is null"); //NOI18N
1115 } else if (user.getUserId() < 1) {
1117 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1120 // Remove it from lists
1121 this.userCache.remove(user.getUserId());
1123 // Remove name from list
1124 this.userNameCache.remove(user.getUserId());
1128 * Updates list with given user instance
1130 * @param user User instance
1132 private void updateList (final User user) {
1133 // The user should be valid
1136 throw new NullPointerException("user is null"); //NOI18N
1137 } else if (user.getUserId() == null) {
1139 throw new NullPointerException("user.userId is null"); //NOI18N
1140 } else if (user.getUserId() < 1) {
1142 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1143 } else if (user.getUserContact() == null) {
1145 throw new NullPointerException("user.userContact is null"); //NOI18N
1146 } else if (user.getUserContact().getContactId() == null) {
1148 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1149 } else if (user.getUserContact().getContactId() < 1) {
1151 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1155 this.userCache.put(user.getUserId(), user);