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.pizzaapplication.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.jusercore.events.confirmation.ObservableUserConfirmedAccountEvent;
37 import org.mxchange.jusercore.events.login.ObservableUserLoggedInEvent;
38 import org.mxchange.jusercore.events.registration.ObservableUserRegisteredEvent;
39 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
40 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
41 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
42 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
43 import org.mxchange.jusercore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
44 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
45 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
46 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
47 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
48 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
49 import org.mxchange.jusercore.exceptions.UserNotFoundException;
50 import org.mxchange.jusercore.exceptions.UserPasswordMismatchException;
51 import org.mxchange.jusercore.model.user.LoginUser;
52 import org.mxchange.jusercore.model.user.User;
53 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
54 import org.mxchange.jusercore.model.user.UserUtils;
55 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
56 import org.mxchange.pizzaapplication.beans.BasePizzaController;
57 import org.mxchange.pizzaapplication.beans.contact.PizzaContactWebSessionController;
58 import org.mxchange.pizzaapplication.beans.features.PizzaFeaturesWebApplicationController;
59 import org.mxchange.pizzaapplication.beans.login.user.PizzaUserLoginWebSessionController;
62 * A user bean (controller)
64 * @author Roland Häder<roland@mxchange.org>
66 @Named ("userController")
68 public class PizzaUserWebSessionBean extends BasePizzaController implements PizzaUserWebSessionController {
73 private static final long serialVersionUID = 542_145_347_916L;
76 * General contact controller
79 private PizzaContactWebSessionController contactController;
85 private PizzaFeaturesWebApplicationController 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 PizzaUserLoginWebSessionController 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 PizzaUserWebSessionBean () {
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(PizzaUserWebSessionController.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 public boolean ifBothPasswordsEmptyAllowed () {
665 // Check feature first
666 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) &&
667 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
668 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
672 * Post-initialization of this class
675 public void init () {
678 // Get initial context
679 Context context = new InitialContext();
682 this.userBean = (UserSessionBeanRemote) context.lookup("java:global/pizzaservice-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
683 } catch (final NamingException e) {
685 throw new FaceletException(e);
688 // Initialize user list
689 this.userList = this.userBean.allUsers();
691 // Get full user name list for reducing EJB calls
692 this.userNameList = this.userBean.getUserNameList();
694 // Is the user logged-in?
695 if (this.userLoginController.isUserLoggedIn()) {
696 // Is logged-in, so load also users visible to memebers
697 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
699 // Initialize user list
700 this.visibleUserList = this.userBean.allPublicUsers();
705 public boolean isContactFound (final Contact contact) {
706 // The contact must be valid
707 if (null == contact) {
709 throw new NullPointerException("contact is null"); //NOI18N
710 } else if (contact.getContactId() == null) {
712 throw new NullPointerException("contact.contactId is null"); //NOI18N
713 } else if (contact.getContactId() < 1) {
715 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
718 // Default is not found
719 boolean isFound = false;
722 Iterator<User> iterator = this.allUsers().iterator();
724 // Loop through all entries
725 while (iterator.hasNext()) {
727 User next = iterator.next();
729 // Compare both objects
730 if (Objects.equals(contact, next.getUserContact())) {
742 public boolean isPublicUserProfileEnabled () {
743 // Get context parameter
744 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
747 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
749 // This requires user names being enabled, too.
750 if ((isEnabled) && (!this.isUserNameRequired())) {
751 // Not valid state, users must be able to modify their profile, especially when it is public
752 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
760 public boolean isRequiredChangePersonalDataSet () {
761 return ((this.getUserProfileMode() != null) &&
762 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
763 (this.contactController.isRequiredChangePersonalDataSet()));
767 public boolean isRequiredPersonalDataSet () {
768 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
769 // Multiple registration page
770 return this.contactController.isRequiredPersonalDataSet();
772 // Single registration page
773 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
774 (this.getUserProfileMode() != null) &&
775 (this.contactController.isRequiredPersonalDataSet()) &&
776 (this.getUserPassword() != null) &&
777 (this.getUserPasswordRepeat() != null));
782 public boolean isSamePasswordEntered () {
783 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
787 public boolean isUserIdEmpty () {
788 return ((this.getUserId() == null) || (this.getUserId() == 0));
792 public boolean isUserNameRegistered (final User user) {
793 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
797 public boolean isUserNameRequired () {
798 // Get context parameter
799 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_name_required"); //NOI18N
802 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
809 public boolean isVisibleUserFound () {
810 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
814 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
815 // Parameter must be valid
816 if (null == emailAddress) {
818 throw new NullPointerException("emailAddress is null"); //NOI18N
819 } else if (emailAddress.isEmpty()) {
821 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
827 // Try to lookup it in visible user list
828 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
830 User next = iterator.next();
832 // Contact should be set
833 if (next.getUserContact() == null) {
835 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
836 } else if (next.getUserContact().getContactEmailAddress() == null) {
837 // Email address should be set
838 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
841 // Is the email address found?
842 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
843 // Copy to other variable
851 // Not visible for the current user
852 throw new UserEmailAddressNotFoundException(emailAddress);
860 public User lookupUserById (final Long userId) throws UserNotFoundException {
861 // Parameter must be valid
862 if (null == userId) {
864 throw new NullPointerException("userId is null"); //NOI18N
865 } else if (userId < 1) {
867 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
873 // Try to lookup it in visible user list
874 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
876 User next = iterator.next();
878 // Is the user id found?
879 if (Objects.equals(next.getUserId(), userId)) {
880 // Copy to other variable
888 // Not visible for the current user
889 throw new UserNotFoundException(userId);
897 * Adds user's name to bean's internal list. It also updates the public user
898 * list if the user has decided to have a public account,
900 * @param user User instance
902 private void addUserName (final User user) {
903 // Make sure the entry is not added yet
904 if (this.userNameList.contains(user.getUserName())) {
906 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
907 } else if (this.contactController.isEmailAddressRegistered(user.getUserContact())) {
909 throw new IllegalArgumentException(MessageFormat.format("Email address {0} already added.", user.getUserContact().getContactEmailAddress())); //NOI18N
913 this.userNameList.add(user.getUserName());
919 private void clear () {
922 this.setUserId(null);
923 this.setUserProfileMode(null);
926 this.setUserName(null);
927 this.setUserPassword(null);
928 this.setUserPasswordRepeat(null);
932 * Copies given user into the controller
934 * @param user User instance
936 private void copyUser (final User user) {
937 // Make sure the instance is valid
940 throw new NullPointerException("user is null"); //NOI18N
941 } else if (user.getUserContact() == null) {
943 throw new NullPointerException("user.userContact is null"); //NOI18N
948 this.setUserId(user.getUserId());
949 this.setUserProfileMode(user.getUserProfileMode());
953 * Removes user from all lists
955 * @param user User to remove
957 private void removeFromList (final User user) {
958 // The user should be valid
961 throw new NullPointerException("user is null"); //NOI18N
962 } else if (user.getUserId() == null) {
964 throw new NullPointerException("user.userId is null"); //NOI18N
965 } else if (user.getUserId() < 1) {
967 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
970 // Remove it from lists
971 this.userList.remove(user);
972 this.visibleUserList.remove(user);
974 // Remove name from list
975 this.userNameList.remove(user.getUserName());
979 * Updates list with given user instance
981 * @param user User instance
983 private void updateList (final User user) {
984 // The user should be valid
987 throw new NullPointerException("user is null"); //NOI18N
988 } else if (user.getUserId() == null) {
990 throw new NullPointerException("user.userId is null"); //NOI18N
991 } else if (user.getUserId() < 1) {
993 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
994 } else if (user.getUserContact() == null) {
996 throw new NullPointerException("user.userContact is null"); //NOI18N
997 } else if (user.getUserContact().getContactId() == null) {
999 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1000 } else if (user.getUserContact().getContactId() < 1) {
1002 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1005 // Get iterator from list
1006 Iterator<User> iterator = this.userList.iterator();
1008 // "Walk" through all entries
1009 while (iterator.hasNext()) {
1011 User next = iterator.next();
1013 // Is user id number the same?
1014 if (Objects.equals(user.getUserId(), next.getUserId())) {
1015 // Found entry, so remove it and abort
1016 this.userList.remove(next);
1022 this.userList.add(user);