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.user.add.ObservableAdminAddedUserEvent;
37 import org.mxchange.jusercore.events.user.created.ObservableCreatedUserEvent;
38 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
39 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
40 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
41 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
42 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
43 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
44 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
45 import org.mxchange.jusercore.exceptions.UserEmailAddressNotFoundException;
46 import org.mxchange.jusercore.exceptions.UserNotFoundException;
47 import org.mxchange.jusercore.model.user.LoginUser;
48 import org.mxchange.jusercore.model.user.User;
49 import org.mxchange.jusercore.model.user.UserSessionBeanRemote;
50 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
51 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
52 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
53 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
54 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
55 import org.mxchange.juserlogincore.exceptions.UserPasswordMismatchException;
56 import org.mxchange.juserlogincore.login.UserLoginUtils;
57 import org.mxchange.pizzaapplication.beans.BasePizzaController;
58 import org.mxchange.pizzaapplication.beans.contact.PizzaContactWebSessionController;
59 import org.mxchange.pizzaapplication.beans.features.PizzaFeaturesWebApplicationController;
60 import org.mxchange.pizzaapplication.beans.localization.PizzaLocalizationSessionController;
61 import org.mxchange.pizzaapplication.beans.user.login.PizzaUserLoginWebSessionController;
64 * A user bean (controller)
66 * @author Roland Häder<roland@mxchange.org>
68 @Named ("userController")
70 public class PizzaUserWebSessionBean extends BasePizzaController implements PizzaUserWebSessionController {
75 private static final long serialVersionUID = 542_145_347_916L;
78 * General contact controller
81 private PizzaContactWebSessionController contactController;
87 private PizzaFeaturesWebApplicationController featureController;
90 * Localization controller
93 private PizzaLocalizationSessionController localizationController;
96 * Event being fired when user updated personal data
100 private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
105 private UserSessionBeanRemote userBean;
113 * A list of all user profiles
115 private List<User> userList;
118 * Login controller (bean)
121 private PizzaUserLoginWebSessionController userLoginController;
126 private String userName;
131 private List<String> userNameList;
134 * User password (clear-text from web form)
136 private String userPassword;
139 * User password repeated (clear-text from web form)
141 private String userPasswordRepeat;
144 * Whether the user wants a public profile
146 private ProfileMode userProfileMode;
149 * A list of all public user profiles
151 * @TODO Hmm, makes that sense? Having visible user list in current
152 * (session-scoped) user's visible user list?
154 private List<User> visibleUserList;
157 * Default constructor
159 public PizzaUserWebSessionBean () {
160 // Call super constructor
165 * Event observer for newly added users by administrator
167 * @param event Event being fired
169 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
170 // event should not be null
173 throw new NullPointerException("event is null"); //NOI18N
174 } else if (event.getAddedUser() == null) {
176 throw new NullPointerException("event.addedUser is null"); //NOI18N
177 } else if (event.getAddedUser().getUserId() == null) {
179 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
180 } else if (event.getAddedUser().getUserId() < 1) {
182 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
186 this.updateList(event.getAddedUser());
192 this.setUserId(event.getAddedUser().getUserId());
196 * Event observer for deleted user accounts (by administrator)
198 * @param event Event being fired
200 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
201 // event should not be null
204 throw new NullPointerException("event is null"); //NOI18N
205 } else if (event.getDeletedUser() == null) {
207 throw new NullPointerException("event.deletedUser is null"); //NOI18N
208 } else if (event.getDeletedUser().getUserId() == null) {
210 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
211 } else if (event.getDeletedUser().getUserId() < 1) {
213 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
217 this.removeFromList(event.getDeletedUser());
224 * Event observer for linked users with existing contact data
226 * @param event Event being fired
228 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
229 // event should not be null
232 throw new NullPointerException("event is null"); //NOI18N
233 } else if (event.getLinkedUser() == null) {
235 throw new NullPointerException("event.linkedUser is null"); //NOI18N
236 } else if (event.getLinkedUser().getUserId() == null) {
238 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
239 } else if (event.getLinkedUser().getUserId() < 1) {
241 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
245 this.updateList(event.getLinkedUser());
251 this.setUserId(event.getLinkedUser().getUserId());
255 * Event observer for locked users
257 * @param event Event being fired
259 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
260 // event should not be null
263 throw new NullPointerException("event is null"); //NOI18N
264 } else if (event.getLockedUser() == null) {
266 throw new NullPointerException("event.lockedUser is null"); //NOI18N
267 } else if (event.getLockedUser().getUserId() == null) {
269 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
270 } else if (event.getLockedUser().getUserId() < 1) {
272 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
276 this.updateList(event.getLockedUser());
280 * Event observer for unlocked users
282 * @param event Event being fired
284 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
285 // event should not be null
288 throw new NullPointerException("event is null"); //NOI18N
289 } else if (event.getUnlockedUser() == null) {
291 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
292 } else if (event.getUnlockedUser().getUserId() == null) {
294 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
295 } else if (event.getUnlockedUser().getUserId() < 1) {
297 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
301 this.updateList(event.getUnlockedUser());
305 * Event observer for updated user data by administrator
307 * @param event Event being updated
309 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
310 // event should not be null
313 throw new NullPointerException("event is null"); //NOI18N
314 } else if (event.getUpdatedUser() == null) {
316 throw new NullPointerException("event.updatedUser is null"); //NOI18N
317 } else if (event.getUpdatedUser().getUserId() == null) {
319 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
320 } else if (event.getUpdatedUser().getUserId() < 1) {
322 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
326 this.updateList(event.getUpdatedUser());
333 * Event observer for when a bean helper has successfully created a user
334 * instance, means the user exists. If the user does not exist, this event
335 * should not fire but instead a proper exception must be thrown.
337 * @param event User created event
339 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
340 // Is the instance valid?
343 throw new NullPointerException("event is null"); //NOI18N
344 } else if (event.getCreatedUser() == null) {
346 throw new NullPointerException("event.createdUser is null"); //NOI18N
347 } else if (event.getCreatedUser().getUserId() == null) {
349 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
350 } else if (event.getCreatedUser().getUserId() < 1) {
352 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
356 User user = event.getCreatedUser();
358 // Set all fields here
363 * Event observer when user confirmed account.
365 * @param event Event being fired
367 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
368 // event should not be null
371 throw new NullPointerException("event is null"); //NOI18N
372 } else if (event.getConfirmedUser() == null) {
374 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
375 } else if (event.getConfirmedUser().getUserId() == null) {
377 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
378 } else if (event.getConfirmedUser().getUserId() < 1) {
380 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
384 this.updateList(event.getConfirmedUser());
388 * Event observer for logged-in user
390 * @param event Event instance
392 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
393 // event should not be null
396 throw new NullPointerException("event is null"); //NOI18N
397 } else if (event.getLoggedInUser() == null) {
399 throw new NullPointerException("event.registeredUser is null"); //NOI18N
400 } else if (event.getLoggedInUser().getUserId() == null) {
402 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
403 } else if (event.getLoggedInUser().getUserId() < 1) {
405 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
408 // "Cache" user instance
409 User loggedInUser = event.getLoggedInUser();
411 // Copy all data to this bean
412 this.copyUser(loggedInUser);
414 // Is the user visible?
415 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
416 // Yes, then add user
417 this.visibleUserList.add(loggedInUser);
422 * Event observer for user password changes
424 * @param event Event being fired
426 public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
430 throw new NullPointerException("event is null"); //NOI18N
431 } else if (event.getUserPassword() == null) {
433 throw new NullPointerException("event.userPassword is null"); //NOI18N
434 } else if (event.getUserPassword().isEmpty()) {
436 throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
440 this.setUserPassword(event.getUserPassword());
441 this.setUserPasswordRepeat(event.getUserPassword());
445 * Event observer for new user registrations
447 * @param event User registration event
449 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
450 // event should not be null
453 throw new NullPointerException("event is null"); //NOI18N
454 } else if (event.getRegisteredUser() == null) {
456 throw new NullPointerException("event.registeredUser is null"); //NOI18N
457 } else if (event.getRegisteredUser().getUserId() == null) {
459 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
460 } else if (event.getRegisteredUser().getUserId() < 1) {
462 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
466 User registeredUser = event.getRegisteredUser();
468 // Copy all data from registered->user
469 this.copyUser(registeredUser);
475 this.updateList(registeredUser);
478 this.addUserName(registeredUser);
480 // Is the account public?
481 if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
482 // Also add it to this list
483 this.visibleUserList.add(registeredUser);
487 this.setUserId(registeredUser.getUserId());
491 * Method being call after user's password has been updated (and history
492 * entry has been created).
494 * @param event Event being observed
496 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
500 throw new NullPointerException("event is null"); //NOI18N
501 } else if (event.getPasswordHistory() == null) {
503 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
504 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
506 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
507 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
509 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
513 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
517 * Listens to fired event when user updated personal data
519 * @param event Event being fired
521 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
525 throw new NullPointerException("event is null"); //NOI18N
526 } else if (event.getUpdatedUser() == null) {
528 throw new NullPointerException("event.updatedUser is null"); //NOI18N
529 } else if (event.getUpdatedUser().getUserId() == null) {
531 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
532 } else if (event.getUpdatedUser().getUserId() < 1) {
534 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
538 this.updateList(event.getUpdatedUser());
542 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
543 public List<User> allUsers () {
545 return this.userList;
549 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
550 public List<User> allVisibleUsers () {
552 return this.visibleUserList;
556 public void clearUserName () {
558 this.setUserName(null);
562 public void clearUserPasswords () {
564 this.setUserPassword(null);
565 this.setUserPasswordRepeat(null);
569 public User createUserInstance (final boolean createContactData) {
571 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
573 // Required personal data must be set
574 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
576 // Create new user instance
577 User user = new LoginUser();
579 // Is user name required?
580 if (!this.isUserNameRequired()) {
581 // Generate pseudo-random user name
582 String randomName = this.userBean.generateRandomUserName();
584 // Set it and inivisible profile
585 this.setUserName(randomName);
586 this.setUserProfileMode(ProfileMode.INVISIBLE);
588 // Generate random password
589 String randomPassword = UserLoginUtils.createRandomPassword(PizzaUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
591 // Set random password
592 this.setUserPassword(randomPassword);
593 this.setUserPasswordRepeat(randomPassword);
596 // Set user name profile mode and locale
597 user.setUserName(this.getUserName());
598 user.setUserProfileMode(this.getUserProfileMode());
599 user.setUserLocale(this.localizationController.getLocale());
601 // Is multiple registration page
602 if ((createContactData) || (!this.featureController.isFeatureEnabled("user_register_multiple_page"))) { //NOI18N
603 // Create contact instance
604 Contact contact = this.contactController.createContactInstance();
607 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
608 // Set contact in user
609 user.setUserContact(contact);
613 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
619 public User createUserLogin () {
621 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
624 if (this.getUserName() == null) {
626 throw new NullPointerException("userName is null"); //NOI18N
627 } else if (this.getUserName().isEmpty()) {
629 throw new IllegalStateException("userName is empty."); //NOI18N
632 // Create new user instance
633 User user = new LoginUser();
635 // Update all data ...
636 user.setUserName(this.getUserName());
639 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
640 // Return the new instance
645 public String doChangePersonalData () {
646 // This method shall only be called if the user is logged-in
647 if (!this.userLoginController.isUserLoggedIn()) {
649 throw new IllegalStateException("User is not logged-in"); //NOI18N
650 } else if (!this.isRequiredChangePersonalDataSet()) {
651 // Not all required fields are set
652 throw new FaceletException("Not all required fields are set."); //NOI18N
653 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
654 // Password not matching
655 throw new FaceletException(new UserPasswordMismatchException(this.userLoginController.getLoggedInUser()));
656 } else if (!this.featureController.isFeatureEnabled("change_user_personal_data")) { //NOI18N
657 // Editing is not allowed
658 throw new IllegalStateException("User tried to edit personal data."); //NOI18N
662 User user = this.userLoginController.getLoggedInUser();
664 // Copy contact data to contact instance
665 this.contactController.updateContactDataFromController(user.getUserContact());
667 // It should be there, so run some tests on it
668 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
669 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
670 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
671 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
672 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
673 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
676 user.setUserProfileMode(this.getUserProfileMode());
678 // Send it to the EJB
679 User updatedUser = this.userBean.updateUserPersonalData(user);
682 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
685 return "user_contact_data_saved"; //NOI18N
693 public Long getUserId () {
700 * @param userId User id
702 public void setUserId (final Long userId) {
703 this.userId = userId;
707 * Getter for user name
711 public String getUserName () {
712 return this.userName;
716 * Setter for user name
718 * @param userName User name
720 public void setUserName (final String userName) {
721 this.userName = userName;
725 public String getUserPassword () {
726 return this.userPassword;
730 * Setter for clear-text user password
732 * @param userPassword Clear-text user password
734 public void setUserPassword (final String userPassword) {
735 this.userPassword = userPassword;
739 * Getter for clear-text user password repeated
741 * @return Clear-text user password repeated
743 public String getUserPasswordRepeat () {
744 return this.userPasswordRepeat;
748 * Setter for clear-text user password repeated
750 * @param userPasswordRepeat Clear-text user password repeated
752 public void setUserPasswordRepeat (final String userPasswordRepeat) {
753 this.userPasswordRepeat = userPasswordRepeat;
757 * Getter for user profile mode
759 * @return User profile mode
761 public ProfileMode getUserProfileMode () {
762 return this.userProfileMode;
766 * Setter for user profile mode
768 * @param userProfileMode User profile mode
770 public void setUserProfileMode (final ProfileMode userProfileMode) {
771 this.userProfileMode = userProfileMode;
775 public boolean ifBothPasswordsEmptyAllowed () {
776 // Check feature first
777 return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) && //NOI18N
778 ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
779 ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
783 * Post-initialization of this class
786 public void init () {
789 // Get initial context
790 Context context = new InitialContext();
793 this.userBean = (UserSessionBeanRemote) context.lookup("java:global/pizzaservice-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
794 } catch (final NamingException e) {
796 throw new FaceletException(e);
799 // Initialize user list
800 this.userList = this.userBean.allUsers();
802 // Get full user name list for reducing EJB calls
803 this.userNameList = this.userBean.getUserNameList();
805 // Is the user logged-in?
806 if (this.userLoginController.isUserLoggedIn()) {
807 // Is logged-in, so load also users visible to memebers
808 this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
810 // Initialize user list
811 this.visibleUserList = this.userBean.allPublicUsers();
816 public boolean isContactFound (final Contact contact) {
817 // The contact must be valid
818 if (null == contact) {
820 throw new NullPointerException("contact is null"); //NOI18N
821 } else if (contact.getContactId() == null) {
823 throw new NullPointerException("contact.contactId is null"); //NOI18N
824 } else if (contact.getContactId() < 1) {
826 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
829 // Default is not found
830 boolean isFound = false;
833 Iterator<User> iterator = this.allUsers().iterator();
835 // Loop through all entries
836 while (iterator.hasNext()) {
838 User next = iterator.next();
840 // Compare both objects
841 if (Objects.equals(contact, next.getUserContact())) {
853 public boolean isPublicUserProfileEnabled () {
854 // Get context parameter
855 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
858 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
860 // This requires user names being enabled, too.
861 if ((isEnabled) && (!this.isUserNameRequired())) {
862 // Not valid state, users must be able to modify their profile, especially when it is public
863 throw new IllegalStateException("Public user profiles are enabled but user name requirement is disabled, this is not possible."); //NOI18N
871 public boolean isRequiredChangePersonalDataSet () {
872 return ((this.getUserProfileMode() != null) &&
873 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
874 (this.contactController.isRequiredChangePersonalDataSet()));
878 public boolean isRequiredPersonalDataSet () {
879 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
880 // Multiple registration page
881 return this.contactController.isRequiredPersonalDataSet();
883 // Single registration page
884 return (((this.getUserName() != null) || (!this.isUserNameRequired())) &&
885 (this.getUserProfileMode() != null) &&
886 (this.contactController.isRequiredPersonalDataSet()) &&
887 (this.getUserPassword() != null) &&
888 (this.getUserPasswordRepeat() != null));
893 public boolean isSamePasswordEntered () {
894 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
898 public boolean isUserIdEmpty () {
899 return ((this.getUserId() == null) || (this.getUserId() == 0));
903 public boolean isUserNameRegistered (final User user) {
904 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
908 public boolean isUserNameRequired () {
909 // Get context parameter
910 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
913 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
920 public boolean isVisibleUserFound () {
921 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
925 public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
926 // Parameter must be valid
927 if (null == emailAddress) {
929 throw new NullPointerException("emailAddress is null"); //NOI18N
930 } else if (emailAddress.isEmpty()) {
932 throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
938 // Try to lookup it in visible user list
939 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
941 User next = iterator.next();
943 // Contact should be set
944 if (next.getUserContact() == null) {
946 throw new NullPointerException(MessageFormat.format("next.userContact is null for user id {0}", next.getUserId())); //NOI18N
947 } else if (next.getUserContact().getContactEmailAddress() == null) {
948 // Email address should be set
949 throw new NullPointerException(MessageFormat.format("next.userContact.contactEmailAddress is null for user id {0}", next.getUserId())); //NOI18N
952 // Is the email address found?
953 if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
954 // Copy to other variable
962 // Not visible for the current user
963 throw new UserEmailAddressNotFoundException(emailAddress);
971 public User lookupUserById (final Long userId) throws UserNotFoundException {
972 // Parameter must be valid
973 if (null == userId) {
975 throw new NullPointerException("userId is null"); //NOI18N
976 } else if (userId < 1) {
978 throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
984 // Try to lookup it in visible user list
985 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
987 User next = iterator.next();
989 // Is the user id found?
990 if (Objects.equals(next.getUserId(), userId)) {
991 // Copy to other variable
999 // Not visible for the current user
1000 throw new UserNotFoundException(userId);
1008 * Adds user's name to bean's internal list. It also updates the public user
1009 * list if the user has decided to have a public account,
1011 * @param user User instance
1013 private void addUserName (final User user) {
1014 // Make sure the entry is not added yet
1015 if (this.userNameList.contains(user.getUserName())) {
1017 throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1021 this.userNameList.add(user.getUserName());
1027 private void clear () {
1030 this.setUserId(null);
1031 this.setUserProfileMode(null);
1034 this.clearUserName();
1035 this.clearUserPasswords();
1039 * Copies given user into the controller
1041 * @param user User instance
1043 private void copyUser (final User user) {
1044 // Make sure the instance is valid
1047 throw new NullPointerException("user is null"); //NOI18N
1048 } else if (user.getUserContact() == null) {
1050 throw new NullPointerException("user.userContact is null"); //NOI18N
1055 this.setUserId(user.getUserId());
1056 this.setUserProfileMode(user.getUserProfileMode());
1060 * Removes user from all lists
1062 * @param user User to remove
1064 private void removeFromList (final User user) {
1065 // The user should be valid
1068 throw new NullPointerException("user is null"); //NOI18N
1069 } else if (user.getUserId() == null) {
1071 throw new NullPointerException("user.userId is null"); //NOI18N
1072 } else if (user.getUserId() < 1) {
1074 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1077 // Remove it from lists
1078 this.userList.remove(user);
1079 this.visibleUserList.remove(user);
1081 // Remove name from list
1082 this.userNameList.remove(user.getUserName());
1086 * Updates list with given user instance
1088 * @param user User instance
1090 private void updateList (final User user) {
1091 // The user should be valid
1094 throw new NullPointerException("user is null"); //NOI18N
1095 } else if (user.getUserId() == null) {
1097 throw new NullPointerException("user.userId is null"); //NOI18N
1098 } else if (user.getUserId() < 1) {
1100 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1101 } else if (user.getUserContact() == null) {
1103 throw new NullPointerException("user.userContact is null"); //NOI18N
1104 } else if (user.getUserContact().getContactId() == null) {
1106 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1107 } else if (user.getUserContact().getContactId() < 1) {
1109 throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1112 // Get iterator from list
1113 Iterator<User> iterator = this.userList.iterator();
1115 // "Walk" through all entries
1116 while (iterator.hasNext()) {
1118 User next = iterator.next();
1120 // Is user id number the same?
1121 if (Objects.equals(user.getUserId(), next.getUserId())) {
1122 // Found entry, so remove it and abort
1123 this.userList.remove(next);
1129 this.userList.add(user);