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