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 java.text.MessageFormat;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Locale;
23 import java.util.Objects;
24 import javax.annotation.PostConstruct;
26 import javax.enterprise.context.SessionScoped;
27 import javax.enterprise.event.Event;
28 import javax.enterprise.event.Observes;
29 import javax.enterprise.inject.Any;
30 import javax.faces.context.FacesContext;
31 import javax.faces.view.facelets.FaceletException;
32 import javax.inject.Inject;
33 import javax.inject.Named;
34 import org.mxchange.jcontacts.contact.Contact;
35 import org.mxchange.jcoreee.events.locale.ObservableLocaleChangeEvent;
36 import org.mxchange.jjobs.beans.BaseJobsController;
37 import org.mxchange.jjobs.beans.contact.JobsContactWebSessionController;
38 import org.mxchange.jjobs.beans.features.JobsFeaturesWebApplicationController;
39 import org.mxchange.jjobs.beans.localization.JobsLocalizationSessionController;
40 import org.mxchange.jjobs.beans.user.login.JobsUserLoginWebSessionController;
41 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
42 import org.mxchange.jusercore.events.user.clear.password.ObservableClearUserPasswordEvent;
43 import org.mxchange.jusercore.events.user.clear.username.ObservableClearUserNameEvent;
44 import org.mxchange.jusercore.events.user.created.ObservableCreatedUserEvent;
45 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
46 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
47 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
48 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
49 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
50 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
51 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
52 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
53 import org.mxchange.jusercore.exceptions.UserNotFoundException;
54 import org.mxchange.jusercore.model.user.LoginUser;
55 import org.mxchange.jusercore.model.user.User;
56 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
57 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
58 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
59 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
60 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
61 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
62 import org.mxchange.juserlogincore.exceptions.UserPasswordMismatchException;
63 import org.mxchange.juserlogincore.login.UserLoginUtils;
66 * A user controller (bean)
68 * @author Roland Häder<roland@mxchange.org>
70 @Named ("userController")
72 public class JobsUserWebSessionBean extends BaseJobsController implements JobsUserWebSessionController {
77 private static final long serialVersionUID = 542_145_347_916L;
80 * General contact controller
83 private JobsContactWebSessionController contactController;
89 private JobsFeaturesWebApplicationController featureController;
94 private Locale locale;
97 * Localization controller
100 private JobsLocalizationSessionController localizationController;
103 * Event being fired when user updated personal data
107 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
112 @EJB (lookup = "java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote")
113 private UserSessionBeanRemote userBean;
121 * A list of all user profiles
123 private List<User> userList;
126 * Login controller (bean)
129 private JobsUserLoginWebSessionController userLoginController;
134 private String userName;
139 private List<String> userNameList;
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 * A list of all public user profiles
159 * @TODO Hmm, makes that sense? Having visible user list in current
160 * (session-scoped) user's visible user list?
162 private List<User> visibleUserList;
165 * Default constructor
167 public JobsUserWebSessionBean () {
168 // Call super constructor
173 * Event observer for newly added users by administrator
175 * @param event Event being fired
177 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
178 // event should not be null
181 throw new NullPointerException("event is null"); //NOI18N
182 } else if (event.getAddedUser() == null) {
184 throw new NullPointerException("event.addedUser is null"); //NOI18N
185 } else if (event.getAddedUser().getUserId() == null) {
187 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
188 } else if (event.getAddedUser().getUserId() < 1) {
190 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
194 this.updateList(event.getAddedUser());
200 this.setUserId(event.getAddedUser().getUserId());
204 * Event observer for deleted user accounts (by administrator)
206 * @param event Event being fired
208 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
209 // event should not be null
212 throw new NullPointerException("event is null"); //NOI18N
213 } else if (event.getDeletedUser() == null) {
215 throw new NullPointerException("event.deletedUser is null"); //NOI18N
216 } else if (event.getDeletedUser().getUserId() == null) {
218 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
219 } else if (event.getDeletedUser().getUserId() < 1) {
221 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
225 this.removeFromList(event.getDeletedUser());
232 * Event observer for linked users with existing contact data
234 * @param event Event being fired
236 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
237 // event should not be null
240 throw new NullPointerException("event is null"); //NOI18N
241 } else if (event.getLinkedUser() == null) {
243 throw new NullPointerException("event.linkedUser is null"); //NOI18N
244 } else if (event.getLinkedUser().getUserId() == null) {
246 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
247 } else if (event.getLinkedUser().getUserId() < 1) {
249 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
253 this.updateList(event.getLinkedUser());
259 this.setUserId(event.getLinkedUser().getUserId());
263 * Event observer for locked users
265 * @param event Event being fired
267 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
268 // event should not be null
271 throw new NullPointerException("event is null"); //NOI18N
272 } else if (event.getLockedUser() == null) {
274 throw new NullPointerException("event.lockedUser is null"); //NOI18N
275 } else if (event.getLockedUser().getUserId() == null) {
277 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
278 } else if (event.getLockedUser().getUserId() < 1) {
280 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
284 this.updateList(event.getLockedUser());
288 * Event observer for unlocked users
290 * @param event Event being fired
292 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
293 // event should not be null
296 throw new NullPointerException("event is null"); //NOI18N
297 } else if (event.getUnlockedUser() == null) {
299 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
300 } else if (event.getUnlockedUser().getUserId() == null) {
302 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
303 } else if (event.getUnlockedUser().getUserId() < 1) {
305 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
309 this.updateList(event.getUnlockedUser());
313 * Event observer for updated user data by administrator
315 * @param event Event being updated
317 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
318 // event should not be null
321 throw new NullPointerException("event is null"); //NOI18N
322 } else if (event.getUpdatedUser() == null) {
324 throw new NullPointerException("event.updatedUser is null"); //NOI18N
325 } else if (event.getUpdatedUser().getUserId() == null) {
327 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
328 } else if (event.getUpdatedUser().getUserId() < 1) {
330 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
334 this.updateList(event.getUpdatedUser());
341 * Event observer for when a bean helper has successfully created a user
342 * instance, means the user exists. If the user does not exist, this event
343 * should not fire but instead a proper exception must be thrown.
345 * @param event User created event
347 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
348 // Is the instance valid?
351 throw new NullPointerException("event is null"); //NOI18N
352 } else if (event.getCreatedUser() == null) {
354 throw new NullPointerException("event.createdUser is null"); //NOI18N
355 } else if (event.getCreatedUser().getUserId() == null) {
357 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
358 } else if (event.getCreatedUser().getUserId() < 1) {
360 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
364 User user = event.getCreatedUser();
366 // Set all fields here
371 * Observer method for events being fired when the application's locale has
374 * @param event Event being fired
376 public void afterLocaleChangeEvent (@Observes final ObservableLocaleChangeEvent event) {
377 // Is the parameter valid?
380 throw new NullPointerException("event is null");
381 } else if (event.getLocale() == null) {
383 throw new NullPointerException("event.locale is null");
387 this.setLocale(event.getLocale());
391 * Event observer when user confirmed account.
393 * @param event Event being fired
395 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
396 // event should not be null
399 throw new NullPointerException("event is null"); //NOI18N
400 } else if (event.getConfirmedUser() == null) {
402 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
403 } else if (event.getConfirmedUser().getUserId() == null) {
405 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
406 } else if (event.getConfirmedUser().getUserId() < 1) {
408 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
412 this.updateList(event.getConfirmedUser());
416 * Event observer for logged-in user
418 * @param event Event instance
420 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
421 // event should not be null
424 throw new NullPointerException("event is null"); //NOI18N
425 } else if (event.getLoggedInUser() == null) {
427 throw new NullPointerException("event.registeredUser is null"); //NOI18N
428 } else if (event.getLoggedInUser().getUserId() == null) {
430 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
431 } else if (event.getLoggedInUser().getUserId() < 1) {
433 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
436 // "Cache" user instance
437 User loggedInUser = event.getLoggedInUser();
439 // Copy all data to this bean
440 this.copyUser(loggedInUser);
442 // Is the user visible?
443 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
444 // Yes, then add user
445 this.visibleUserList.add(loggedInUser);
450 * Event observer for user password changes
452 * @param event Event being fired
454 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
458 throw new NullPointerException("event is null"); //NOI18N
459 } else if (event.getUserPassword() == null) {
461 throw new NullPointerException("event.userPassword is null"); //NOI18N
462 } else if (event.getUserPassword().isEmpty()) {
464 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
468 this.setUserPassword(event.getUserPassword());
469 this.setUserPasswordRepeat(event.getUserPassword());
473 * Event observer for new user registrations
475 * @param event User registration event
477 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
478 // event should not be null
481 throw new NullPointerException("event is null"); //NOI18N
482 } else if (event.getRegisteredUser() == null) {
484 throw new NullPointerException("event.registeredUser is null"); //NOI18N
485 } else if (event.getRegisteredUser().getUserId() == null) {
487 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
488 } else if (event.getRegisteredUser().getUserId() < 1) {
490 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
494 User registeredUser = event.getRegisteredUser();
496 // Copy all data from registered->user
497 this.copyUser(registeredUser);
503 this.updateList(registeredUser);
506 this.addUserName(registeredUser);
508 // Is the account public?
509 if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
510 // Also add it to this list
511 this.visibleUserList.add(registeredUser);
515 this.setUserId(registeredUser.getUserId());
519 * Method being call after user's password has been updated (and history
520 * entry has been created).
522 * @param event Event being observed
524 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
528 throw new NullPointerException("event is null"); //NOI18N
529 } else if (event.getPasswordHistory() == null) {
531 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
532 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
534 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
535 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
537 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
541 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
545 * Listens to fired event when user updated personal data
547 * @param event Event being fired
549 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
553 throw new NullPointerException("event is null"); //NOI18N
554 } else if (event.getUpdatedUser() == null) {
556 throw new NullPointerException("event.updatedUser is null"); //NOI18N
557 } else if (event.getUpdatedUser().getUserId() == null) {
559 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
560 } else if (event.getUpdatedUser().getUserId() < 1) {
562 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
566 this.updateList(event.getUpdatedUser());
570 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
571 public List<User> allUsers () {
573 return this.userList;
577 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
578 public List<User> allVisibleUsers () {
580 return this.visibleUserList;
584 * Event observer for when a user name should be cleared
586 * @param event Event being fired
588 public void clearUserNameEvent (@Observes final ObservableClearUserNameEvent event) {
592 throw new NullPointerException("event is null");
596 this.clearUserName();
600 * Event observer for when both user passwords should be cleared
602 * @param event Event being fired
604 public void clearUserPasswordEvent (@Observes final ObservableClearUserPasswordEvent event) {
608 throw new NullPointerException("event is null");
612 this.clearUserPasswords();
616 public User createUserInstance (final boolean createContactData) {
618 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
620 // Required personal data must be set
621 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
623 // Create new user instance
624 User user = new LoginUser();
626 // Is user name required?
627 if (!this.isUserNameRequired()) {
628 // Generate pseudo-random user name
629 String randomName = this.userBean.generateRandomUserName();
631 // Set it and inivisible profile
632 this.setUserName(randomName);
633 this.setUserProfileMode(ProfileMode.INVISIBLE);
635 // Generate random password
636 String randomPassword = UserLoginUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
638 // Set random password
639 this.setUserPassword(randomPassword);
640 this.setUserPasswordRepeat(randomPassword);
643 // Set user name profile mode and locale
644 user.setUserName(this.getUserName());
645 user.setUserProfileMode(this.getUserProfileMode());
646 user.setUserLocale(this.getLocale());
648 // Is multiple registration page
649 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
650 // Create contact instance
651 Contact contact = this.contactController.createContactInstance();
654 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
655 // Set contact in user
656 user.setUserContact(contact);
660 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
666 public User createUserLogin () {
668 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
671 if (this.getUserName() == null) {
673 throw new NullPointerException("userName is null"); //NOI18N
674 } else if (this.getUserName().isEmpty()) {
676 throw new IllegalStateException("userName is empty."); //NOI18N
679 // Create new user instance
680 User user = new LoginUser();
682 // Update all data ...
683 user.setUserName(this.getUserName());
686 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
687 // Return the new instance
692 public String doChangePersonalData () {
693 // This method shall only be called if the user is logged-in
694 if (!this.userLoginController.isUserLoggedIn()) {
696 throw new IllegalStateException("User is not logged-in"); //NOI18N
697 } else if (!this.isRequiredChangePersonalDataSet()) {
698 // Not all required fields are set
699 throw new FaceletException("Not all required fields are set."); //NOI18N
700 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
701 // Password not matching
702 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
703 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
704 // Editing is not allowed
705 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
709 User user = this.userLoginController.getLoggedInUser();
711 // Copy contact data to contact instance
712 this.contactController.updateContactDataFromController(user.getUserContact());
714 // It should be there, so run some tests on it
715 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
716 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
717 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
718 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
719 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
720 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
723 user.setUserProfileMode(this.getUserProfileMode());
725 // Send it to the EJB
726 User updatedUser = this.userBean.updateUserPersonalData(user);
729 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
732 return "user_contact_data_saved"; //NOI18N
740 public Long getUserId () {
747 * @param userId User id
749 public void setUserId (final Long userId) {
750 this.userId = userId;
754 * Getter for user name
758 public String getUserName () {
759 return this.userName;
763 * Setter for user name
765 * @param userName User name
767 public void setUserName (final String userName) {
768 this.userName = userName;
772 public String getUserPassword () {
773 return this.userPassword;
777 * Setter for clear-text user password
779 * @param userPassword Clear-text user password
781 public void setUserPassword (final String userPassword) {
782 this.userPassword = userPassword;
786 * Getter for clear-text user password repeated
788 * @return Clear-text user password repeated
790 public String getUserPasswordRepeat () {
791 return this.userPasswordRepeat;
795 * Setter for clear-text user password repeated
797 * @param userPasswordRepeat Clear-text user password repeated
799 public void setUserPasswordRepeat (final String userPasswordRepeat) {
800 this.userPasswordRepeat = userPasswordRepeat;
804 * Getter for user profile mode
806 * @return User profile mode
808 public ProfileMode getUserProfileMode () {
809 return this.userProfileMode;
813 * Setter for user profile mode
815 * @param userProfileMode User profile mode
817 public void setUserProfileMode (final ProfileMode userProfileMode) {
818 this.userProfileMode = userProfileMode;
822 public boolean ifBothPasswordsEmptyAllowed () {
823 // Check feature first
824 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
825 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
826 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
830 * Post-initialization of this class
833 public void init () {
834 // Initialize user list
835 this.userList = this.userBean.allUsers();
837 // Get full user name list for reducing EJB calls
838 this.userNameList = this.userBean.getUserNameList();
840 // Is the user logged-in?
841 if (this.userLoginController.isUserLoggedIn()) {
842 // Is logged-in, so load also users visible to memebers
843 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
845 // Initialize user list
846 this.visibleUserList = this.userBean.allPublicUsers();
851 public boolean isContactFound (final Contact contact) {
852 // The contact must be valid
853 if (null == contact) {
855 throw new NullPointerException("contact is null"); //NOI18N
856 } else if (contact.getContactId() == null) {
858 throw new NullPointerException("contact.contactId is null"); //NOI18N
859 } else if (contact.getContactId() < 1) {
861 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
864 // Default is not found
865 boolean isFound = false;
868 Iterator<User> iterator = this.allUsers().iterator();
870 // Loop through all entries
871 while (iterator.hasNext()) {
873 User next = iterator.next();
875 // Compare both objects
876 if (Objects.equals(contact, next.getUserContact())) {
888 public boolean isPublicUserProfileEnabled () {
889 // Get context parameter
890 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
893 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
895 // This requires user names being enabled, too.
896 if ((isEnabled) && (!this.isUserNameRequired())) {
897 // Not valid state, users must be able to modify their profile, especially when it is public
898 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
906 public boolean isRequiredChangePersonalDataSet () {
907 return ((this.getUserProfileMode() != null) &&
908 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
909 (this.contactController.isRequiredChangePersonalDataSet()));
913 public boolean isRequiredPersonalDataSet () {
914 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
915 // Multiple registration page
916 return this.contactController.isRequiredPersonalDataSet();
918 // Single registration page
919 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
920 (this.getUserProfileMode() != null) &&
921 (this.contactController.isRequiredPersonalDataSet()) &&
922 (this.getUserPassword() != null) &&
923 (this.getUserPasswordRepeat() != null));
928 public boolean isSamePasswordEntered () {
929 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
933 public boolean isUserIdEmpty () {
934 return ((this.getUserId() == null) || (this.getUserId() == 0));
938 public boolean isUserNameRegistered (final User user) {
939 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
943 public boolean isUserNameRequired () {
944 // Get context parameter
945 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
948 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
955 public boolean isVisibleUserFound () {
956 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
960 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
961 // Parameter must be valid
962 if (null == emailAddress) {
964 throw new NullPointerException("emailAddress is null"); //NOI18N
965 } else if (emailAddress.isEmpty()) {
967 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
973 // Try to lookup it in visible user list
974 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
976 User next = iterator.next();
978 // Contact should be set
979 if (next.getUserContact() == null) {
981 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
982 } else if (next.getUserContact().getContactEmailAddress() == null) {
983 // Email address should be set
984 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
987 // Is the email address found?
988 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
989 // Copy to other variable
997 // Not visible for the current user
998 throw new UserEmailAddressNotFoundException(emailAddress);
1006 public User lookupUserById (final Long userId) throws UserNotFoundException {
1007 // Parameter must be valid
1008 if (null == userId) {
1010 throw new NullPointerException("userId is null"); //NOI18N
1011 } else if (userId < 1) {
1013 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
1019 // Try to lookup it in visible user list
1020 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
1022 User next = iterator.next();
1024 // Is the user id found?
1025 if (Objects.equals(next.getUserId(), userId)) {
1026 // Copy to other variable
1032 // Is it still null?
1034 // Not visible for the current user
1035 throw new UserNotFoundException(userId);
1043 * Adds user's name to bean's internal list. It also updates the public user
1044 * list if the user has decided to have a public account,
1046 * @param user User instance
1048 private void addUserName (final User user) {
1049 // Make sure the entry is not added yet
1050 if (this.userNameList.contains(user.getUserName())) {
1052 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1056 this.userNameList.add(user.getUserName());
1062 private void clear () {
1065 this.setUserId(null);
1066 this.setUserProfileMode(null);
1069 this.clearUserName();
1070 this.clearUserPasswords();
1071 this.setLocale(null);
1077 private void clearUserName () {
1079 this.setUserName(null);
1083 * Clears both user passwords
1085 private void clearUserPasswords () {
1087 this.setUserPassword(null);
1088 this.setUserPasswordRepeat(null);
1092 * Copies given user into the controller
1094 * @param user User instance
1096 private void copyUser (final User user) {
1097 // Make sure the instance is valid
1100 throw new NullPointerException("user is null"); //NOI18N
1101 } else if (user.getUserContact() == null) {
1103 throw new NullPointerException("user.userContact is null"); //NOI18N
1108 this.setUserId(user.getUserId());
1109 this.setUserProfileMode(user.getUserProfileMode());
1113 * Getter for locale instance
1115 * @return Locale instance
1117 private Locale getLocale () {
1122 * Setter for locale instance
1124 * @param locale Locale instance
1126 private void setLocale (final Locale locale) {
1127 this.locale = locale;
1131 * Removes user from all lists
1133 * @param user User to remove
1135 private void removeFromList (final User user) {
1136 // The user should be valid
1139 throw new NullPointerException("user is null"); //NOI18N
1140 } else if (user.getUserId() == null) {
1142 throw new NullPointerException("user.userId is null"); //NOI18N
1143 } else if (user.getUserId() < 1) {
1145 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1148 // Remove it from lists
1149 this.userList.remove(user);
1150 this.visibleUserList.remove(user);
1152 // Remove name from list
1153 this.userNameList.remove(user.getUserName());
1157 * Updates list with given user instance
1159 * @param user User instance
1161 private void updateList (final User user) {
1162 // The user should be valid
1165 throw new NullPointerException("user is null"); //NOI18N
1166 } else if (user.getUserId() == null) {
1168 throw new NullPointerException("user.userId is null"); //NOI18N
1169 } else if (user.getUserId() < 1) {
1171 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1172 } else if (user.getUserContact() == null) {
1174 throw new NullPointerException("user.userContact is null"); //NOI18N
1175 } else if (user.getUserContact().getContactId() == null) {
1177 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1178 } else if (user.getUserContact().getContactId() < 1) {
1180 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1183 // Get iterator from list
1184 Iterator<User> iterator = this.userList.iterator();
1186 // "Walk" through all entries
1187 while (iterator.hasNext()) {
1189 User next = iterator.next();
1191 // Is user id number the same?
1192 if (Objects.equals(user.getUserId(), next.getUserId())) {
1193 // Found entry, so remove it and abort
1194 this.userList.remove(next);
1200 this.userList.add(user);