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.Objects;
23 import javax.annotation.PostConstruct;
24 import javax.enterprise.context.SessionScoped;
25 import javax.enterprise.event.Event;
26 import javax.enterprise.event.Observes;
27 import javax.enterprise.inject.Any;
28 import javax.faces.context.FacesContext;
29 import javax.faces.view.facelets.FaceletException;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import javax.naming.Context;
33 import javax.naming.InitialContext;
34 import javax.naming.NamingException;
35 import org.mxchange.jcontacts.contact.Contact;
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.login.user.JobsUserLoginWebSessionController;
40 import org.mxchange.jusercore.events.confirmation.ObservableUserConfirmedAccountEvent;
41 import org.mxchange.jusercore.events.login.ObservableUserLoggedInEvent;
42 import org.mxchange.jusercore.events.registration.ObservableUserRegisteredEvent;
43 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
44 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
45 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
46 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
47 import org.mxchange.jusercore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
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.exceptions.UserPasswordMismatchException;
55 import org.mxchange.jusercore.model.user.LoginUser;
56 import org.mxchange.jusercore.model.user.User;
57 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
58 import org.mxchange.jusercore.model.user.UserUtils;
59 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
62 * A user controller (bean)
64 * @author Roland Häder<roland@mxchange.org>
66 @Named ("userController")
68 public class JobsUserWebSessionBean extends BaseJobsController implements JobsUserWebSessionController {
73 private static final long serialVersionUID = 542_145_347_916L;
76 * General contact controller
79 private JobsContactWebSessionController contactController;
85 private JobsFeaturesWebApplicationController featureController;
88 * Event being fired when user updated personal data
92 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
97 private UserSessionBeanRemote userBean;
105 * A list of all user profiles
107 private List<User> userList;
110 * Login controller (bean)
113 private JobsUserLoginWebSessionController userLoginController;
118 private String userName;
123 private List<String> userNameList;
126 * User password (clear-text from web form)
128 private String userPassword;
131 * User password repeated (clear-text from web form)
133 private String userPasswordRepeat;
136 * Whether the user wants a public profile
138 private ProfileMode userProfileMode;
141 * A list of all public user profiles
143 * @TODO Hmm, makes that sense? Having visible user list in current
144 * (session-scoped) user's visible user list?
146 private List<User> visibleUserList;
149 * Default constructor
151 public JobsUserWebSessionBean () {
152 // Call super constructor
157 * Event observer for newly added users by administrator
159 * @param event Event being fired
161 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
162 // event should not be null
165 throw new NullPointerException("event is null"); //NOI18N
166 } else if (event.getAddedUser() == null) {
168 throw new NullPointerException("event.addedUser is null"); //NOI18N
169 } else if (event.getAddedUser().getUserId() == null) {
171 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
172 } else if (event.getAddedUser().getUserId() < 1) {
174 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
178 this.updateList(event.getAddedUser());
184 this.setUserId(event.getAddedUser().getUserId());
188 * Event observer for deleted user accounts (by administrator)
190 * @param event Event being fired
192 public void afterAdminDeletedUserEvent (final ObservableAdminDeletedUserEvent event) {
193 // event should not be null
196 throw new NullPointerException("event is null"); //NOI18N
197 } else if (event.getDeletedUser() == null) {
199 throw new NullPointerException("event.deletedUser is null"); //NOI18N
200 } else if (event.getDeletedUser().getUserId() == null) {
202 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
203 } else if (event.getDeletedUser().getUserId() < 1) {
205 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
209 this.removeFromList(event.getDeletedUser());
216 * Event observer for linked users with existing contact data
218 * @param event Event being fired
220 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
221 // event should not be null
224 throw new NullPointerException("event is null"); //NOI18N
225 } else if (event.getLinkedUser() == null) {
227 throw new NullPointerException("event.linkedUser is null"); //NOI18N
228 } else if (event.getLinkedUser().getUserId() == null) {
230 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
231 } else if (event.getLinkedUser().getUserId() < 1) {
233 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
237 this.updateList(event.getLinkedUser());
243 this.setUserId(event.getLinkedUser().getUserId());
247 * Event observer for locked users
249 * @param event Event being fired
251 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
252 // event should not be null
255 throw new NullPointerException("event is null"); //NOI18N
256 } else if (event.getLockedUser() == null) {
258 throw new NullPointerException("event.lockedUser is null"); //NOI18N
259 } else if (event.getLockedUser().getUserId() == null) {
261 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
262 } else if (event.getLockedUser().getUserId() < 1) {
264 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
268 this.updateList(event.getLockedUser());
272 * Event observer for unlocked users
274 * @param event Event being fired
276 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
277 // event should not be null
280 throw new NullPointerException("event is null"); //NOI18N
281 } else if (event.getUnlockedUser() == null) {
283 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
284 } else if (event.getUnlockedUser().getUserId() == null) {
286 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
287 } else if (event.getUnlockedUser().getUserId() < 1) {
289 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
293 this.updateList(event.getUnlockedUser());
297 * Event observer for updated user data by administrator
299 * @param event Event being updated
301 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
302 // event should not be null
305 throw new NullPointerException("event is null"); //NOI18N
306 } else if (event.getUpdatedUser() == null) {
308 throw new NullPointerException("event.updatedUser is null"); //NOI18N
309 } else if (event.getUpdatedUser().getUserId() == null) {
311 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
312 } else if (event.getUpdatedUser().getUserId() < 1) {
314 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
318 this.updateList(event.getUpdatedUser());
325 * Event observer when user confirmed account.
327 * @param event Event being fired
329 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
330 // event should not be null
333 throw new NullPointerException("event is null"); //NOI18N
334 } else if (event.getConfirmedUser() == null) {
336 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
337 } else if (event.getConfirmedUser().getUserId() == null) {
339 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
340 } else if (event.getConfirmedUser().getUserId() < 1) {
342 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
346 this.updateList(event.getConfirmedUser());
350 * Event observer for logged-in user
352 * @param event Event instance
354 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
355 // event should not be null
358 throw new NullPointerException("event is null"); //NOI18N
359 } else if (event.getLoggedInUser() == null) {
361 throw new NullPointerException("event.registeredUser is null"); //NOI18N
362 } else if (event.getLoggedInUser().getUserId() == null) {
364 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
365 } else if (event.getLoggedInUser().getUserId() < 1) {
367 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
370 // "Cache" user instance
371 User loggedInUser = event.getLoggedInUser();
373 // Copy all data to this bean
374 this.copyUser(loggedInUser);
376 // Is the user visible?
377 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
378 // Yes, then add user
379 this.visibleUserList.add(loggedInUser);
384 * Event observer for new user registrations
386 * @param event User registration event
388 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
389 // event should not be null
392 throw new NullPointerException("event is null"); //NOI18N
393 } else if (event.getRegisteredUser() == null) {
395 throw new NullPointerException("event.registeredUser is null"); //NOI18N
396 } else if (event.getRegisteredUser().getUserId() == null) {
398 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
399 } else if (event.getRegisteredUser().getUserId() < 1) {
401 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
405 User registeredUser = event.getRegisteredUser();
407 // Copy all data from registered->user
408 this.copyUser(registeredUser);
414 this.updateList(registeredUser);
417 this.addUserName(registeredUser);
419 // Is the account public?
420 if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
421 // Also add it to this list
422 this.visibleUserList.add(registeredUser);
426 this.setUserId(registeredUser.getUserId());
430 * Method being call after user's password has been updated (and history
431 * entry has been created).
433 * @param event Event being observed
435 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
439 throw new NullPointerException("event is null"); //NOI18N
440 } else if (event.getPasswordHistory() == null) {
442 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
443 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
445 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
446 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
448 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
452 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
456 * Listens to fired event when user updated personal data
458 * @param event Event being fired
460 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
464 throw new NullPointerException("event is null"); //NOI18N
465 } else if (event.getUpdatedUser() == null) {
467 throw new NullPointerException("event.updatedUser is null"); //NOI18N
468 } else if (event.getUpdatedUser().getUserId() == null) {
470 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
471 } else if (event.getUpdatedUser().getUserId() < 1) {
473 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
477 this.updateList(event.getUpdatedUser());
481 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
482 public List<User> allUsers () {
484 return this.userList;
488 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
489 public List<User> allVisibleUsers () {
491 return this.visibleUserList;
495 public User createUserInstance (final boolean createContactData) {
497 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
499 // Required personal data must be set
500 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
502 // Create new user instance
503 User user = new LoginUser();
505 // Is user name required?
506 if (!this.isUserNameRequired()) {
507 // Generate pseudo-random user name
508 String randomName = this.userBean.generateRandomUserName();
510 // Set it and inivisible profile
511 this.setUserName(randomName);
512 this.setUserProfileMode(ProfileMode.INVISIBLE);
514 // Generate random password
515 String randomPassword = UserUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
517 // Set random password
518 this.setUserPassword(randomPassword);
519 this.setUserPasswordRepeat(randomPassword);
522 // Set user name and mode
523 user.setUserName(this.getUserName());
524 user.setUserProfileMode(this.getUserProfileMode());
526 // Is multiple registration page
527 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
528 // Create contact instance
529 Contact contact = this.contactController.createContactInstance();
532 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
533 // Set contact in user
534 user.setUserContact(contact);
538 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
544 public User createUserLogin () {
546 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
549 if (this.getUserName() == null) {
551 throw new NullPointerException("userName is null"); //NOI18N
552 } else if (this.getUserName().isEmpty()) {
554 throw new IllegalStateException("userName is empty."); //NOI18N
557 // Create new user instance
558 User user = new LoginUser();
560 // Update all data ...
561 user.setUserName(this.getUserName());
564 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
565 // Return the new instance
570 public String doChangePersonalData () {
571 // This method shall only be called if the user is logged-in
572 if (!this.userLoginController.isUserLoggedIn()) {
574 throw new IllegalStateException("User is not logged-in"); //NOI18N
575 } else if (!this.isRequiredChangePersonalDataSet()) {
576 // Not all required fields are set
577 throw new FaceletException("Not all required fields are set."); //NOI18N
578 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
579 // Password not matching
580 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
581 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) {
582 // Editing is not allowed
583 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
587 User user = this.userLoginController.getLoggedInUser();
589 // Copy contact data to contact instance
590 this.contactController.updateContactDataFromController(user.getUserContact());
592 // It should be there, so run some tests on it
593 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
594 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
595 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
596 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
597 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
598 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
601 user.setUserProfileMode(this.getUserProfileMode());
603 // Send it to the EJB
604 User updatedUser = this.userBean.updateUserPersonalData(user);
607 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
610 return "user_contact_data_saved"; //NOI18N
614 public Long getUserId () {
619 public void setUserId (final Long userId) {
620 this.userId = userId;
624 public String getUserName () {
625 return this.userName;
629 public void setUserName (final String userName) {
630 this.userName = userName;
634 public String getUserPassword () {
635 return this.userPassword;
639 public void setUserPassword (final String userPassword) {
640 this.userPassword = userPassword;
644 public String getUserPasswordRepeat () {
645 return this.userPasswordRepeat;
649 public void setUserPasswordRepeat (final String userPasswordRepeat) {
650 this.userPasswordRepeat = userPasswordRepeat;
654 public ProfileMode getUserProfileMode () {
655 return this.userProfileMode;
659 public void setUserProfileMode (final ProfileMode userProfileMode) {
660 this.userProfileMode = userProfileMode;
664 * Post-initialization of this class
667 public void init () {
670 // Get initial context
671 Context context = new InitialContext();
674 this.userBean = (UserSessionBeanRemote) context.lookup("java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
675 } catch (final NamingException e) {
677 throw new FaceletException(e);
680 // Initialize user list
681 this.userList = this.userBean.allUsers();
683 // Get full user name list for reducing EJB calls
684 this.userNameList = this.userBean.getUserNameList();
686 // Is the user logged-in?
687 if (this.userLoginController.isUserLoggedIn()) {
688 // Is logged-in, so load also users visible to memebers
689 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
691 // Initialize user list
692 this.visibleUserList = this.userBean.allPublicUsers();
697 public boolean isContactFound (final Contact contact) {
698 // The contact must be valid
699 if (null == contact) {
701 throw new NullPointerException("contact is null"); //NOI18N
702 } else if (contact.getContactId() == null) {
704 throw new NullPointerException("contact.contactId is null"); //NOI18N
705 } else if (contact.getContactId() < 1) {
707 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
710 // Default is not found
711 boolean isFound = false;
714 Iterator<User> iterator = this.allUsers().iterator();
716 // Loop through all entries
717 while (iterator.hasNext()) {
719 User next = iterator.next();
721 // Compare both objects
722 if (Objects.equals(contact, next.getUserContact())) {
734 public boolean isPublicUserProfileEnabled () {
735 // Get context parameter
736 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
739 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
741 // This requires user names being enabled, too.
742 if ((isEnabled) && (!this.isUserNameRequired())) {
743 // Not valid state, users must be able to modify their profile, especially when it is public
744 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
752 public boolean isRequiredChangePersonalDataSet () {
753 return ((this.getUserProfileMode() != null) &&
754 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
755 (this.contactController.isRequiredChangePersonalDataSet()));
759 public boolean isRequiredPersonalDataSet () {
760 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
761 // Multiple registration page
762 return this.contactController.isRequiredPersonalDataSet();
764 // Single registration page
765 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
766 (this.getUserProfileMode() != null) &&
767 (this.contactController.isRequiredPersonalDataSet()) &&
768 (this.getUserPassword() != null) &&
769 (this.getUserPasswordRepeat() != null));
774 public boolean isSamePasswordEntered () {
775 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
779 public boolean isUserIdEmpty () {
780 return ((this.getUserId() == null) || (this.getUserId() == 0));
784 public boolean isUserNameRegistered (final User user) {
785 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
789 public boolean isUserNameRequired () {
790 // Get context parameter
791 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_name_required"); //NOI18N
794 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
801 public boolean isVisibleUserFound () {
802 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
806 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
807 // Parameter must be valid
808 if (null == emailAddress) {
810 throw new NullPointerException("emailAddress is null"); //NOI18N
811 } else if (emailAddress.isEmpty()) {
813 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
819 // Try to lookup it in visible user list
820 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
822 User next = iterator.next();
824 // Contact should be set
825 if (next.getUserContact() == null) {
827 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
828 } else if (next.getUserContact().getContactEmailAddress() == null) {
829 // Email address should be set
830 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
833 // Is the email address found?
834 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
835 // Copy to other variable
843 // Not visible for the current user
844 throw new UserEmailAddressNotFoundException(emailAddress);
852 public User lookupUserById (final Long userId) throws UserNotFoundException {
853 // Parameter must be valid
854 if (null == userId) {
856 throw new NullPointerException("userId is null"); //NOI18N
857 } else if (userId < 1) {
859 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
865 // Try to lookup it in visible user list
866 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
868 User next = iterator.next();
870 // Is the user id found?
871 if (Objects.equals(next.getUserId(), userId)) {
872 // Copy to other variable
880 // Not visible for the current user
881 throw new UserNotFoundException(userId);
889 * Adds user's name to bean's internal list. It also updates the public user
890 * list if the user has decided to have a public account,
892 * @param user User instance
894 private void addUserName (final User user) {
895 // Make sure the entry is not added yet
896 if (this.userNameList.contains(user.getUserName())) {
898 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
899 } else if (this.contactController.isEmailAddressRegistered(user.getUserContact())) {
901 throw new IllegalArgumentException(MessageFormat.format("Email address {0} already added.", user.getUserContact().getContactEmailAddress())); //NOI18N
905 this.userNameList.add(user.getUserName());
911 private void clear () {
914 this.setUserId(null);
915 this.setUserProfileMode(null);
918 this.setUserName(null);
919 this.setUserPassword(null);
920 this.setUserPasswordRepeat(null);
924 * Copies given user into the controller
926 * @param user User instance
928 private void copyUser (final User user) {
929 // Make sure the instance is valid
932 throw new NullPointerException("user is null"); //NOI18N
933 } else if (user.getUserContact() == null) {
935 throw new NullPointerException("user.userContact is null"); //NOI18N
940 this.setUserId(user.getUserId());
941 this.setUserProfileMode(user.getUserProfileMode());
945 * Removes user from all lists
947 * @param user User to remove
949 private void removeFromList (final User user) {
950 // The user should be valid
953 throw new NullPointerException("user is null"); //NOI18N
954 } else if (user.getUserId() == null) {
956 throw new NullPointerException("user.userId is null"); //NOI18N
957 } else if (user.getUserId() < 1) {
959 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
962 // Remove it from lists
963 this.userList.remove(user);
964 this.visibleUserList.remove(user);
966 // Remove name from list
967 this.userNameList.remove(user.getUserName());
971 * Updates list with given user instance
973 * @param user User instance
975 private void updateList (final User user) {
976 // The user should be valid
979 throw new NullPointerException("user is null"); //NOI18N
980 } else if (user.getUserId() == null) {
982 throw new NullPointerException("user.userId is null"); //NOI18N
983 } else if (user.getUserId() < 1) {
985 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
986 } else if (user.getUserContact() == null) {
988 throw new NullPointerException("user.userContact is null"); //NOI18N
989 } else if (user.getUserContact().getContactId() == null) {
991 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
992 } else if (user.getUserContact().getContactId() < 1) {
994 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
997 // Get iterator from list
998 Iterator<User> iterator = this.userList.iterator();
1000 // "Walk" through all entries
1001 while (iterator.hasNext()) {
1003 User next = iterator.next();
1005 // Is user id number the same?
1006 if (Objects.equals(user.getUserId(), next.getUserId())) {
1007 // Found entry, so remove it and abort
1008 this.userList.remove(next);
1014 this.userList.add(user);