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.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;
92 * Localization controller
95 private JobsLocalizationSessionController localizationController;
98 * Event being fired when user updated personal data
102 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
107 private UserSessionBeanRemote userBean;
115 * A list of all user profiles
117 private List<User> userList;
120 * Login controller (bean)
123 private JobsUserLoginWebSessionController userLoginController;
128 private String userName;
133 private List<String> userNameList;
136 * User password (clear-text from web form)
138 private String userPassword;
141 * User password repeated (clear-text from web form)
143 private String userPasswordRepeat;
146 * Whether the user wants a public profile
148 private ProfileMode userProfileMode;
151 * A list of all public user profiles
153 * @TODO Hmm, makes that sense? Having visible user list in current
154 * (session-scoped) user's visible user list?
156 private List<User> visibleUserList;
159 * Default constructor
161 public JobsUserWebSessionBean () {
162 // Call super constructor
167 * Event observer for newly added users by administrator
169 * @param event Event being fired
171 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
172 // event should not be null
175 throw new NullPointerException("event is null"); //NOI18N
176 } else if (event.getAddedUser() == null) {
178 throw new NullPointerException("event.addedUser is null"); //NOI18N
179 } else if (event.getAddedUser().getUserId() == null) {
181 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
182 } else if (event.getAddedUser().getUserId() < 1) {
184 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
188 this.updateList(event.getAddedUser());
194 this.setUserId(event.getAddedUser().getUserId());
198 * Event observer for deleted user accounts (by administrator)
200 * @param event Event being fired
202 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
203 // event should not be null
206 throw new NullPointerException("event is null"); //NOI18N
207 } else if (event.getDeletedUser() == null) {
209 throw new NullPointerException("event.deletedUser is null"); //NOI18N
210 } else if (event.getDeletedUser().getUserId() == null) {
212 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
213 } else if (event.getDeletedUser().getUserId() < 1) {
215 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
219 this.removeFromList(event.getDeletedUser());
226 * Event observer for linked users with existing contact data
228 * @param event Event being fired
230 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
231 // event should not be null
234 throw new NullPointerException("event is null"); //NOI18N
235 } else if (event.getLinkedUser() == null) {
237 throw new NullPointerException("event.linkedUser is null"); //NOI18N
238 } else if (event.getLinkedUser().getUserId() == null) {
240 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
241 } else if (event.getLinkedUser().getUserId() < 1) {
243 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
247 this.updateList(event.getLinkedUser());
253 this.setUserId(event.getLinkedUser().getUserId());
257 * Event observer for locked users
259 * @param event Event being fired
261 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
262 // event should not be null
265 throw new NullPointerException("event is null"); //NOI18N
266 } else if (event.getLockedUser() == null) {
268 throw new NullPointerException("event.lockedUser is null"); //NOI18N
269 } else if (event.getLockedUser().getUserId() == null) {
271 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
272 } else if (event.getLockedUser().getUserId() < 1) {
274 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
278 this.updateList(event.getLockedUser());
282 * Event observer for unlocked users
284 * @param event Event being fired
286 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
287 // event should not be null
290 throw new NullPointerException("event is null"); //NOI18N
291 } else if (event.getUnlockedUser() == null) {
293 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
294 } else if (event.getUnlockedUser().getUserId() == null) {
296 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
297 } else if (event.getUnlockedUser().getUserId() < 1) {
299 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
303 this.updateList(event.getUnlockedUser());
307 * Event observer for updated user data by administrator
309 * @param event Event being updated
311 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
312 // event should not be null
315 throw new NullPointerException("event is null"); //NOI18N
316 } else if (event.getUpdatedUser() == null) {
318 throw new NullPointerException("event.updatedUser is null"); //NOI18N
319 } else if (event.getUpdatedUser().getUserId() == null) {
321 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
322 } else if (event.getUpdatedUser().getUserId() < 1) {
324 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
328 this.updateList(event.getUpdatedUser());
335 * Event observer for when a bean helper has successfully created a user
336 * instance, means the user exists. If the user does not exist, this event
337 * should not fire but instead a proper exception must be thrown.
339 * @param event User created event
341 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
342 // Is the instance valid?
345 throw new NullPointerException("event is null"); //NOI18N
346 } else if (event.getCreatedUser() == null) {
348 throw new NullPointerException("event.createdUser is null"); //NOI18N
349 } else if (event.getCreatedUser().getUserId() == null) {
351 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
352 } else if (event.getCreatedUser().getUserId() < 1) {
354 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
358 User user = event.getCreatedUser();
360 // Set all fields here
365 * Event observer when user confirmed account.
367 * @param event Event being fired
369 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
370 // event should not be null
373 throw new NullPointerException("event is null"); //NOI18N
374 } else if (event.getConfirmedUser() == null) {
376 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
377 } else if (event.getConfirmedUser().getUserId() == null) {
379 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
380 } else if (event.getConfirmedUser().getUserId() < 1) {
382 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
386 this.updateList(event.getConfirmedUser());
390 * Event observer for logged-in user
392 * @param event Event instance
394 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
395 // event should not be null
398 throw new NullPointerException("event is null"); //NOI18N
399 } else if (event.getLoggedInUser() == null) {
401 throw new NullPointerException("event.registeredUser is null"); //NOI18N
402 } else if (event.getLoggedInUser().getUserId() == null) {
404 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
405 } else if (event.getLoggedInUser().getUserId() < 1) {
407 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
410 // "Cache" user instance
411 User loggedInUser = event.getLoggedInUser();
413 // Copy all data to this bean
414 this.copyUser(loggedInUser);
416 // Is the user visible?
417 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
418 // Yes, then add user
419 this.visibleUserList.add(loggedInUser);
424 * Event observer for user password changes
426 * @param event Event being fired
428 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
432 throw new NullPointerException("event is null"); //NOI18N
433 } else if (event.getUserPassword() == null) {
435 throw new NullPointerException("event.userPassword is null"); //NOI18N
436 } else if (event.getUserPassword().isEmpty()) {
438 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
442 this.setUserPassword(event.getUserPassword());
443 this.setUserPasswordRepeat(event.getUserPassword());
447 * Event observer for new user registrations
449 * @param event User registration event
451 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
452 // event should not be null
455 throw new NullPointerException("event is null"); //NOI18N
456 } else if (event.getRegisteredUser() == null) {
458 throw new NullPointerException("event.registeredUser is null"); //NOI18N
459 } else if (event.getRegisteredUser().getUserId() == null) {
461 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
462 } else if (event.getRegisteredUser().getUserId() < 1) {
464 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
468 User registeredUser = event.getRegisteredUser();
470 // Copy all data from registered->user
471 this.copyUser(registeredUser);
477 this.updateList(registeredUser);
480 this.addUserName(registeredUser);
482 // Is the account public?
483 if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
484 // Also add it to this list
485 this.visibleUserList.add(registeredUser);
489 this.setUserId(registeredUser.getUserId());
493 * Method being call after user's password has been updated (and history
494 * entry has been created).
496 * @param event Event being observed
498 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
502 throw new NullPointerException("event is null"); //NOI18N
503 } else if (event.getPasswordHistory() == null) {
505 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
506 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
508 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
509 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
511 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
515 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
519 * Listens to fired event when user updated personal data
521 * @param event Event being fired
523 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
527 throw new NullPointerException("event is null"); //NOI18N
528 } else if (event.getUpdatedUser() == null) {
530 throw new NullPointerException("event.updatedUser is null"); //NOI18N
531 } else if (event.getUpdatedUser().getUserId() == null) {
533 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
534 } else if (event.getUpdatedUser().getUserId() < 1) {
536 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
540 this.updateList(event.getUpdatedUser());
544 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
545 public List<User> allUsers () {
547 return this.userList;
551 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
552 public List<User> allVisibleUsers () {
554 return this.visibleUserList;
558 * Event observer for when a user name should be cleared
560 * @param event Event being fired
562 public void clearUserNameEvent (@Observes final ObservableClearUserNameEvent event) {
566 throw new NullPointerException("event is null");
570 this.clearUserName();
574 * Event observer for when both user passwords should be cleared
576 * @param event Event being fired
578 public void clearUserPasswordEvent (@Observes final ObservableClearUserPasswordEvent event) {
582 throw new NullPointerException("event is null");
586 this.clearUserPasswords();
590 public User createUserInstance (final boolean createContactData) {
592 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
594 // Required personal data must be set
595 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
597 // Create new user instance
598 User user = new LoginUser();
600 // Is user name required?
601 if (!this.isUserNameRequired()) {
602 // Generate pseudo-random user name
603 String randomName = this.userBean.generateRandomUserName();
605 // Set it and inivisible profile
606 this.setUserName(randomName);
607 this.setUserProfileMode(ProfileMode.INVISIBLE);
609 // Generate random password
610 String randomPassword = UserLoginUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
612 // Set random password
613 this.setUserPassword(randomPassword);
614 this.setUserPasswordRepeat(randomPassword);
617 // Set user name profile mode and locale
618 user.setUserName(this.getUserName());
619 user.setUserProfileMode(this.getUserProfileMode());
620 user.setUserLocale(this.localizationController.getLocale());
622 // Is multiple registration page
623 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
624 // Create contact instance
625 Contact contact = this.contactController.createContactInstance();
628 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
629 // Set contact in user
630 user.setUserContact(contact);
634 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
640 public User createUserLogin () {
642 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
645 if (this.getUserName() == null) {
647 throw new NullPointerException("userName is null"); //NOI18N
648 } else if (this.getUserName().isEmpty()) {
650 throw new IllegalStateException("userName is empty."); //NOI18N
653 // Create new user instance
654 User user = new LoginUser();
656 // Update all data ...
657 user.setUserName(this.getUserName());
660 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
661 // Return the new instance
666 public String doChangePersonalData () {
667 // This method shall only be called if the user is logged-in
668 if (!this.userLoginController.isUserLoggedIn()) {
670 throw new IllegalStateException("User is not logged-in"); //NOI18N
671 } else if (!this.isRequiredChangePersonalDataSet()) {
672 // Not all required fields are set
673 throw new FaceletException("Not all required fields are set."); //NOI18N
674 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
675 // Password not matching
676 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
677 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
678 // Editing is not allowed
679 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
683 User user = this.userLoginController.getLoggedInUser();
685 // Copy contact data to contact instance
686 this.contactController.updateContactDataFromController(user.getUserContact());
688 // It should be there, so run some tests on it
689 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
690 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
691 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
692 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
693 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
694 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
697 user.setUserProfileMode(this.getUserProfileMode());
699 // Send it to the EJB
700 User updatedUser = this.userBean.updateUserPersonalData(user);
703 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
706 return "user_contact_data_saved"; //NOI18N
714 public Long getUserId () {
721 * @param userId User id
723 public void setUserId (final Long userId) {
724 this.userId = userId;
728 * Getter for user name
732 public String getUserName () {
733 return this.userName;
737 * Setter for user name
739 * @param userName User name
741 public void setUserName (final String userName) {
742 this.userName = userName;
746 public String getUserPassword () {
747 return this.userPassword;
751 * Setter for clear-text user password
753 * @param userPassword Clear-text user password
755 public void setUserPassword (final String userPassword) {
756 this.userPassword = userPassword;
760 * Getter for clear-text user password repeated
762 * @return Clear-text user password repeated
764 public String getUserPasswordRepeat () {
765 return this.userPasswordRepeat;
769 * Setter for clear-text user password repeated
771 * @param userPasswordRepeat Clear-text user password repeated
773 public void setUserPasswordRepeat (final String userPasswordRepeat) {
774 this.userPasswordRepeat = userPasswordRepeat;
778 * Getter for user profile mode
780 * @return User profile mode
782 public ProfileMode getUserProfileMode () {
783 return this.userProfileMode;
787 * Setter for user profile mode
789 * @param userProfileMode User profile mode
791 public void setUserProfileMode (final ProfileMode userProfileMode) {
792 this.userProfileMode = userProfileMode;
796 public boolean ifBothPasswordsEmptyAllowed () {
797 // Check feature first
798 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
799 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
800 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
804 * Post-initialization of this class
807 public void init () {
810 // Get initial context
811 Context context = new InitialContext();
814 this.userBean = (UserSessionBeanRemote) context.lookup("java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
815 } catch (final NamingException e) {
817 throw new FaceletException(e);
820 // Initialize user list
821 this.userList = this.userBean.allUsers();
823 // Get full user name list for reducing EJB calls
824 this.userNameList = this.userBean.getUserNameList();
826 // Is the user logged-in?
827 if (this.userLoginController.isUserLoggedIn()) {
828 // Is logged-in, so load also users visible to memebers
829 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
831 // Initialize user list
832 this.visibleUserList = this.userBean.allPublicUsers();
837 public boolean isContactFound (final Contact contact) {
838 // The contact must be valid
839 if (null == contact) {
841 throw new NullPointerException("contact is null"); //NOI18N
842 } else if (contact.getContactId() == null) {
844 throw new NullPointerException("contact.contactId is null"); //NOI18N
845 } else if (contact.getContactId() < 1) {
847 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
850 // Default is not found
851 boolean isFound = false;
854 Iterator<User> iterator = this.allUsers().iterator();
856 // Loop through all entries
857 while (iterator.hasNext()) {
859 User next = iterator.next();
861 // Compare both objects
862 if (Objects.equals(contact, next.getUserContact())) {
874 public boolean isPublicUserProfileEnabled () {
875 // Get context parameter
876 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
879 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
881 // This requires user names being enabled, too.
882 if ((isEnabled) && (!this.isUserNameRequired())) {
883 // Not valid state, users must be able to modify their profile, especially when it is public
884 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
892 public boolean isRequiredChangePersonalDataSet () {
893 return ((this.getUserProfileMode() != null) &&
894 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
895 (this.contactController.isRequiredChangePersonalDataSet()));
899 public boolean isRequiredPersonalDataSet () {
900 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
901 // Multiple registration page
902 return this.contactController.isRequiredPersonalDataSet();
904 // Single registration page
905 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
906 (this.getUserProfileMode() != null) &&
907 (this.contactController.isRequiredPersonalDataSet()) &&
908 (this.getUserPassword() != null) &&
909 (this.getUserPasswordRepeat() != null));
914 public boolean isSamePasswordEntered () {
915 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
919 public boolean isUserIdEmpty () {
920 return ((this.getUserId() == null) || (this.getUserId() == 0));
924 public boolean isUserNameRegistered (final User user) {
925 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
929 public boolean isUserNameRequired () {
930 // Get context parameter
931 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
934 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
941 public boolean isVisibleUserFound () {
942 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
946 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
947 // Parameter must be valid
948 if (null == emailAddress) {
950 throw new NullPointerException("emailAddress is null"); //NOI18N
951 } else if (emailAddress.isEmpty()) {
953 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
959 // Try to lookup it in visible user list
960 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
962 User next = iterator.next();
964 // Contact should be set
965 if (next.getUserContact() == null) {
967 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
968 } else if (next.getUserContact().getContactEmailAddress() == null) {
969 // Email address should be set
970 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
973 // Is the email address found?
974 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
975 // Copy to other variable
983 // Not visible for the current user
984 throw new UserEmailAddressNotFoundException(emailAddress);
992 public User lookupUserById (final Long userId) throws UserNotFoundException {
993 // Parameter must be valid
994 if (null == userId) {
996 throw new NullPointerException("userId is null"); //NOI18N
997 } else if (userId < 1) {
999 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
1005 // Try to lookup it in visible user list
1006 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
1008 User next = iterator.next();
1010 // Is the user id found?
1011 if (Objects.equals(next.getUserId(), userId)) {
1012 // Copy to other variable
1018 // Is it still null?
1020 // Not visible for the current user
1021 throw new UserNotFoundException(userId);
1029 * Adds user's name to bean's internal list. It also updates the public user
1030 * list if the user has decided to have a public account,
1032 * @param user User instance
1034 private void addUserName (final User user) {
1035 // Make sure the entry is not added yet
1036 if (this.userNameList.contains(user.getUserName())) {
1038 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1042 this.userNameList.add(user.getUserName());
1048 private void clear () {
1051 this.setUserId(null);
1052 this.setUserProfileMode(null);
1055 this.clearUserName();
1056 this.clearUserPasswords();
1062 private void clearUserName () {
1064 this.setUserName(null);
1068 * Clears both user passwords
1070 private void clearUserPasswords () {
1072 this.setUserPassword(null);
1073 this.setUserPasswordRepeat(null);
1077 * Copies given user into the controller
1079 * @param user User instance
1081 private void copyUser (final User user) {
1082 // Make sure the instance is valid
1085 throw new NullPointerException("user is null"); //NOI18N
1086 } else if (user.getUserContact() == null) {
1088 throw new NullPointerException("user.userContact is null"); //NOI18N
1093 this.setUserId(user.getUserId());
1094 this.setUserProfileMode(user.getUserProfileMode());
1098 * Removes user from all lists
1100 * @param user User to remove
1102 private void removeFromList (final User user) {
1103 // The user should be valid
1106 throw new NullPointerException("user is null"); //NOI18N
1107 } else if (user.getUserId() == null) {
1109 throw new NullPointerException("user.userId is null"); //NOI18N
1110 } else if (user.getUserId() < 1) {
1112 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1115 // Remove it from lists
1116 this.userList.remove(user);
1117 this.visibleUserList.remove(user);
1119 // Remove name from list
1120 this.userNameList.remove(user.getUserName());
1124 * Updates list with given user instance
1126 * @param user User instance
1128 private void updateList (final User user) {
1129 // The user should be valid
1132 throw new NullPointerException("user is null"); //NOI18N
1133 } else if (user.getUserId() == null) {
1135 throw new NullPointerException("user.userId is null"); //NOI18N
1136 } else if (user.getUserId() < 1) {
1138 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1139 } else if (user.getUserContact() == null) {
1141 throw new NullPointerException("user.userContact is null"); //NOI18N
1142 } else if (user.getUserContact().getContactId() == null) {
1144 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1145 } else if (user.getUserContact().getContactId() < 1) {
1147 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1150 // Get iterator from list
1151 Iterator<User> iterator = this.userList.iterator();
1153 // "Walk" through all entries
1154 while (iterator.hasNext()) {
1156 User next = iterator.next();
1158 // Is user id number the same?
1159 if (Objects.equals(user.getUserId(), next.getUserId())) {
1160 // Found entry, so remove it and abort
1161 this.userList.remove(next);
1167 this.userList.add(user);