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