2 * Copyright (C) 2016, 2017 Roland Häder
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation, either version 3 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
14 * You should have received a copy of the GNU Affero General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package org.mxchange.addressbook.beans.user.email_address;
19 import java.text.MessageFormat;
20 import java.util.List;
21 import java.util.Objects;
22 import javax.annotation.PostConstruct;
24 import javax.enterprise.context.SessionScoped;
25 import javax.faces.view.facelets.FaceletException;
26 import javax.inject.Inject;
27 import javax.inject.Named;
28 import org.mxchange.addressbook.beans.BaseAddressbookController;
29 import org.mxchange.addressbook.beans.features.AddressbookFeaturesWebApplicationController;
30 import org.mxchange.addressbook.beans.user.login.AddressbookUserLoginWebSessionController;
31 import org.mxchange.jcontacts.contact.Contact;
32 import org.mxchange.jcoreee.utils.FacesUtils;
33 import org.mxchange.jusercore.model.email_address.ChangeableEmailAddress;
34 import org.mxchange.jusercore.model.email_address.EmailAddressChange;
35 import org.mxchange.jusercore.model.user.User;
36 import org.mxchange.jusercore.model.user.email_address.UserEmailChangeSessionBeanRemote;
37 import org.mxchange.juserlogincore.exceptions.UserPasswordMismatchException;
40 * A web session-scoped bean for changing email addresses
42 * @author Roland Häder<roland@mxchange.org>
44 @Named ("userEmailChangeController")
46 public class AddressbookEmailChangeWebSessionBean extends BaseAddressbookController implements AddressbookEmailChangeWebSessionController {
51 private static final long serialVersionUID = 186_078_724_659_153L;
54 * Email address 1 (changing)
56 private String emailAddress;
59 * Email address 2 (repeat in changing)
61 private String emailAddressRepeat;
64 * Local list of already queued email addresses
66 private List<String> emailAddresses;
69 * Remote email change bean
71 @EJB (lookup = "java:global/addressbook-ejb/userEmailChange!org.mxchange.jusercore.model.user.email_address.UserEmailChangeSessionBeanRemote")
72 private UserEmailChangeSessionBeanRemote emailChangeBean;
78 private AddressbookFeaturesWebApplicationController featureController;
81 * Login controller (bean)
84 private AddressbookUserLoginWebSessionController userLoginController;
89 public AddressbookEmailChangeWebSessionBean () {
90 // Call super constructor
95 * Changes logged-in user's email address if the current password matches.
97 * @return Redirect outcome
99 public String doUserChangeEmailAddress () {
100 // This method shall only be called if the user is logged-in
101 if (!this.userLoginController.isUserLoggedIn()) {
103 throw new IllegalStateException("User is not logged-in"); //NOI18N
104 } else if (!this.featureController.isFeatureEnabled("user_change_email_address")) { //NOI18N
105 // Editing is not allowed
106 throw new IllegalStateException("User tried to change email address"); //NOI18N
107 } else if (!this.isRequiredChangeEmailAddressSet()) {
108 // Not all required fields are set
109 throw new FaceletException("Not all required fields are set."); //NOI18N
110 } else if (!Objects.equals(this.getEmailAddress(), this.getEmailAddressRepeat())) {
111 // Email address 1+2 mismatch
112 this.showFacesMessage("form_user_change_email_address:emailAddressRepeat", "ERROR_USER_EMAIL_ADDRESSES_MISMATCH"); //NOI18N
114 } else if (!this.userLoginController.ifCurrentPasswordMatches()) {
115 // Password not matching
116 this.showFacesMessage("form_login_user_change_email_address:currentPassword", new UserPasswordMismatchException(this.userLoginController.getLoggedInUser())); //NOI18N
121 User user = this.userLoginController.getLoggedInUser();
123 // It should be there, so run some tests on it
124 assert (user instanceof User) : "Instance userLoginController.loggedInUser is null"; //NOI18N
125 assert (user.getUserId() instanceof Long) : "Instance userLoginController.loggedInUser.userId is null"; //NOI18N
126 assert (user.getUserId() > 0) : MessageFormat.format("userLoginController.loggedInUser.userId={0} is invalid", user.getUserId()); //NOI18N
127 assert (user.getUserContact() instanceof Contact) : "Instance userLoginController.loggedInUser.userContact is null"; //NOI18N
128 assert (user.getUserContact().getContactId() instanceof Long) : "Instance userLoginController.userContact.contactId is null"; //NOI18N
129 assert (user.getUserContact().getContactId() > 0) : MessageFormat.format("Instance userLoginController.userContact.contactId={0} is invalid", user.getUserContact().getContactId()); //NOI18N
131 // Check if the email address is already enqueued
132 if (this.isEmailAddressQueued(this.getEmailAddress())) {
133 // Clear both email addresses
134 this.setEmailAddress(null);
135 this.setEmailAddressRepeat(null);
137 // Yes, then abort here
138 this.showFacesMessage("form_user_change_email_address:emailAddress", "ERROR_USER_CHANGE_EMAIL_ADDRESS_ALREADY_QUEUED"); //NOI18N
142 // Create change object, to save EJB calls, the hash is not generated here
143 ChangeableEmailAddress emailChange = new EmailAddressChange(user, this.getEmailAddress());
146 String baseUrl = FacesUtils.generateBaseUrl();
149 this.emailChangeBean.enqueueEmailAddressForChange(emailChange, baseUrl);
151 // Unset all so the user is forced to re-enter it
155 return "user_login_email_change_queued"; //NOI18N
159 * Getter for email address 1 (changing)
161 * @return Email address
163 public String getEmailAddress () {
164 return this.emailAddress;
168 * Setter for email address 1 (changing)
170 * @param emailAddress Email address 1
172 public void setEmailAddress (final String emailAddress) {
173 this.emailAddress = emailAddress;
177 * Getter for email address 2 (repeat changing)
179 * @return Email address 2
181 public String getEmailAddressRepeat () {
182 return this.emailAddressRepeat;
186 * Setter for email address 2 (repeat changing)
188 * @param emailAddressRepeat Email address 2
190 public void setEmailAddressRepeat (final String emailAddressRepeat) {
191 this.emailAddressRepeat = emailAddressRepeat;
198 public void init () {
200 this.emailAddresses = this.emailChangeBean.allQueuedAddresses();
204 public boolean isRequiredChangeEmailAddressSet () {
205 return ((this.getEmailAddress() != null) &&
206 (this.getEmailAddressRepeat() != null));
210 * Clears email address fields so the user has to re-enter them
212 private void clear () {
214 this.setEmailAddress(null);
215 this.setEmailAddressRepeat(null);
219 * Checks if given email address has already been queued. First a local list
220 * is being checked, if not found, the EJB is called. Only if found, the
221 * result is "cached" in the list.
223 * @param emailAddress Email address to verify
225 * @return Whether the email address in field emailAddress is already queued
227 private boolean isEmailAddressQueued (final String emailAddress) {
228 // It should be there
229 assert (emailAddress != null) : "emailAddress should not be null"; //NOI18N
230 assert (!emailAddress.trim().isEmpty()) : "emailAddress should not be empty"; //NOI18N
233 if (this.emailAddresses.contains(emailAddress)) {
239 boolean isQueued = this.emailChangeBean.isEmailAddressEnqueued(emailAddress);
244 this.emailAddresses.add(emailAddress);