From e9db610cdd0e5781f52afbb705215cf6e4397d9b Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Tue, 12 Apr 2016 18:58:39 +0200 Subject: [PATCH] Continued with adding user by administrator: - added addUser() method - removed creation timestamp as the EJB takes care of it - renamed errorHandler -> exception as this will become a page for thrown exceptions (later better handling) - updated jar(s) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- nbproject/faces-config.NavData | 80 +++++----- .../AddressbookAdminUserWebSessionBean.java | 151 ++++++++++++++++++ ...ressbookAdminUserWebSessionController.java | 7 + .../user/AddressbookUserWebSessionBean.java | 34 ++-- .../AddressbookUserWebSessionController.java | 5 + .../country/AddressbookCountryConverter.java | 1 + .../AddressbookSmsProviderConverter.java | 1 + web/WEB-INF/faces-config.xml | 11 +- web/exception.xhtml | 20 +++ 9 files changed, 250 insertions(+), 60 deletions(-) create mode 100644 web/exception.xhtml diff --git a/nbproject/faces-config.NavData b/nbproject/faces-config.NavData index a2fa2587..8e9c103d 100644 --- a/nbproject/faces-config.NavData +++ b/nbproject/faces-config.NavData @@ -2,46 +2,46 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionBean.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionBean.java index 229d4bf9..8a6b701d 100644 --- a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionBean.java +++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionBean.java @@ -24,16 +24,30 @@ import java.util.Objects; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; import javax.faces.view.facelets.FaceletException; +import javax.inject.Inject; import javax.inject.Named; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; +import org.mxchange.jcontacts.contact.Contact; +import org.mxchange.jcontacts.contact.UserContact; import org.mxchange.jcontacts.contact.gender.Gender; import org.mxchange.jcountry.data.Country; +import org.mxchange.jphone.phonenumbers.cellphone.CellphoneNumber; +import org.mxchange.jphone.phonenumbers.cellphone.DialableCellphoneNumber; +import org.mxchange.jphone.phonenumbers.fax.DialableFaxNumber; +import org.mxchange.jphone.phonenumbers.fax.FaxNumber; +import org.mxchange.jphone.phonenumbers.landline.DialableLandLineNumber; +import org.mxchange.jphone.phonenumbers.landline.LandLineNumber; import org.mxchange.jphone.phonenumbers.smsprovider.SmsProvider; +import org.mxchange.jusercore.exceptions.EmailAddressAlreadyRegisteredException; +import org.mxchange.jusercore.exceptions.UserNameAlreadyRegisteredException; import org.mxchange.jusercore.exceptions.UserNotFoundException; +import org.mxchange.jusercore.exceptions.UserPasswordMismatchException; +import org.mxchange.jusercore.model.user.LoginUser; import org.mxchange.jusercore.model.user.User; import org.mxchange.jusercore.model.user.UserSessionBeanRemote; +import org.mxchange.jusercore.model.user.UserUtils; import org.mxchange.jusercore.model.user.profilemodes.ProfileMode; /** @@ -181,6 +195,12 @@ public class AddressbookAdminUserWebSessionBean implements AddressbookAdminUserW */ private Integer zipCode; + /** + * Regular user controller + */ + @Inject + private AddressbookUserWebSessionController userController; + /** * Default constructor */ @@ -201,6 +221,128 @@ public class AddressbookAdminUserWebSessionBean implements AddressbookAdminUserW } } + @Override + public void addUser () { + // Create new user instance + User user = new LoginUser(); + user.setUserName(this.getUserName()); + user.setUserProfileMode(this.getUserProfileMode()); + + // Generate phone number + DialableLandLineNumber phone = new LandLineNumber(this.getPhoneCountry(), this.getPhoneAreaCode(), this.getPhoneNumber()); + DialableCellphoneNumber cellphone = new CellphoneNumber(this.getCellphoneCarrier(), this.getCellphoneNumber()); + DialableFaxNumber fax = new FaxNumber(this.getFaxCountry(), this.getFaxAreaCode(), this.getFaxNumber()); + + // Create new contact + Contact contact = new UserContact(this.getGender(), this.getFirstName(), this.getFamilyName()); + contact.setContactStreet(this.getStreet()); + contact.setContactHouseNumber(this.getHouseNumber()); + contact.setContactZipCode(this.getZipCode()); + contact.setContactCity(this.getCity()); + contact.setContactCountry(this.getCountry()); + contact.setContactEmailAddress(this.getEmailAddress()); + + // Don't set null or wrong references + if ((phone instanceof DialableLandLineNumber) && (phone.getPhoneCountry() instanceof Country) && (this.getPhoneAreaCode() != null) && (this.getPhoneNumber() != null) && (this.getPhoneAreaCode() > 0) && (this.getPhoneNumber() > 0)) { + // Now the number must be given + if (phone.getPhoneAreaCode() == null) { + // Is null + throw new NullPointerException("phone.phoneAreaCode is null"); //NOI18N + } else if (phone.getPhoneAreaCode() < 1) { + // Abort here + throw new IllegalArgumentException("phone.phoneAreaCode is zero or below."); //NOI18N + } else if (phone.getPhoneNumber() == null) { + // Is null + throw new NullPointerException("phone.phoneNumber is null"); //NOI18N + } else if (phone.getPhoneNumber() < 1) { + // Abort here + throw new IllegalArgumentException("phone.phoneNumber is zero or below."); //NOI18N + } + + // Set phone number + contact.setContactLandLineNumber(phone); + } + + // Don't set null or wrong references + if ((fax instanceof DialableFaxNumber) && (fax.getPhoneCountry() instanceof Country) && (this.getFaxAreaCode() != null) && (this.getFaxNumber() != null) && (this.getFaxAreaCode() > 0) && (this.getFaxNumber() > 0)) { + // Now the number must be given + if (fax.getPhoneAreaCode() == null) { + // Is null + throw new NullPointerException("fax.phoneAreaCode is null"); //NOI18N + } else if (fax.getPhoneAreaCode() < 1) { + // Abort here + throw new IllegalArgumentException("fax.phoneAreaCode is zero or below."); //NOI18N + } else if (fax.getPhoneNumber() == null) { + // Is null + throw new NullPointerException("fax.phoneNumber is null"); //NOI18N + } else if (fax.getPhoneNumber() < 1) { + // Abort here + throw new IllegalArgumentException("fax.phoneNumber is zero or below."); //NOI18N + } + + // Set fax number + contact.setContactFaxNumber(fax); + } + + // Is the provider set? + if ((cellphone instanceof DialableCellphoneNumber) && (this.getCellphoneCarrier() instanceof SmsProvider) && (this.getCellphoneNumber() != null) && (this.getCellphoneNumber() > 0)) { + // Is the number set? + if (cellphone.getPhoneNumber() == null) { + // Is null + throw new NullPointerException("cellphone.phoneNumber is null"); //NOI18N + } else if (cellphone.getPhoneNumber() < 1) { + // Abort here + throw new IllegalArgumentException("cellphone.phoneNumber is zero or below."); //NOI18N + } + + // Set cellphone number + contact.setContactCellphoneNumber(cellphone); + } + + contact.setContactBirthday(this.getBirthday()); + contact.setContactComment(this.getComment()); + + // Set contact in user + user.setUserContact(contact); + + // Init variable for password + String password = null; + + // Is the user name or email address used already? + // @TODO Add password length check + if (this.userController.isUserNameRegistered(user)) { + // User name is already used + throw new FaceletException(new UserNameAlreadyRegisteredException(user)); + } else if (this.userController.isEmailAddressRegistered(user)) { + // Email address is already used + throw new FaceletException(new EmailAddressAlreadyRegisteredException(user)); + } else if ((this.getUserPassword().isEmpty()) && (this.getUserPasswordRepeat().isEmpty())) { + // Empty password entered, then generate one + password = UserUtils.createRandomPassword(AddressbookUserWebSessionController.MINIMUM_PASSWORD_LENGTH); + } else if (!this.isSamePasswordEntered()) { + // Both passwords don't match + throw new FaceletException(new UserPasswordMismatchException(user)); + } else { + // Both match, so get it from this bean + password = this.getUserPassword(); + } + + // The password should not be null and at least 5 characters long + assert (password != null) : "password is null"; + assert (password.length() >= AddressbookUserWebSessionController.MINIMUM_PASSWORD_LENGTH) : "Password is not long enough."; + + // Encrypt password and set it + user.setUserEncryptedPassword(UserUtils.encryptPassword(password)); + + try { + // Now, that all is set, call EJB + this.userBean.addUser(user); + } catch (final UserNameAlreadyRegisteredException | EmailAddressAlreadyRegisteredException ex) { + // Throw again + throw new FaceletException(ex); + } + } + @Override public List allUsers () { // Return it @@ -461,6 +603,15 @@ public class AddressbookAdminUserWebSessionBean implements AddressbookAdminUserW this.userList = this.userBean.allUsers(); } + /** + * Checks if same password is entered and that they are not empty. + *

+ * @return Whether the same password was entered + */ + private boolean isSamePasswordEntered () { + return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat()))); + } + @Override public User lookupUserById (final Long userId) throws UserNotFoundException { // Init variable diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionController.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionController.java index 26b2fcc2..22c5fdbe 100644 --- a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionController.java +++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebSessionController.java @@ -59,6 +59,13 @@ public interface AddressbookAdminUserWebSessionController extends Serializable { */ boolean hasUsers (); + /** + * Adds user instance to database by preparing a complete user instance and + * sending it to the EJB. The data set in the controller is being verified, + * e.g. if the user name or email address is not used yet. + */ + void addUser (); + /** * Getter for birth day *

diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java index e6806af6..68465833 100644 --- a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java +++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java @@ -19,7 +19,6 @@ package org.mxchange.addressbook.beans.user; import java.text.MessageFormat; import java.util.Collections; import java.util.Date; -import java.util.GregorianCalendar; import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -344,12 +343,11 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC User user = new LoginUser(); user.setUserName(this.getUserName()); user.setUserProfileMode(this.getUserProfileMode()); - user.setUserCreated(new GregorianCalendar()); // Generate phone number - DialableLandLineNumber phone = new LandLineNumber(this.getPhoneCountry(), this.getPhoneAreaCode(), this.getPhoneNumber(), new GregorianCalendar()); - DialableCellphoneNumber cellphone = new CellphoneNumber(this.getCellphoneCarrier(), this.getCellphoneNumber(), new GregorianCalendar()); - DialableFaxNumber fax = new FaxNumber(this.getFaxCountry(), this.getFaxAreaCode(), this.getFaxNumber(), new GregorianCalendar()); + DialableLandLineNumber phone = new LandLineNumber(this.getPhoneCountry(), this.getPhoneAreaCode(), this.getPhoneNumber()); + DialableCellphoneNumber cellphone = new CellphoneNumber(this.getCellphoneCarrier(), this.getCellphoneNumber()); + DialableFaxNumber fax = new FaxNumber(this.getFaxCountry(), this.getFaxAreaCode(), this.getFaxNumber()); // Create new contact Contact contact = new UserContact(this.getGender(), this.getFirstName(), this.getFamilyName()); @@ -421,7 +419,6 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC contact.setContactComment(this.getComment()); // Created timestamp and ownContact - contact.setContactCreated(new GregorianCalendar()); contact.setContactOwnContact(Boolean.TRUE); // Set contact in user @@ -429,6 +426,7 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC // Trace message //this.getLogger().logTrace(MessageFormat.format("createUserInstance: user={0} - EXIT!", user)); + // Return it return user; } @@ -730,32 +728,32 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC } @Override - public boolean isRequiredPersonalDataSet () { - return ((this.getUserName() != null) && - (this.getUserProfileMode() != null) && + public boolean isRequiredChangePersonalDataSet () { + return ((this.getUserProfileMode() != null) && (this.getGender() != null) && (this.getFirstName() != null) && (this.getFamilyName() != null) && (this.getStreet() != null) && (this.getHouseNumber() != null) && (this.getZipCode() != null) && - (this.getCity() != null) && - (this.getEmailAddress() != null) && - (this.getEmailAddressRepeat() != null) && - (this.getUserPassword() != null) && - (this.getUserPasswordRepeat() != null)); + (this.getCity() != null)); } @Override - public boolean isRequiredChangePersonalDataSet () { - return ((this.getUserProfileMode() != null) && + public boolean isRequiredPersonalDataSet () { + return ((this.getUserName() != null) && + (this.getUserProfileMode() != null) && (this.getGender() != null) && (this.getFirstName() != null) && (this.getFamilyName() != null) && (this.getStreet() != null) && (this.getHouseNumber() != null) && (this.getZipCode() != null) && - (this.getCity() != null)); + (this.getCity() != null) && + (this.getEmailAddress() != null) && + (this.getEmailAddressRepeat() != null) && + (this.getUserPassword() != null) && + (this.getUserPasswordRepeat() != null)); } @Override @@ -765,7 +763,7 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC @Override public boolean isSamePasswordEntered () { - return (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())); + return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat()))); } @Override diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java index 10e49ec0..ce542ad1 100644 --- a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java +++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java @@ -35,6 +35,11 @@ import org.mxchange.jusercore.model.user.profilemodes.ProfileMode; */ public interface AddressbookUserWebSessionController extends Serializable { + /** + * Minimum password length + */ + public static final Integer MINIMUM_PASSWORD_LENGTH = 5; + /** * Tries to lookup user by given id number. If the user is not found or the * account status is not CONFIRMED proper exceptions are thrown. diff --git a/src/java/org/mxchange/addressbook/converter/country/AddressbookCountryConverter.java b/src/java/org/mxchange/addressbook/converter/country/AddressbookCountryConverter.java index 4fbd366a..6e49447c 100644 --- a/src/java/org/mxchange/addressbook/converter/country/AddressbookCountryConverter.java +++ b/src/java/org/mxchange/addressbook/converter/country/AddressbookCountryConverter.java @@ -136,4 +136,5 @@ public class AddressbookCountryConverter implements Converter { // Return category id return String.valueOf(((Country) value).getCountryId()); } + } diff --git a/src/java/org/mxchange/addressbook/converter/smsprovider/AddressbookSmsProviderConverter.java b/src/java/org/mxchange/addressbook/converter/smsprovider/AddressbookSmsProviderConverter.java index 5e557208..f827637d 100644 --- a/src/java/org/mxchange/addressbook/converter/smsprovider/AddressbookSmsProviderConverter.java +++ b/src/java/org/mxchange/addressbook/converter/smsprovider/AddressbookSmsProviderConverter.java @@ -136,4 +136,5 @@ public class AddressbookSmsProviderConverter implements Converter { // Return category id return String.valueOf(((SmsProvider) value).getProviderId()); } + } diff --git a/web/WEB-INF/faces-config.xml b/web/WEB-INF/faces-config.xml index d6344a02..1e118a9a 100644 --- a/web/WEB-INF/faces-config.xml +++ b/web/WEB-INF/faces-config.xml @@ -96,8 +96,8 @@ /basket.xhtml - item_not_changed - /errorHandler.xhtml + exception + /exception.xhtml admin_delete_user @@ -224,4 +224,11 @@ /admin/admin_country_edit.xhtml + diff --git a/web/exception.xhtml b/web/exception.xhtml new file mode 100644 index 00000000..cbb6ce54 --- /dev/null +++ b/web/exception.xhtml @@ -0,0 +1,20 @@ + + + + + + #{msg.PAGE_TITLE_EXCEPTION_THROWN} + + + #{msg.CONTENT_TITLE_EXCEPTION_THROWN} + + + + Unfortunately an unexpected error has occurred. + + + -- 2.39.5