]> git.mxchange.org Git - pizzaservice-war.git/blob - src/java/org/mxchange/pizzaapplication/beans/user/PizzaUserWebSessionBean.java
8cc22846a16e6362b0b55b1b125733472c65c9ae
[pizzaservice-war.git] / src / java / org / mxchange / pizzaapplication / beans / user / PizzaUserWebSessionBean.java
1 /*
2  * Copyright (C) 2016, 2017 Roland Häder
3  *
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.
8  *
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.
13  *
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/>.
16  */
17 package org.mxchange.pizzaapplication.beans.user;
18
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.delete.ObservableAdminDeletedUserEvent;
38 import org.mxchange.jusercore.events.user.helper.created.ObservableHelperCreatedContactEvent;
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;
62
63 /**
64  * A user bean (controller)
65  * <p>
66  * @author Roland Häder<roland@mxchange.org>
67  */
68 @Named ("userController")
69 @SessionScoped
70 public class PizzaUserWebSessionBean extends BasePizzaController implements PizzaUserWebSessionController {
71
72         /**
73          * Serial number
74          */
75         private static final long serialVersionUID = 542_145_347_916L;
76
77         /**
78          * General contact controller
79          */
80         @Inject
81         private PizzaContactWebSessionController contactController;
82
83         /**
84          * Features controller
85          */
86         @Inject
87         private PizzaFeaturesWebApplicationController featureController;
88
89         /**
90          * Localization controller
91          */
92         @Inject
93         private PizzaLocalizationSessionController localizationController;
94
95         /**
96          * Event being fired when user updated personal data
97          */
98         @Inject
99         @Any
100         private Event<ObservableUpdatedUserPersonalDataEvent> updatedPersonalDataEvent;
101
102         /**
103          * Remote user bean
104          */
105         private UserSessionBeanRemote userBean;
106
107         /**
108          * User id
109          */
110         private Long userId;
111
112         /**
113          * A list of all user profiles
114          */
115         private List<User> userList;
116
117         /**
118          * Login controller (bean)
119          */
120         @Inject
121         private PizzaUserLoginWebSessionController userLoginController;
122
123         /**
124          * User name
125          */
126         private String userName;
127
128         /**
129          * User name list
130          */
131         private List<String> userNameList;
132
133         /**
134          * User password (clear-text from web form)
135          */
136         private String userPassword;
137
138         /**
139          * User password repeated (clear-text from web form)
140          */
141         private String userPasswordRepeat;
142
143         /**
144          * Whether the user wants a public profile
145          */
146         private ProfileMode userProfileMode;
147
148         /**
149          * A list of all public user profiles
150          * <p>
151          * @TODO Hmm, makes that sense? Having visible user list in current
152          * (session-scoped) user's visible user list?
153          */
154         private List<User> visibleUserList;
155
156         /**
157          * Default constructor
158          */
159         public PizzaUserWebSessionBean () {
160                 // Call super constructor
161                 super();
162         }
163
164         /**
165          * Event observer for newly added users by administrator
166          * <p>
167          * @param event Event being fired
168          */
169         public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
170                 // event should not be null
171                 if (null == event) {
172                         // Throw NPE
173                         throw new NullPointerException("event is null"); //NOI18N
174                 } else if (event.getAddedUser() == null) {
175                         // Throw NPE again
176                         throw new NullPointerException("event.addedUser is null"); //NOI18N
177                 } else if (event.getAddedUser().getUserId() == null) {
178                         // userId is null
179                         throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
180                 } else if (event.getAddedUser().getUserId() < 1) {
181                         // Not avalid id
182                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
183                 }
184
185                 // Update user list
186                 this.updateList(event.getAddedUser());
187
188                 // Clear all data
189                 this.clear();
190
191                 // Set user id again
192                 this.setUserId(event.getAddedUser().getUserId());
193         }
194
195         /**
196          * Event observer for deleted user accounts (by administrator)
197          * <p>
198          * @param event Event being fired
199          */
200         public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
201                 // event should not be null
202                 if (null == event) {
203                         // Throw NPE
204                         throw new NullPointerException("event is null"); //NOI18N
205                 } else if (event.getDeletedUser() == null) {
206                         // Throw NPE again
207                         throw new NullPointerException("event.deletedUser is null"); //NOI18N
208                 } else if (event.getDeletedUser().getUserId() == null) {
209                         // userId is null
210                         throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
211                 } else if (event.getDeletedUser().getUserId() < 1) {
212                         // Not avalid id
213                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
214                 }
215
216                 // Update user list
217                 this.removeFromList(event.getDeletedUser());
218
219                 // Clear all data
220                 this.clear();
221         }
222
223         /**
224          * Event observer for linked users with existing contact data
225          * <p>
226          * @param event Event being fired
227          */
228         public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
229                 // event should not be null
230                 if (null == event) {
231                         // Throw NPE
232                         throw new NullPointerException("event is null"); //NOI18N
233                 } else if (event.getLinkedUser() == null) {
234                         // Throw NPE again
235                         throw new NullPointerException("event.linkedUser is null"); //NOI18N
236                 } else if (event.getLinkedUser().getUserId() == null) {
237                         // userId is null
238                         throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
239                 } else if (event.getLinkedUser().getUserId() < 1) {
240                         // Not avalid id
241                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
242                 }
243
244                 // Update user list
245                 this.updateList(event.getLinkedUser());
246
247                 // Clear all data
248                 this.clear();
249
250                 // Set user id again
251                 this.setUserId(event.getLinkedUser().getUserId());
252         }
253
254         /**
255          * Event observer for locked users
256          * <p>
257          * @param event Event being fired
258          */
259         public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
260                 // event should not be null
261                 if (null == event) {
262                         // Throw NPE
263                         throw new NullPointerException("event is null"); //NOI18N
264                 } else if (event.getLockedUser() == null) {
265                         // Throw NPE again
266                         throw new NullPointerException("event.lockedUser is null"); //NOI18N
267                 } else if (event.getLockedUser().getUserId() == null) {
268                         // userId is null
269                         throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
270                 } else if (event.getLockedUser().getUserId() < 1) {
271                         // Not avalid id
272                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
273                 }
274
275                 // Update user list
276                 this.updateList(event.getLockedUser());
277         }
278
279         /**
280          * Event observer for unlocked users
281          * <p>
282          * @param event Event being fired
283          */
284         public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
285                 // event should not be null
286                 if (null == event) {
287                         // Throw NPE
288                         throw new NullPointerException("event is null"); //NOI18N
289                 } else if (event.getUnlockedUser() == null) {
290                         // Throw NPE again
291                         throw new NullPointerException("event.unlockedUser is null"); //NOI18N
292                 } else if (event.getUnlockedUser().getUserId() == null) {
293                         // userId is null
294                         throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
295                 } else if (event.getUnlockedUser().getUserId() < 1) {
296                         // Not avalid id
297                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
298                 }
299
300                 // Update user list
301                 this.updateList(event.getUnlockedUser());
302         }
303
304         /**
305          * Event observer for updated user data by administrator
306          * <p>
307          * @param event Event being updated
308          */
309         public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
310                 // event should not be null
311                 if (null == event) {
312                         // Throw NPE
313                         throw new NullPointerException("event is null"); //NOI18N
314                 } else if (event.getUpdatedUser() == null) {
315                         // Throw NPE again
316                         throw new NullPointerException("event.updatedUser is null"); //NOI18N
317                 } else if (event.getUpdatedUser().getUserId() == null) {
318                         // userId is null
319                         throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
320                 } else if (event.getUpdatedUser().getUserId() < 1) {
321                         // Not avalid id
322                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
323                 }
324
325                 // Update user list
326                 this.updateList(event.getUpdatedUser());
327
328                 // Clear all data
329                 this.clear();
330         }
331
332         /**
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.
336          * <p>
337          * @param event User created event
338          */
339         public void afterHelperCreatedUserEvent (@Observes final ObservableHelperCreatedContactEvent event) {
340                 // Is the instance valid?
341                 if (null == event) {
342                         // Throw NPE
343                         throw new NullPointerException("event is null"); //NOI18N
344                 } else if (event.getCreatedUser() == null) {
345                         // Throw NPE again
346                         throw new NullPointerException("event.createdUser is null"); //NOI18N
347                 } else if (event.getCreatedUser().getUserId() == null) {
348                         // Throw NPE again
349                         throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
350                 } else if (event.getCreatedUser().getUserId() < 1) {
351                         // Throw NPE again
352                         throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
353                 }
354
355                 // Get user instance
356                 User user = event.getCreatedUser();
357
358                 // Set all fields here
359                 this.copyUser(user);
360         }
361
362         /**
363          * Event observer when user confirmed account.
364          * <p>
365          * @param event Event being fired
366          */
367         public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
368                 // event should not be null
369                 if (null == event) {
370                         // Throw NPE
371                         throw new NullPointerException("event is null"); //NOI18N
372                 } else if (event.getConfirmedUser() == null) {
373                         // Throw NPE again
374                         throw new NullPointerException("event.confirmedUser is null"); //NOI18N
375                 } else if (event.getConfirmedUser().getUserId() == null) {
376                         // userId is null
377                         throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
378                 } else if (event.getConfirmedUser().getUserId() < 1) {
379                         // Not avalid id
380                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
381                 }
382
383                 // Update user list
384                 this.updateList(event.getConfirmedUser());
385         }
386
387         /**
388          * Event observer for logged-in user
389          * <p>
390          * @param event Event instance
391          */
392         public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
393                 // event should not be null
394                 if (null == event) {
395                         // Throw NPE
396                         throw new NullPointerException("event is null"); //NOI18N
397                 } else if (event.getLoggedInUser() == null) {
398                         // Throw NPE again
399                         throw new NullPointerException("event.registeredUser is null"); //NOI18N
400                 } else if (event.getLoggedInUser().getUserId() == null) {
401                         // userId is null
402                         throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
403                 } else if (event.getLoggedInUser().getUserId() < 1) {
404                         // Not avalid id
405                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
406                 }
407
408                 // "Cache" user instance
409                 User loggedInUser = event.getLoggedInUser();
410
411                 // Copy all data to this bean
412                 this.copyUser(loggedInUser);
413
414                 // Is the user visible?
415                 if (Objects.equals(loggedInUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
416                         // Yes, then add user
417                         this.visibleUserList.add(loggedInUser);
418                 }
419         }
420
421         /**
422          * Event observer for user password changes
423          * <p>
424          * @param event Event being fired
425          */
426         public void afterUserPasswordChangedEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
427                 // Is it valid?
428                 if (null == event) {
429                         // Throw NPE
430                         throw new NullPointerException("event is null"); //NOI18N
431                 } else if (event.getUserPassword() == null) {
432                         // Throw NPE
433                         throw new NullPointerException("event.userPassword is null"); //NOI18N
434                 } else if (event.getUserPassword().isEmpty()) {
435                         // Throw NPE
436                         throw new IllegalArgumentException("event.userPassword is empty"); //NOI18N
437                 }
438
439                 // Set it here
440                 this.setUserPassword(event.getUserPassword());
441                 this.setUserPasswordRepeat(event.getUserPassword());
442         }
443
444         /**
445          * Event observer for new user registrations
446          * <p>
447          * @param event User registration event
448          */
449         public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
450                 // event should not be null
451                 if (null == event) {
452                         // Throw NPE
453                         throw new NullPointerException("event is null"); //NOI18N
454                 } else if (event.getRegisteredUser() == null) {
455                         // Throw NPE again
456                         throw new NullPointerException("event.registeredUser is null"); //NOI18N
457                 } else if (event.getRegisteredUser().getUserId() == null) {
458                         // userId is null
459                         throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
460                 } else if (event.getRegisteredUser().getUserId() < 1) {
461                         // Not avalid id
462                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
463                 }
464
465                 // Get user instance
466                 User registeredUser = event.getRegisteredUser();
467
468                 // Copy all data from registered->user
469                 this.copyUser(registeredUser);
470
471                 // Clear all data
472                 this.clear();
473
474                 // Update user list
475                 this.updateList(registeredUser);
476
477                 // Add user name
478                 this.addUserName(registeredUser);
479
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);
484                 }
485
486                 // Set user id again
487                 this.setUserId(registeredUser.getUserId());
488         }
489
490         /**
491          * Method being call after user's password has been updated (and history
492          * entry has been created).
493          * <p>
494          * @param event Event being observed
495          */
496         public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
497                 // Check parameter
498                 if (null == event) {
499                         // Throw NPE
500                         throw new NullPointerException("event is null"); //NOI18N
501                 } else if (event.getPasswordHistory() == null) {
502                         // Throw NPE again
503                         throw new NullPointerException("event.passwordHistory is null"); //NOI18N
504                 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
505                         // ... and again
506                         throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
507                 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
508                         // Invalid value
509                         throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
510                 }
511
512                 // Update user list
513                 this.updateList(event.getPasswordHistory().getUserPasswordHistoryUser());
514         }
515
516         /**
517          * Listens to fired event when user updated personal data
518          * <p>
519          * @param event Event being fired
520          */
521         public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
522                 // Check parameter
523                 if (null == event) {
524                         // Throw NPE
525                         throw new NullPointerException("event is null"); //NOI18N
526                 } else if (event.getUpdatedUser() == null) {
527                         // Throw NPE again
528                         throw new NullPointerException("event.updatedUser is null"); //NOI18N
529                 } else if (event.getUpdatedUser().getUserId() == null) {
530                         // ... and again
531                         throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
532                 } else if (event.getUpdatedUser().getUserId() < 1) {
533                         // Invalid value
534                         throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
535                 }
536
537                 // Update user list
538                 this.updateList(event.getUpdatedUser());
539         }
540
541         @Override
542         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
543         public List<User> allUsers () {
544                 // Return it
545                 return this.userList;
546         }
547
548         @Override
549         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
550         public List<User> allVisibleUsers () {
551                 // Return it
552                 return this.visibleUserList;
553         }
554
555         @Override
556         public void clearUserName () {
557                 // Clear it
558                 this.setUserName(null);
559         }
560
561         @Override
562         public void clearUserPasswords () {
563                 // Clear both
564                 this.setUserPassword(null);
565                 this.setUserPasswordRepeat(null);
566         }
567
568         @Override
569         public User createUserInstance (final boolean createContactData) {
570                 // Trace message
571                 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
572
573                 // Required personal data must be set
574                 assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
575
576                 // Create new user instance
577                 User user = new LoginUser();
578
579                 // Is user name required?
580                 if (!this.isUserNameRequired()) {
581                         // Generate pseudo-random user name
582                         String randomName = this.userBean.generateRandomUserName();
583
584                         // Set it and inivisible profile
585                         this.setUserName(randomName);
586                         this.setUserProfileMode(ProfileMode.INVISIBLE);
587
588                         // Generate random password
589                         String randomPassword = UserLoginUtils.createRandomPassword(PizzaUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
590
591                         // Set random password
592                         this.setUserPassword(randomPassword);
593                         this.setUserPasswordRepeat(randomPassword);
594                 }
595
596                 // Set user name profile mode and locale
597                 user.setUserName(this.getUserName());
598                 user.setUserProfileMode(this.getUserProfileMode());
599                 user.setUserLocale(this.localizationController.getLocale());
600
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();
605
606                         // Debug message
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);
610                 }
611
612                 // Trace message
613                 //* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
614                 // Return it
615                 return user;
616         }
617
618         @Override
619         public User createUserLogin () {
620                 // Trace message
621                 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: CALLED!", this.getClass().getSimpleName()));
622
623                 // Is all data set?
624                 if (this.getUserName() == null) {
625                         // Throw NPE
626                         throw new NullPointerException("userName is null"); //NOI18N
627                 } else if (this.getUserName().isEmpty()) {
628                         // Is empty
629                         throw new IllegalStateException("userName is empty."); //NOI18N
630                 }
631
632                 // Create new user instance
633                 User user = new LoginUser();
634
635                 // Update all data ...
636                 user.setUserName(this.getUserName());
637
638                 // Trace message
639                 //* NOISY-DEBUG */ System.out.println(MessageFormat.format("{0}.createUserLogin: user={1} - EXIT!", this.getClass().getSimpleName(), user));
640                 // Return the new instance
641                 return user;
642         }
643
644         @Override
645         public String doChangePersonalData () {
646                 // This method shall only be called if the user is logged-in
647                 if (!this.userLoginController.isUserLoggedIn()) {
648                         // Not logged-in
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
659                 }
660
661                 // Get user instance
662                 User user = this.userLoginController.getLoggedInUser();
663
664                 // Copy contact data to contact instance
665                 this.contactController.updateContactDataFromController(user.getUserContact());
666
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
674
675                 // Update all fields
676                 user.setUserProfileMode(this.getUserProfileMode());
677
678                 // Send it to the EJB
679                 User updatedUser = this.userBean.updateUserPersonalData(user);
680
681                 // Fire event
682                 this.updatedPersonalDataEvent.fire(new UpdatedUserPersonalDataEvent(updatedUser));
683
684                 // All fine
685                 return "user_contact_data_saved"; //NOI18N
686         }
687
688         /**
689          * Getter for user id
690          * <p>
691          * @return User id
692          */
693         public Long getUserId () {
694                 return this.userId;
695         }
696
697         /**
698          * Setter for user id
699          * <p>
700          * @param userId User id
701          */
702         public void setUserId (final Long userId) {
703                 this.userId = userId;
704         }
705
706         /**
707          * Getter for user name
708          * <p>
709          * @return User name
710          */
711         public String getUserName () {
712                 return this.userName;
713         }
714
715         /**
716          * Setter for user name
717          * <p>
718          * @param userName User name
719          */
720         public void setUserName (final String userName) {
721                 this.userName = userName;
722         }
723
724         @Override
725         public String getUserPassword () {
726                 return this.userPassword;
727         }
728
729         /**
730          * Setter for clear-text user password
731          * <p>
732          * @param userPassword Clear-text user password
733          */
734         public void setUserPassword (final String userPassword) {
735                 this.userPassword = userPassword;
736         }
737
738         /**
739          * Getter for clear-text user password repeated
740          * <p>
741          * @return Clear-text user password repeated
742          */
743         public String getUserPasswordRepeat () {
744                 return this.userPasswordRepeat;
745         }
746
747         /**
748          * Setter for clear-text user password repeated
749          * <p>
750          * @param userPasswordRepeat Clear-text user password repeated
751          */
752         public void setUserPasswordRepeat (final String userPasswordRepeat) {
753                 this.userPasswordRepeat = userPasswordRepeat;
754         }
755
756         /**
757          * Getter for user profile mode
758          * <p>
759          * @return User profile mode
760          */
761         public ProfileMode getUserProfileMode () {
762                 return this.userProfileMode;
763         }
764
765         /**
766          * Setter for user profile mode
767          * <p>
768          * @param userProfileMode User profile mode
769          */
770         public void setUserProfileMode (final ProfileMode userProfileMode) {
771                 this.userProfileMode = userProfileMode;
772         }
773
774         @Override
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())));
780         }
781
782         /**
783          * Post-initialization of this class
784          */
785         @PostConstruct
786         public void init () {
787                 // Try it
788                 try {
789                         // Get initial context
790                         Context context = new InitialContext();
791
792                         // Try to lookup
793                         this.userBean = (UserSessionBeanRemote) context.lookup("java:global/pizzaservice-ejb/user!org.mxchange.jusercore.model.user.UserSessionBeanRemote"); //NOI18N
794                 } catch (final NamingException e) {
795                         // Throw again
796                         throw new FaceletException(e);
797                 }
798
799                 // Initialize user list
800                 this.userList = this.userBean.allUsers();
801
802                 // Get full user name list for reducing EJB calls
803                 this.userNameList = this.userBean.getUserNameList();
804
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();
809                 } else {
810                         // Initialize user list
811                         this.visibleUserList = this.userBean.allPublicUsers();
812                 }
813         }
814
815         @Override
816         public boolean isContactFound (final Contact contact) {
817                 // The contact must be valid
818                 if (null == contact) {
819                         // Throw NPE
820                         throw new NullPointerException("contact is null"); //NOI18N
821                 } else if (contact.getContactId() == null) {
822                         // Throw again ...
823                         throw new NullPointerException("contact.contactId is null"); //NOI18N
824                 } else if (contact.getContactId() < 1) {
825                         // Not valid
826                         throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
827                 }
828
829                 // Default is not found
830                 boolean isFound = false;
831
832                 // Get iterator
833                 Iterator<User> iterator = this.allUsers().iterator();
834
835                 // Loop through all entries
836                 while (iterator.hasNext()) {
837                         // Get user
838                         User next = iterator.next();
839
840                         // Compare both objects
841                         if (Objects.equals(contact, next.getUserContact())) {
842                                 // Found it
843                                 isFound = true;
844                                 break;
845                         }
846                 }
847
848                 // Return status
849                 return isFound;
850         }
851
852         @Override
853         public boolean isPublicUserProfileEnabled () {
854                 // Get context parameter
855                 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_public_profile_enabled"); //NOI18N
856
857                 // Is it set?
858                 boolean isEnabled = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
859
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
864                 }
865
866                 // Return value
867                 return isEnabled;
868         }
869
870         @Override
871         public boolean isRequiredChangePersonalDataSet () {
872                 return ((this.getUserProfileMode() != null) &&
873                                 (this.getUserName() != null) && (!this.getUserName().isEmpty()) &&
874                                 (this.contactController.isRequiredChangePersonalDataSet()));
875         }
876
877         @Override
878         public boolean isRequiredPersonalDataSet () {
879                 if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
880                         // Multiple registration page
881                         return this.contactController.isRequiredPersonalDataSet();
882                 } else {
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));
889                 }
890         }
891
892         @Override
893         public boolean isSamePasswordEntered () {
894                 return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
895         }
896
897         @Override
898         public boolean isUserIdEmpty () {
899                 return ((this.getUserId() == null) || (this.getUserId() == 0));
900         }
901
902         @Override
903         public boolean isUserNameRegistered (final User user) {
904                 return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
905         }
906
907         @Override
908         public boolean isUserNameRequired () {
909                 // Get context parameter
910                 String contextParameter = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("is_user_login_require_user_name"); //NOI18N
911
912                 // Is it set?
913                 boolean isRequired = ((contextParameter instanceof String) && (contextParameter.toLowerCase().equals("true"))); //NOI18N
914
915                 // Return value
916                 return isRequired;
917         }
918
919         @Override
920         public boolean isVisibleUserFound () {
921                 return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
922         }
923
924         @Override
925         public User lookupUserByEmailAddress (final String emailAddress) throws UserEmailAddressNotFoundException {
926                 // Parameter must be valid
927                 if (null == emailAddress) {
928                         // Throw NPE
929                         throw new NullPointerException("emailAddress is null"); //NOI18N
930                 } else if (emailAddress.isEmpty()) {
931                         // Not valid
932                         throw new IllegalArgumentException("emailAddress is empty"); //NOI18N
933                 }
934
935                 // Init variable
936                 User user = null;
937
938                 // Try to lookup it in visible user list
939                 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
940                         // Get next user
941                         User next = iterator.next();
942
943                         // Contact should be set
944                         if (next.getUserContact() == null) {
945                                 // Contact is 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
950                         }
951
952                         // Is the email address found?
953                         if (Objects.equals(next.getUserContact().getContactEmailAddress(), emailAddress)) {
954                                 // Copy to other variable
955                                 user = next;
956                                 break;
957                         }
958                 }
959
960                 // Is it still null?
961                 if (null == user) {
962                         // Not visible for the current user
963                         throw new UserEmailAddressNotFoundException(emailAddress);
964                 }
965
966                 // Return it
967                 return user;
968         }
969
970         @Override
971         public User lookupUserById (final Long userId) throws UserNotFoundException {
972                 // Parameter must be valid
973                 if (null == userId) {
974                         // Throw NPE
975                         throw new NullPointerException("userId is null"); //NOI18N
976                 } else if (userId < 1) {
977                         // Not valid
978                         throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
979                 }
980
981                 // Init variable
982                 User user = null;
983
984                 // Try to lookup it in visible user list
985                 for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
986                         // Get next user
987                         User next = iterator.next();
988
989                         // Is the user id found?
990                         if (Objects.equals(next.getUserId(), userId)) {
991                                 // Copy to other variable
992                                 user = next;
993                                 break;
994                         }
995                 }
996
997                 // Is it still null?
998                 if (null == user) {
999                         // Not visible for the current user
1000                         throw new UserNotFoundException(userId);
1001                 }
1002
1003                 // Return it
1004                 return user;
1005         }
1006
1007         /**
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,
1010          * <p>
1011          * @param user User instance
1012          */
1013         private void addUserName (final User user) {
1014                 // Make sure the entry is not added yet
1015                 if (this.userNameList.contains(user.getUserName())) {
1016                         // Abort here
1017                         throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
1018                 }
1019
1020                 // Add user name
1021                 this.userNameList.add(user.getUserName());
1022         }
1023
1024         /**
1025          * Clears this bean
1026          */
1027         private void clear () {
1028                 // Clear all data
1029                 // - personal data
1030                 this.setUserId(null);
1031                 this.setUserProfileMode(null);
1032
1033                 // - other data
1034                 this.clearUserName();
1035                 this.clearUserPasswords();
1036         }
1037
1038         /**
1039          * Copies given user into the controller
1040          * <p>
1041          * @param user User instance
1042          */
1043         private void copyUser (final User user) {
1044                 // Make sure the instance is valid
1045                 if (null == user) {
1046                         // Throw NPE
1047                         throw new NullPointerException("user is null"); //NOI18N
1048                 } else if (user.getUserContact() == null) {
1049                         // Throw again ...
1050                         throw new NullPointerException("user.userContact is null"); //NOI18N
1051                 }
1052
1053                 // Copy all fields:
1054                 // - base data
1055                 this.setUserId(user.getUserId());
1056                 this.setUserProfileMode(user.getUserProfileMode());
1057         }
1058
1059         /**
1060          * Removes user from all lists
1061          * <p>
1062          * @param user User to remove
1063          */
1064         private void removeFromList (final User user) {
1065                 // The user should be valid
1066                 if (null == user) {
1067                         // Throw NPE
1068                         throw new NullPointerException("user is null"); //NOI18N
1069                 } else if (user.getUserId() == null) {
1070                         // ... again NPE
1071                         throw new NullPointerException("user.userId is null"); //NOI18N
1072                 } else if (user.getUserId() < 1) {
1073                         // Invalid id
1074                         throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1075                 }
1076
1077                 // Remove it from lists
1078                 this.userList.remove(user);
1079                 this.visibleUserList.remove(user);
1080
1081                 // Remove name from list
1082                 this.userNameList.remove(user.getUserName());
1083         }
1084
1085         /**
1086          * Updates list with given user instance
1087          * <p>
1088          * @param user User instance
1089          */
1090         private void updateList (final User user) {
1091                 // The user should be valid
1092                 if (null == user) {
1093                         // Throw NPE
1094                         throw new NullPointerException("user is null"); //NOI18N
1095                 } else if (user.getUserId() == null) {
1096                         // ... again NPE
1097                         throw new NullPointerException("user.userId is null"); //NOI18N
1098                 } else if (user.getUserId() < 1) {
1099                         // Invalid id
1100                         throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
1101                 } else if (user.getUserContact() == null) {
1102                         // Throw again ...
1103                         throw new NullPointerException("user.userContact is null"); //NOI18N
1104                 } else if (user.getUserContact().getContactId() == null) {
1105                         // Throw again ...
1106                         throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1107                 } else if (user.getUserContact().getContactId() < 1) {
1108                         // Throw again ...
1109                         throw new NullPointerException(MessageFormat.format("user.userContact.contactId={0} is invalid.", user.getUserContact().getContactId())); //NOI18N
1110                 }
1111
1112                 // Get iterator from list
1113                 Iterator<User> iterator = this.userList.iterator();
1114
1115                 // "Walk" through all entries
1116                 while (iterator.hasNext()) {
1117                         // Get next element
1118                         User next = iterator.next();
1119
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);
1124                                 break;
1125                         }
1126                 }
1127
1128                 // Re-add user
1129                 this.userList.add(user);
1130         }
1131
1132 }