2 * Copyright (C) 2016, 2017 Roland Häder
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation, either version 3 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
14 * You should have received a copy of the GNU Affero General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package org.mxchange.jjobs.beans.user;
19 import java.text.MessageFormat;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Locale;
23 import java.util.Objects;
24 import javax.annotation.PostConstruct;
25 import javax.enterprise.context.SessionScoped;
26 import javax.enterprise.event.Event;
27 import javax.enterprise.event.Observes;
28 import javax.enterprise.inject.Any;
29 import javax.faces.context.FacesContext;
30 import javax.faces.view.facelets.FaceletException;
31 import javax.inject.Inject;
32 import javax.inject.Named;
33 import javax.naming.Context;
34 import javax.naming.InitialContext;
35 import javax.naming.NamingException;
36 import org.mxchange.jcontacts.contact.Contact;
37 import org.mxchange.jcoreee.events.locale.ObservableLocaleChangeEvent;
38 import org.mxchange.jjobs.beans.BaseJobsController;
39 import org.mxchange.jjobs.beans.contact.JobsContactWebSessionController;
40 import org.mxchange.jjobs.beans.features.JobsFeaturesWebApplicationController;
41 import org.mxchange.jjobs.beans.localization.JobsLocalizationSessionController;
42 import org.mxchange.jjobs.beans.user.login.JobsUserLoginWebSessionController;
43 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
44 import org.mxchange.jusercore.events.user.clear.password.ObservableClearUserPasswordEvent;
45 import org.mxchange.jusercore.events.user.clear.username.ObservableClearUserNameEvent;
46 import org.mxchange.jusercore.events.user.created.ObservableCreatedUserEvent;
47 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
48 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
49 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
50 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
51 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
52 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
53 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
54 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
55 import org.mxchange.jusercore.exceptions.UserNotFoundException;
56 import org.mxchange.jusercore.model.user.LoginUser;
57 import org.mxchange.jusercore.model.user.User;
58 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
59 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
60 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
61 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
62 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
63 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
64 import org.mxchange.juserlogincore.exceptions.UserPasswordMismatchException;
65 import org.mxchange.juserlogincore.login.UserLoginUtils;
68 * A user controller (bean)
70 * @author Roland Häder<roland@mxchange.org>
72 @Named ("userController")
74 public class JobsUserWebSessionBean extends BaseJobsController implements JobsUserWebSessionController {
79 private static final long serialVersionUID = 542_145_347_916L;
82 * General contact controller
85 private JobsContactWebSessionController contactController;
91 private JobsFeaturesWebApplicationController featureController;
96 private Locale locale;
99 * Localization controller
102 private JobsLocalizationSessionController localizationController;
105 * Event being fired when user updated personal data
109 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
114 private UserSessionBeanRemote userBean;
122 * A list of all user profiles
124 private List<User> userList;
127 * Login controller (bean)
130 private JobsUserLoginWebSessionController userLoginController;
135 private String userName;
140 private List<String> userNameList;
143 * User password (clear-text from web form)
145 private String userPassword;
148 * User password repeated (clear-text from web form)
150 private String userPasswordRepeat;
153 * Whether the user wants a public profile
155 private ProfileMode userProfileMode;
158 * A list of all public user profiles
160 * @TODO Hmm, makes that sense? Having visible user list in current
161 * (session-scoped) user's visible user list?
163 private List<User> visibleUserList;
166 * Default constructor
168 public JobsUserWebSessionBean () {
169 // Call super constructor
174 * Event observer for newly added users by administrator
176 * @param event Event being fired
178 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
179 // event should not be null
182 throw new NullPointerException("event is null"); //NOI18N
183 } else if (event.getAddedUser() == null) {
185 throw new NullPointerException("event.addedUser is null"); //NOI18N
186 } else if (event.getAddedUser().getUserId() == null) {
188 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
189 } else if (event.getAddedUser().getUserId() < 1) {
191 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
195 this.updateList(event.getAddedUser());
201 this.setUserId(event.getAddedUser().getUserId());
205 * Event observer for deleted user accounts (by administrator)
207 * @param event Event being fired
209 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
210 // event should not be null
213 throw new NullPointerException("event is null"); //NOI18N
214 } else if (event.getDeletedUser() == null) {
216 throw new NullPointerException("event.deletedUser is null"); //NOI18N
217 } else if (event.getDeletedUser().getUserId() == null) {
219 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
220 } else if (event.getDeletedUser().getUserId() < 1) {
222 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
226 this.removeFromList(event.getDeletedUser());
233 * Event observer for linked users with existing contact data
235 * @param event Event being fired
237 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
238 // event should not be null
241 throw new NullPointerException("event is null"); //NOI18N
242 } else if (event.getLinkedUser() == null) {
244 throw new NullPointerException("event.linkedUser is null"); //NOI18N
245 } else if (event.getLinkedUser().getUserId() == null) {
247 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
248 } else if (event.getLinkedUser().getUserId() < 1) {
250 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
254 this.updateList(event.getLinkedUser());
260 this.setUserId(event.getLinkedUser().getUserId());
264 * Event observer for locked users
266 * @param event Event being fired
268 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
269 // event should not be null
272 throw new NullPointerException("event is null"); //NOI18N
273 } else if (event.getLockedUser() == null) {
275 throw new NullPointerException("event.lockedUser is null"); //NOI18N
276 } else if (event.getLockedUser().getUserId() == null) {
278 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
279 } else if (event.getLockedUser().getUserId() < 1) {
281 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
285 this.updateList(event.getLockedUser());
289 * Event observer for unlocked users
291 * @param event Event being fired
293 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
294 // event should not be null
297 throw new NullPointerException("event is null"); //NOI18N
298 } else if (event.getUnlockedUser() == null) {
300 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
301 } else if (event.getUnlockedUser().getUserId() == null) {
303 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
304 } else if (event.getUnlockedUser().getUserId() < 1) {
306 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
310 this.updateList(event.getUnlockedUser());
314 * Event observer for updated user data by administrator
316 * @param event Event being updated
318 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
319 // event should not be null
322 throw new NullPointerException("event is null"); //NOI18N
323 } else if (event.getUpdatedUser() == null) {
325 throw new NullPointerException("event.updatedUser is null"); //NOI18N
326 } else if (event.getUpdatedUser().getUserId() == null) {
328 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
329 } else if (event.getUpdatedUser().getUserId() < 1) {
331 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
335 this.updateList(event.getUpdatedUser());
342 * Event observer for when a bean helper has successfully created a user
343 * instance, means the user exists. If the user does not exist, this event
344 * should not fire but instead a proper exception must be thrown.
346 * @param event User created event
348 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
349 // Is the instance valid?
352 throw new NullPointerException("event is null"); //NOI18N
353 } else if (event.getCreatedUser() == null) {
355 throw new NullPointerException("event.createdUser is null"); //NOI18N
356 } else if (event.getCreatedUser().getUserId() == null) {
358 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
359 } else if (event.getCreatedUser().getUserId() < 1) {
361 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
365 User user = event.getCreatedUser();
367 // Set all fields here
372 * Observer method for events being fired when the application's locale has
375 * @param event Event being fired
377 public void afterLocaleChangeEvent (@Observes final ObservableLocaleChangeEvent event) {
378 // Is the parameter valid?
381 throw new NullPointerException("event is null");
382 } else if (event.getLocale() == null) {
384 throw new NullPointerException("event.locale is null");
388 this.setLocale(event.getLocale());
392 * Event observer when user confirmed account.
394 * @param event Event being fired
396 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
397 // event should not be null
400 throw new NullPointerException("event is null"); //NOI18N
401 } else if (event.getConfirmedUser() == null) {
403 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
404 } else if (event.getConfirmedUser().getUserId() == null) {
406 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
407 } else if (event.getConfirmedUser().getUserId() < 1) {
409 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
413 this.updateList(event.getConfirmedUser());
417 * Event observer for logged-in user
419 * @param event Event instance
421 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
422 // event should not be null
425 throw new NullPointerException("event is null"); //NOI18N
426 } else if (event.getLoggedInUser() == null) {
428 throw new NullPointerException("event.registeredUser is null"); //NOI18N
429 } else if (event.getLoggedInUser().getUserId() == null) {
431 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
432 } else if (event.getLoggedInUser().getUserId() < 1) {
434 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
437 // "Cache" user instance
438 User loggedInUser = event.getLoggedInUser();
440 // Copy all data to this bean
441 this.copyUser(loggedInUser);
443 // Is the user visible?
444 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
445 // Yes, then add user
446 this.visibleUserList.add(loggedInUser);
451 * Event observer for user password changes
453 * @param event Event being fired
455 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
459 throw new NullPointerException("event is null"); //NOI18N
460 } else if (event.getUserPassword() == null) {
462 throw new NullPointerException("event.userPassword is null"); //NOI18N
463 } else if (event.getUserPassword().isEmpty()) {
465 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
469 this.setUserPassword(event.getUserPassword());
470 this.setUserPasswordRepeat(event.getUserPassword());
474 * Event observer for new user registrations
476 * @param event User registration event
478 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
479 // event should not be null
482 throw new NullPointerException("event is null"); //NOI18N
483 } else if (event.getRegisteredUser() == null) {
485 throw new NullPointerException("event.registeredUser is null"); //NOI18N
486 } else if (event.getRegisteredUser().getUserId() == null) {
488 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
489 } else if (event.getRegisteredUser().getUserId() < 1) {
491 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
495 User registeredUser = event.getRegisteredUser();
497 // Copy all data from registered->user
498 this.copyUser(registeredUser);
504 this.updateList(registeredUser);
507 this.addUserName(registeredUser);
509 // Is the account public?
510 if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
511 // Also add it to this list
512 this.visibleUserList.add(registeredUser);
516 this.setUserId(registeredUser.getUserId());
520 * Method being call after user's password has been updated (and history
521 * entry has been created).
523 * @param event Event being observed
525 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
529 throw new NullPointerException("event is null"); //NOI18N
530 } else if (event.getPasswordHistory() == null) {
532 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
533 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
535 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
536 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
538 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
542 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
546 * Listens to fired event when user updated personal data
548 * @param event Event being fired
550 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
554 throw new NullPointerException("event is null"); //NOI18N
555 } else if (event.getUpdatedUser() == null) {
557 throw new NullPointerException("event.updatedUser is null"); //NOI18N
558 } else if (event.getUpdatedUser().getUserId() == null) {
560 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
561 } else if (event.getUpdatedUser().getUserId() < 1) {
563 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
567 this.updateList(event.getUpdatedUser());
571 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
572 public List<User> allUsers () {
574 return this.userList;
578 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
579 public List<User> allVisibleUsers () {
581 return this.visibleUserList;
585 * Event observer for when a user name should be cleared
587 * @param event Event being fired
589 public void clearUserNameEvent (@Observes final ObservableClearUserNameEvent event) {
593 throw new NullPointerException("event is null");
597 this.clearUserName();
601 * Event observer for when both user passwords should be cleared
603 * @param event Event being fired
605 public void clearUserPasswordEvent (@Observes final ObservableClearUserPasswordEvent event) {
609 throw new NullPointerException("event is null");
613 this.clearUserPasswords();
617 public User createUserInstance (final boolean createContactData) {
619 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
621 // Required personal data must be set
622 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
624 // Create new user instance
625 User user = new LoginUser();
627 // Is user name required?
628 if (!this.isUserNameRequired()) {
629 // Generate pseudo-random user name
630 String randomName = this.userBean.generateRandomUserName();
632 // Set it and inivisible profile
633 this.setUserName(randomName);
634 this.setUserProfileMode(ProfileMode.INVISIBLE);
636 // Generate random password
637 String randomPassword = UserLoginUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
639 // Set random password
640 this.setUserPassword(randomPassword);
641 this.setUserPasswordRepeat(randomPassword);
644 // Set user name profile mode and locale
645 user.setUserName(this.getUserName());
646 user.setUserProfileMode(this.getUserProfileMode());
647 user.setUserLocale(this.getLocale());
649 // Is multiple registration page
650 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
651 // Create contact instance
652 Contact contact = this.contactController.createContactInstance();
655 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
656 // Set contact in user
657 user.setUserContact(contact);
661 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
667 public User createUserLogin () {
669 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
672 if (this.getUserName() == null) {
674 throw new NullPointerException("userName is null"); //NOI18N
675 } else if (this.getUserName().isEmpty()) {
677 throw new IllegalStateException("userName is empty."); //NOI18N
680 // Create new user instance
681 User user = new LoginUser();
683 // Update all data ...
684 user.setUserName(this.getUserName());
687 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
688 // Return the new instance
693 public String doChangePersonalData () {
694 // This method shall only be called if the user is logged-in
695 if (!this.userLoginController.isUserLoggedIn()) {
697 throw new IllegalStateException("User is not logged-in"); //NOI18N
698 } else if (!this.isRequiredChangePersonalDataSet()) {
699 // Not all required fields are set
700 throw new FaceletException("Not all required fields are set."); //NOI18N
701 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
702 // Password not matching
703 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
704 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
705 // Editing is not allowed
706 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
710 User user = this.userLoginController.getLoggedInUser();
712 // Copy contact data to contact instance
713 this.contactController.updateContactDataFromController(user.getUserContact());
715 // It should be there, so run some tests on it
716 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
717 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
718 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
719 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
720 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
721 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
724 user.setUserProfileMode(this.getUserProfileMode());
726 // Send it to the EJB
727 User updatedUser = this.userBean.updateUserPersonalData(user);
730 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
733 return "user_contact_data_saved"; //NOI18N
741 public Long getUserId () {
748 * @param userId User id
750 public void setUserId (final Long userId) {
751 this.userId = userId;
755 * Getter for user name
759 public String getUserName () {
760 return this.userName;
764 * Setter for user name
766 * @param userName User name
768 public void setUserName (final String userName) {
769 this.userName = userName;
773 public String getUserPassword () {
774 return this.userPassword;
778 * Setter for clear-text user password
780 * @param userPassword Clear-text user password
782 public void setUserPassword (final String userPassword) {
783 this.userPassword = userPassword;
787 * Getter for clear-text user password repeated
789 * @return Clear-text user password repeated
791 public String getUserPasswordRepeat () {
792 return this.userPasswordRepeat;
796 * Setter for clear-text user password repeated
798 * @param userPasswordRepeat Clear-text user password repeated
800 public void setUserPasswordRepeat (final String userPasswordRepeat) {
801 this.userPasswordRepeat = userPasswordRepeat;
805 * Getter for user profile mode
807 * @return User profile mode
809 public ProfileMode getUserProfileMode () {
810 return this.userProfileMode;
814 * Setter for user profile mode
816 * @param userProfileMode User profile mode
818 public void setUserProfileMode (final ProfileMode userProfileMode) {
819 this.userProfileMode = userProfileMode;
823 public boolean ifBothPasswordsEmptyAllowed () {
824 // Check feature first
825 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
826 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
827 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
831 * Post-initialization of this class
834 public void init () {
837 // Get initial context
838 Context context = new InitialContext();
841 this.userBean = (UserSessionBeanRemote) context.lookup("java:global/jjobs-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
842 } catch (final NamingException e) {
844 throw new FaceletException(e);
847 // Initialize user list
848 this.userList = this.userBean.allUsers();
850 // Get full user name list for reducing EJB calls
851 this.userNameList = this.userBean.getUserNameList();
853 // Is the user logged-in?
854 if (this.userLoginController.isUserLoggedIn()) {
855 // Is logged-in, so load also users visible to memebers
856 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
858 // Initialize user list
859 this.visibleUserList = this.userBean.allPublicUsers();
864 public boolean isContactFound (final Contact contact) {
865 // The contact must be valid
866 if (null == contact) {
868 throw new NullPointerException("contact is null"); //NOI18N
869 } else if (contact.getContactId() == null) {
871 throw new NullPointerException("contact.contactId is null"); //NOI18N
872 } else if (contact.getContactId() < 1) {
874 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
877 // Default is not found
878 boolean isFound = false;
881 Iterator<User> iterator = this.allUsers().iterator();
883 // Loop through all entries
884 while (iterator.hasNext()) {
886 User next = iterator.next();
888 // Compare both objects
889 if (Objects.equals(contact, next.getUserContact())) {
901 public boolean isPublicUserProfileEnabled () {
902 // Get context parameter
903 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
906 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
908 // This requires user names being enabled, too.
909 if ((isEnabled) && (!this.isUserNameRequired())) {
910 // Not valid state, users must be able to modify their profile, especially when it is public
911 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
919 public boolean isRequiredChangePersonalDataSet () {
920 return ((this.getUserProfileMode() != null) &&
921 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
922 (this.contactController.isRequiredChangePersonalDataSet()));
926 public boolean isRequiredPersonalDataSet () {
927 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
928 // Multiple registration page
929 return this.contactController.isRequiredPersonalDataSet();
931 // Single registration page
932 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
933 (this.getUserProfileMode() != null) &&
934 (this.contactController.isRequiredPersonalDataSet()) &&
935 (this.getUserPassword() != null) &&
936 (this.getUserPasswordRepeat() != null));
941 public boolean isSamePasswordEntered () {
942 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
946 public boolean isUserIdEmpty () {
947 return ((this.getUserId() == null) || (this.getUserId() == 0));
951 public boolean isUserNameRegistered (final User user) {
952 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
956 public boolean isUserNameRequired () {
957 // Get context parameter
958 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
961 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
968 public boolean isVisibleUserFound () {
969 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
973 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
974 // Parameter must be valid
975 if (null == emailAddress) {
977 throw new NullPointerException("emailAddress is null"); //NOI18N
978 } else if (emailAddress.isEmpty()) {
980 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
986 // Try to lookup it in visible user list
987 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
989 User next = iterator.next();
991 // Contact should be set
992 if (next.getUserContact() == null) {
994 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
995 } else if (next.getUserContact().getContactEmailAddress() == null) {
996 // Email address should be set
997 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
1000 // Is the email address found?
1001 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
1002 // Copy to other variable
1008 // Is it still null?
1010 // Not visible for the current user
1011 throw new UserEmailAddressNotFoundException(emailAddress);
1019 public User lookupUserById (final Long userId) throws UserNotFoundException {
1020 // Parameter must be valid
1021 if (null == userId) {
1023 throw new NullPointerException("userId is null"); //NOI18N
1024 } else if (userId < 1) {
1026 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
1032 // Try to lookup it in visible user list
1033 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
1035 User next = iterator.next();
1037 // Is the user id found?
1038 if (Objects.equals(next.getUserId(), userId)) {
1039 // Copy to other variable
1045 // Is it still null?
1047 // Not visible for the current user
1048 throw new UserNotFoundException(userId);
1056 * Adds user's name to bean's internal list. It also updates the public user
1057 * list if the user has decided to have a public account,
1059 * @param user User instance
1061 private void addUserName (final User user) {
1062 // Make sure the entry is not added yet
1063 if (this.userNameList.contains(user.getUserName())) {
1065 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1069 this.userNameList.add(user.getUserName());
1075 private void clear () {
1078 this.setUserId(null);
1079 this.setUserProfileMode(null);
1082 this.clearUserName();
1083 this.clearUserPasswords();
1084 this.setLocale(null);
1090 private void clearUserName () {
1092 this.setUserName(null);
1096 * Clears both user passwords
1098 private void clearUserPasswords () {
1100 this.setUserPassword(null);
1101 this.setUserPasswordRepeat(null);
1105 * Copies given user into the controller
1107 * @param user User instance
1109 private void copyUser (final User user) {
1110 // Make sure the instance is valid
1113 throw new NullPointerException("user is null"); //NOI18N
1114 } else if (user.getUserContact() == null) {
1116 throw new NullPointerException("user.userContact is null"); //NOI18N
1121 this.setUserId(user.getUserId());
1122 this.setUserProfileMode(user.getUserProfileMode());
1126 * Getter for locale instance
1128 * @return Locale instance
1130 private Locale getLocale () {
1135 * Setter for locale instance
1137 * @param locale Locale instance
1139 private void setLocale (final Locale locale) {
1140 this.locale = locale;
1144 * Removes user from all lists
1146 * @param user User to remove
1148 private void removeFromList (final User user) {
1149 // The user should be valid
1152 throw new NullPointerException("user is null"); //NOI18N
1153 } else if (user.getUserId() == null) {
1155 throw new NullPointerException("user.userId is null"); //NOI18N
1156 } else if (user.getUserId() < 1) {
1158 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1161 // Remove it from lists
1162 this.userList.remove(user);
1163 this.visibleUserList.remove(user);
1165 // Remove name from list
1166 this.userNameList.remove(user.getUserName());
1170 * Updates list with given user instance
1172 * @param user User instance
1174 private void updateList (final User user) {
1175 // The user should be valid
1178 throw new NullPointerException("user is null"); //NOI18N
1179 } else if (user.getUserId() == null) {
1181 throw new NullPointerException("user.userId is null"); //NOI18N
1182 } else if (user.getUserId() < 1) {
1184 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1185 } else if (user.getUserContact() == null) {
1187 throw new NullPointerException("user.userContact is null"); //NOI18N
1188 } else if (user.getUserContact().getContactId() == null) {
1190 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1191 } else if (user.getUserContact().getContactId() < 1) {
1193 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1196 // Get iterator from list
1197 Iterator<User> iterator = this.userList.iterator();
1199 // "Walk" through all entries
1200 while (iterator.hasNext()) {
1202 User next = iterator.next();
1204 // Is user id number the same?
1205 if (Objects.equals(user.getUserId(), next.getUserId())) {
1206 // Found entry, so remove it and abort
1207 this.userList.remove(next);
1213 this.userList.add(user);