2 * Copyright (C) 2016 - 2020 Free Software Foundation
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation, either version 3 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
14 * You should have received a copy of the GNU Affero General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package org.mxchange.pizzaapplication.beans.user.activity;
19 import fish.payara.cdi.jsr107.impl.NamedCache;
20 import java.text.MessageFormat;
21 import java.util.Collections;
22 import java.util.GregorianCalendar;
23 import java.util.LinkedList;
24 import java.util.List;
25 import javax.annotation.PostConstruct;
26 import javax.cache.Cache;
28 import javax.enterprise.context.RequestScoped;
29 import javax.enterprise.event.Observes;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
33 import org.mxchange.jusercore.events.user.created.ObservableCreatedUserEvent;
34 import org.mxchange.jusercore.events.user.delete.ObservableAdminDeletedUserEvent;
35 import org.mxchange.jusercore.events.user.linked.ObservableAdminLinkedUserEvent;
36 import org.mxchange.jusercore.events.user.locked.ObservableAdminLockedUserEvent;
37 import org.mxchange.jusercore.events.user.unlocked.ObservableAdminUnlockedUserEvent;
38 import org.mxchange.jusercore.events.user.update.ObservableAdminUpdatedUserDataEvent;
39 import org.mxchange.jusercore.events.user.update.ObservableUpdatedUserPersonalDataEvent;
40 import org.mxchange.jusercore.model.user.User;
41 import org.mxchange.jusercore.model.user.activity.LogableUserActivity;
42 import org.mxchange.jusercore.model.user.activity.UserActivityLog;
43 import org.mxchange.jusercore.model.user.activity.UserActivityLogSessionBeanRemote;
44 import org.mxchange.jusercore.model.user.activity.comparator.UserActivityLogTimestampComparator;
45 import org.mxchange.juserlogincore.events.confirmation.ObservableUserConfirmedAccountEvent;
46 import org.mxchange.juserlogincore.events.login.ObservableUserLoggedInEvent;
47 import org.mxchange.juserlogincore.events.logout.ObservableUserLogoutEvent;
48 import org.mxchange.juserlogincore.events.registration.ObservableUserRegisteredEvent;
49 import org.mxchange.juserlogincore.events.resendlink.ObservableUserResendLinkAccountEvent;
50 import org.mxchange.juserlogincore.events.user.password_change.ObservableUpdatedUserPasswordEvent;
51 import org.mxchange.pizzaapplication.beans.BasePizzaBean;
54 * A controller (bean) for user activity log
56 * @author Roland Häder<roland@mxchange.org>
58 @Named ("userActivityController")
60 public class PizzaUserActivityWebRequestBean extends BasePizzaBean implements PizzaUserActivityWebRequestController {
65 private static final long serialVersionUID = 192_586_376_717_856_904L;
73 * EJB for user activity log
75 @EJB (lookup = "java:global/pizzaservice-ejb/userActivity!org.mxchange.jusercore.model.user.activity.UserActivityLogSessionBeanRemote")
76 private UserActivityLogSessionBeanRemote userActivityBean;
79 * "Cache" for activity log per user
82 @NamedCache (cacheName = "userActivityCache")
83 private Cache<User, List<LogableUserActivity>> userActivityCache;
88 @SuppressWarnings ("CollectionWithoutInitialCapacity")
89 public PizzaUserActivityWebRequestBean () {
90 // Call super constructor
95 * Event observer for newly added users by administrator
97 * @param event Event being fired
99 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
100 // event should not be null
103 throw new NullPointerException("event is null"); //NOI18N
104 } else if (event.getAddedUser() == null) {
106 throw new NullPointerException("event.addedUser is null"); //NOI18N
107 } else if (event.getAddedUser().getUserId() == null) {
109 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
110 } else if (event.getAddedUser().getUserId() < 1) {
112 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
116 this.addUserActivity(event.getAddedUser(), "ADMIN_ADDED_USER_ACCOUNT"); //NOI18N
120 * Event observer for deleted user accounts (by administrator)
122 * @param event Event being fired
124 public void afterAdminDeletedUserEvent (@Observes final ObservableAdminDeletedUserEvent event) {
125 // event should not be null
128 throw new NullPointerException("event is null"); //NOI18N
129 } else if (event.getDeletedUser() == null) {
131 throw new NullPointerException("event.deletedUser is null"); //NOI18N
132 } else if (event.getDeletedUser().getUserId() == null) {
134 throw new NullPointerException("event.deletedUser.userId is null"); //NOI18N
135 } else if (event.getDeletedUser().getUserId() < 1) {
137 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getDeletedUser(), event.getDeletedUser().getUserId())); //NOI18N
141 this.addUserActivity(event.getDeletedUser(), "ADMIN_DELETED_USER_ACCOUNT", event.getUserDeleteReason()); //NOI18N
145 * Event observer for linked users with existing contact data
147 * @param event Event being fired
149 public void afterAdminLinkedUserEvent (@Observes final ObservableAdminLinkedUserEvent event) {
150 // event should not be null
153 throw new NullPointerException("event is null"); //NOI18N
154 } else if (event.getLinkedUser() == null) {
156 throw new NullPointerException("event.linkedUser is null"); //NOI18N
157 } else if (event.getLinkedUser().getUserId() == null) {
159 throw new NullPointerException("event.linkedUser.userId is null"); //NOI18N
160 } else if (event.getLinkedUser().getUserId() < 1) {
162 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLinkedUser(), event.getLinkedUser().getUserId())); //NOI18N
166 this.addUserActivity(event.getLinkedUser(), "ADMIN_LINKED_USER_ACCOUNT"); //NOI18N
170 * Event observer for locked users
172 * @param event Event being fired
174 public void afterAdminLockedUserEvent (@Observes final ObservableAdminLockedUserEvent event) {
175 // event should not be null
178 throw new NullPointerException("event is null"); //NOI18N
179 } else if (event.getLockedUser() == null) {
181 throw new NullPointerException("event.lockedUser is null"); //NOI18N
182 } else if (event.getLockedUser().getUserId() == null) {
184 throw new NullPointerException("event.lockedUser.userId is null"); //NOI18N
185 } else if (event.getLockedUser().getUserId() < 1) {
187 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLockedUser(), event.getLockedUser().getUserId())); //NOI18N
191 this.addUserActivity(event.getLockedUser(), "ADMIN_LOCKED_USER_ACCOUNT", event.getLockedUser().getUserLastLockedReason()); //NOI18N
195 * Event observer for unlocked users
197 * @param event Event being fired
199 public void afterAdminUnlockedUserEvent (@Observes final ObservableAdminUnlockedUserEvent event) {
200 // event should not be null
203 throw new NullPointerException("event is null"); //NOI18N
204 } else if (event.getUnlockedUser() == null) {
206 throw new NullPointerException("event.unlockedUser is null"); //NOI18N
207 } else if (event.getUnlockedUser().getUserId() == null) {
209 throw new NullPointerException("event.unlockedUser.userId is null"); //NOI18N
210 } else if (event.getUnlockedUser().getUserId() < 1) {
212 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUnlockedUser(), event.getUnlockedUser().getUserId())); //NOI18N
216 this.addUserActivity(event.getUnlockedUser(), "ADMIN_UNLOCKED_USER_ACCOUNT"); //NOI18N
220 * Event observer for updated user data by administrator
222 * @param event Event being updated
224 public void afterAdminUpdatedUserDataEvent (@Observes final ObservableAdminUpdatedUserDataEvent event) {
225 // event should not be null
228 throw new NullPointerException("event is null"); //NOI18N
229 } else if (event.getUpdatedUser() == null) {
231 throw new NullPointerException("event.updatedUser is null"); //NOI18N
232 } else if (event.getUpdatedUser().getUserId() == null) {
234 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
235 } else if (event.getUpdatedUser().getUserId() < 1) {
237 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
241 this.addUserActivity(event.getUpdatedUser(), "ADMIN_UPDATED_USER_PERSONAL_DATA"); //NOI18N
245 * Event observer for when a bean helper has successfully created a user
246 * instance, means the user exists. If the user does not exist, this event
247 * should not fire but instead a proper exception must be thrown.
249 * @param event User created event
251 public void afterCreatedUserEvent (@Observes final ObservableCreatedUserEvent event) {
252 // Is the instance valid?
255 throw new NullPointerException("event is null"); //NOI18N
256 } else if (event.getCreatedUser() == null) {
258 throw new NullPointerException("event.createdUser is null"); //NOI18N
259 } else if (event.getCreatedUser().getUserId() == null) {
261 throw new NullPointerException("event.createdUser.userId is null"); //NOI18N
262 } else if (event.getCreatedUser().getUserId() < 1) {
264 throw new NullPointerException(MessageFormat.format("event.createdUser.userId={0} is not valid", event.getCreatedUser().getUserId())); //NOI18N
268 this.setUser(event.getCreatedUser());
272 * Event observer when user confirmed account.
274 * @param event Event being fired
276 public void afterUserConfirmedAccountEvent (@Observes final ObservableUserConfirmedAccountEvent event) {
277 // event should not be null
280 throw new NullPointerException("event is null"); //NOI18N
281 } else if (event.getConfirmedUser() == null) {
283 throw new NullPointerException("event.confirmedUser is null"); //NOI18N
284 } else if (event.getConfirmedUser().getUserId() == null) {
286 throw new NullPointerException("event.confirmedUser.userId is null"); //NOI18N
287 } else if (event.getConfirmedUser().getUserId() < 1) {
289 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getConfirmedUser(), event.getConfirmedUser().getUserId())); //NOI18N
293 this.addUserActivity(event.getConfirmedUser(), "USER_CONFIRMED_ACCOUNT"); //NOI18N
297 * Event observer for logged-in user
299 * @param event Event being fired
301 public void afterUserLoginEvent (@Observes final ObservableUserLoggedInEvent event) {
302 // event should not be null
305 throw new NullPointerException("event is null"); //NOI18N
306 } else if (event.getLoggedInUser() == null) {
308 throw new NullPointerException("event.registeredUser is null"); //NOI18N
309 } else if (event.getLoggedInUser().getUserId() == null) {
311 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
312 } else if (event.getLoggedInUser().getUserId() < 1) {
314 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
317 // Copy all data to this bean
318 this.addUserActivity(event.getLoggedInUser(), "USER_LOGGED_IN"); //NOI18N
322 * Event observer for logged-out user
324 * @param event Event instance
326 public void afterUserLogoutEvent (@Observes final ObservableUserLogoutEvent event) {
327 // event should not be null
330 throw new NullPointerException("event is null"); //NOI18N
331 } else if (event.getLoggedOutUser() == null) {
333 throw new NullPointerException("event.loggedOutUser is null"); //NOI18N
334 } else if (event.getLoggedOutUser().getUserId() == null) {
336 throw new NullPointerException("event.loggedOutUser.userId is null"); //NOI18N
337 } else if (event.getLoggedOutUser().getUserId() < 1) {
339 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedOutUser(), event.getLoggedOutUser().getUserId())); //NOI18N
343 this.addUserActivity(event.getLoggedOutUser(), "USER_LOGGED_OUT"); //NOI18N
347 * Event observer for new user registrations
349 * @param event Event being fired
351 public void afterUserRegistrationEvent (@Observes final ObservableUserRegisteredEvent event) {
352 // event should not be null
355 throw new NullPointerException("event is null"); //NOI18N
356 } else if (event.getRegisteredUser() == null) {
358 throw new NullPointerException("event.registeredUser is null"); //NOI18N
359 } else if (event.getRegisteredUser().getUserId() == null) {
361 throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
362 } else if (event.getRegisteredUser().getUserId() < 1) {
364 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
368 this.addUserActivity(event.getRegisteredUser(), "USER_REGISTERED_NEW_ACCOUNT"); //NOI18N
372 * Event observer for users resending their confirmation link
374 * @param event Event being fired
376 public void afterUserResendConfirmationLinkEvent (@Observes final ObservableUserResendLinkAccountEvent event) {
377 // event should not be null
380 throw new NullPointerException("event is null"); //NOI18N
381 } else if (event.getResendLinkUser() == null) {
383 throw new NullPointerException("event.resendLinkUser is null"); //NOI18N
384 } else if (event.getResendLinkUser().getUserId() == null) {
386 throw new NullPointerException("event.resendLinkUser.userId is null"); //NOI18N
387 } else if (event.getResendLinkUser().getUserId() < 1) {
389 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getResendLinkUser(), event.getResendLinkUser().getUserId())); //NOI18N
392 // Copy all data to this bean
393 this.addUserActivity(event.getResendLinkUser(), "USER_RESEND_CONFIRMATION_LINK"); //NOI18N
397 * Method being call after user's password has been updated (and history
398 * entry has been created).
400 * @param event Event being observed
402 public void afterUserUpdatedPasswordEvent (@Observes final ObservableUpdatedUserPasswordEvent event) {
406 throw new NullPointerException("event is null"); //NOI18N
407 } else if (event.getPasswordHistory() == null) {
409 throw new NullPointerException("event.passwordHistory is null"); //NOI18N
410 } else if (event.getPasswordHistory().getUserPasswordHistoryId() == null) {
412 throw new NullPointerException("event.passwordHistory.userPasswordHistoryId is null"); //NOI18N
413 } else if (event.getPasswordHistory().getUserPasswordHistoryId() < 1) {
415 throw new IllegalArgumentException(MessageFormat.format("event.passwordHistory.userPasswordHistoryId={0} is in valid", event.getPasswordHistory().getUserPasswordHistoryId())); //NOI18N
419 this.addUserActivity(event.getPasswordHistory().getUserPasswordHistoryUser(), "USER_UPDATED_PASSWORD"); //NOI18N
423 * Listens to fired event when user updated personal data
425 * @param event Event being fired
427 public void afterUserUpdatedPersonalDataEvent (@Observes final ObservableUpdatedUserPersonalDataEvent event) {
431 throw new NullPointerException("event is null"); //NOI18N
432 } else if (event.getUpdatedUser() == null) {
434 throw new NullPointerException("event.updatedUser is null"); //NOI18N
435 } else if (event.getUpdatedUser().getUserId() == null) {
437 throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
438 } else if (event.getUpdatedUser().getUserId() < 1) {
440 throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
444 this.addUserActivity(event.getUpdatedUser(), "USER_UPDATED_PERSONAL_DATA"); //NOI18N
448 * Expands given activity type into a i18n string for administrators
450 * @param activityType Activity type
452 * @return Expanded i18n string
454 public String expandAdminActivityType (final String activityType) {
456 if (null == activityType) {
458 throw new NullPointerException("activityType is null"); //NOI18N
459 } else if (activityType.isEmpty()) {
461 throw new IllegalArgumentException("activityType is empty"); //NOI18N
465 return "ADMIN_ACTIVITY_" + activityType; //NOI18N
469 * Expands given activity type into a i18n string for users
471 * @param activityType Activity type
473 * @return Expanded i18n string
475 public String expandUserActivityType (final String activityType) {
477 if (null == activityType) {
479 throw new NullPointerException("activityType is null"); //NOI18N
480 } else if (activityType.isEmpty()) {
482 throw new IllegalArgumentException("activityType is empty"); //NOI18N
486 return "USER_ACTIVITY_" + activityType; //NOI18N
490 * Returns a list of in beanHelper set user instance's activity log
492 * @return List of user's activity log
494 public List<LogableUserActivity> fetchCurrentUsersActivityLog () {
495 // beanHelper.user should be set and valid
496 if (this.getUser() == null) {
498 throw new NullPointerException("this.beanHelper.user is null"); //NOI18N
499 } else if (this.getUser().getUserId() == null) {
501 throw new NullPointerException("this.beanHelper.user.userId is null"); //NOI18N
502 } else if (this.getUser().getUserId() < 1) {
504 throw new IllegalArgumentException(MessageFormat.format("this.beanHelper.user.userId={0} is not valid", this.getUser().getUserId())); //NOI18N
508 final List<LogableUserActivity> list = new LinkedList<>();
511 if (this.userActivityCache.containsKey(this.getUser())) {
513 list.addAll(this.userActivityCache.get(this.getUser()));
515 // Sort list and reverse it
516 Collections.sort(list, new UserActivityLogTimestampComparator());
517 Collections.reverse(list);
525 * Getter for user instance
527 * @return User instance
529 public User getUser () {
534 * Setter for user instance
536 * @param user User instance
538 public void setUser (final User user) {
543 * Post-constructor method
546 public void init () {
548 final List<LogableUserActivity> list = this.userActivityBean.fetchAllUserActivityLog();
550 // Put all in map, per-user
551 for (final LogableUserActivity userActivity : list) {
552 // Is the list there?
553 if (!this.userActivityCache.containsKey(userActivity.getActivityUser())) {
555 this.userActivityCache.put(userActivity.getActivityUser(), new LinkedList<LogableUserActivity>());
558 // Add by user instance
559 boolean added = this.userActivityCache.get(userActivity.getActivityUser()).add(userActivity);
562 assert (added) : "Activity log not added"; //NOI18N
567 * Adds user activity entry with given type
569 * @param user User instance
570 * @param activityType Activity type
572 private void addUserActivity (final User user, final String activityType) {
573 // Better re-validate
576 throw new NullPointerException("user is null"); //NOI18N
577 } else if (user.getUserId() == null) {
579 throw new NullPointerException("user.userId is null"); //NOI18N
580 } else if (user.getUserId() < 1) {
582 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is not valid", user.getUserId())); //NOI18N
583 } else if (null == activityType) {
585 throw new NullPointerException("activityType is null"); //NOI18N
586 } else if (activityType.isEmpty()) {
588 throw new IllegalArgumentException("activityType is empty"); //NOI18N
591 // Create new activity object
592 final LogableUserActivity userActivity = new UserActivityLog(activityType, user, new GregorianCalendar(), this.determinePrincipalName());
594 // Call bean to add it
595 this.userActivityBean.addUserActivityLog(userActivity);
598 this.addUserActivityToCache(userActivity);
602 * Adds user activity log with type and message
604 * @param user User instance
605 * @param activityType Activity type
606 * @param message Activity message
608 private void addUserActivity (final User user, final String activityType, final String message) {
609 // Better re-validate
612 throw new NullPointerException("user is null"); //NOI18N
613 } else if (user.getUserId() == null) {
615 throw new NullPointerException("user.userId is null"); //NOI18N
616 } else if (user.getUserId() < 1) {
618 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is not valid", user.getUserId())); //NOI18N
619 } else if (null == activityType) {
621 throw new NullPointerException("activityType is null"); //NOI18N
622 } else if (activityType.isEmpty()) {
624 throw new IllegalArgumentException("activityType is empty"); //NOI18N
625 } else if (null == message) {
627 throw new NullPointerException("message is null"); //NOI18N
628 } else if (message.isEmpty()) {
630 throw new IllegalArgumentException("message is empty"); //NOI18N
633 // Create new activity object
634 final LogableUserActivity userActivity = new UserActivityLog(message, activityType, user, new GregorianCalendar(), this.determinePrincipalName());
636 // Call bean to add it
637 this.userActivityBean.addUserActivityLog(userActivity);
640 this.addUserActivityToCache(userActivity);
644 * Adds given user activity instance to "cache" (local map)
646 * @param userActivity User activity instance
648 private void addUserActivityToCache (final LogableUserActivity userActivity) {
649 // Is the instance valid
650 if (null == userActivity) {
652 throw new NullPointerException("userActivity is null");
653 } else if (userActivity.getActivityId() instanceof Long) {
655 throw new IllegalArgumentException("userActivity.activityId=" + userActivity.getActivityId() + " is not null");
656 } else if (userActivity.getActivityUser() == null) {
658 throw new NullPointerException("userActivity.activityUser is null");
659 } else if (userActivity.getActivityUser().getUserId() == null) {
661 throw new NullPointerException("userActivity.activityUser.userId is null");
662 } else if (userActivity.getActivityUser().getUserId() < 1) {
664 throw new IllegalArgumentException("userActivity.activityUser.userId=" + userActivity.getActivityUser().getUserId() + " is not valid");
668 if (!this.userActivityCache.containsKey(userActivity.getActivityUser())) {
670 this.userActivityCache.put(userActivity.getActivityUser(), new LinkedList<LogableUserActivity>());
673 // Add activity to log
674 this.userActivityCache.get(userActivity.getActivityUser()).add(userActivity);