]> git.mxchange.org Git - jjobs-war.git/commitdiff
Continued with adding user by administrator:
authorRoland Haeder <roland@mxchange.org>
Tue, 12 Apr 2016 16:58:39 +0000 (18:58 +0200)
committerRoland Haeder <roland@mxchange.org>
Tue, 12 Apr 2016 17:27:16 +0000 (19:27 +0200)
- 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)

Signed-off-by: Roland Häder <roland@mxchange.org>
nbproject/faces-config.NavData
src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebSessionBean.java
src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebSessionController.java
src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java
src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java
src/java/org/mxchange/jjobs/converter/country/JobsCountryConverter.java
src/java/org/mxchange/jjobs/converter/smsprovider/JobsSmsProviderConverter.java
web/WEB-INF/faces-config.xml
web/exception.xhtml [new file with mode: 0644]

index 7a5b9fb64c1c846c1f2dd433f2f52ea2c404d7be..fde2036ae3aa06fec146413258697db3461b2bac 100644 (file)
@@ -2,41 +2,42 @@
 <Scene Scope="Project" version="2">
     <Scope Scope="Faces Configuration Only"/>
     <Scope Scope="Project">
-        <Node id="admin/admin_country_list.xhtml" x="650" y="450" zoom="true"/>
-        <Node id="admin/admin_user_delete.xhtml" x="400" y="150" zoom="true"/>
-        <Node id="login/login_change_password.xhtml" x="650" y="150" zoom="true"/>
-        <Node id="privacy.xhtml" x="900" y="750" zoom="true"/>
-        <Node id="admin/index.xhtml" x="900" y="600" zoom="true"/>
-        <Node id="login/login_data_saved.xhtml" x="1150" y="600" zoom="true"/>
-        <Node id="admin/admin_country_delete.xhtml" x="1650" y="300" zoom="true"/>
-        <Node id="user/register.xhtml" x="150" y="450" zoom="true"/>
-        <Node id="login/login_all_applications.xhtml" x="650" y="300" zoom="true"/>
-        <Node id="admin/admin_country_edit.xhtml" x="1400" y="300" zoom="true"/>
-        <Node id="user/resend_link.xhtml" x="900" y="300" zoom="true"/>
-        <Node id="login/login_add_addressbook.xhtml" x="1400" y="150" zoom="true"/>
-        <Node id="login/login_index.xhtml" x="900" y="450" zoom="true"/>
-        <Node id="login/login_own_addressbooks.xhtml" x="400" y="750" zoom="true"/>
-        <Node id="admin/admin_user_list.xhtml" x="650" y="900" zoom="true"/>
-        <Node id="admin/admin_logout.xhtml" x="150" y="1050" zoom="true"/>
-        <Node id="terms.xhtml" x="400" y="1050" zoom="true"/>
-        <Node id="admin/admin_user_add.xhtml" x="400" y="600" zoom="true"/>
-        <Node id="admin/admin_user_edit.xhtml" x="1150" y="300" zoom="true"/>
-        <Node id="user/user_list.xhtml" x="150" y="900" zoom="true"/>
-        <Node id="index.xhtml" x="650" y="750" zoom="true"/>
-        <Node id="logout.xhtml" x="900" y="150" zoom="true"/>
-        <Node id="user/register_done.xhtml" x="400" y="900" zoom="true"/>
-        <Node id="login/login_change_personal_data.xhtml" x="650" y="600" zoom="true"/>
-        <Node id="user/user_profile.xhtml" x="1900" y="150" zoom="true"/>
-        <Node id="admin/admin_user_unlock.xhtml" x="150" y="600" zoom="true"/>
-        <Node id="user/show_addressbook.xhtml" x="150" y="300" zoom="true"/>
-        <Node id="*" x="1150" y="150" zoom="true"/>
-        <Node id="imprint.xhtml" x="1650" y="150" zoom="true"/>
-        <Node id="user/login_error.xhtml" x="1150" y="450" zoom="true"/>
-        <Node id="user/show_addressbook_entries.xhtml" x="150" y="750" zoom="true"/>
-        <Node id="login/login_change_email_address.xhtml" x="150" y="150" zoom="true"/>
-        <Node id="user/lost_passwd.xhtml" x="400" y="450" zoom="true"/>
-        <Node id="user/login.xhtml" x="1400" y="450" zoom="true"/>
-        <Node id="login/login_edit_user_data.xhtml" x="400" y="300" zoom="true"/>
+        <Node id="admin/admin_country_list.xhtml" x="1400" y="300" zoom="true"/>
+        <Node id="admin/admin_user_delete.xhtml" x="400" y="450" zoom="true"/>
+        <Node id="login/login_change_password.xhtml" x="1650" y="150" zoom="true"/>
+        <Node id="privacy.xhtml" x="1150" y="450" zoom="true"/>
+        <Node id="admin/index.xhtml" x="150" y="300" zoom="true"/>
+        <Node id="login/login_data_saved.xhtml" x="650" y="150" zoom="true"/>
+        <Node id="exception.xhtml" x="1400" y="450" zoom="true"/>
+        <Node id="admin/admin_country_delete.xhtml" x="1150" y="600" zoom="true"/>
+        <Node id="user/register.xhtml" x="900" y="450" zoom="true"/>
+        <Node id="login/login_all_applications.xhtml" x="150" y="150" zoom="true"/>
+        <Node id="admin/admin_country_edit.xhtml" x="1150" y="150" zoom="true"/>
+        <Node id="user/resend_link.xhtml" x="150" y="450" zoom="true"/>
+        <Node id="login/login_index.xhtml" x="150" y="600" zoom="true"/>
+        <Node id="login/login_add_addressbook.xhtml" x="150" y="1050" zoom="true"/>
+        <Node id="login/login_own_addressbooks.xhtml" x="1650" y="300" zoom="true"/>
+        <Node id="admin/admin_user_list.xhtml" x="400" y="900" zoom="true"/>
+        <Node id="admin/admin_logout.xhtml" x="1150" y="300" zoom="true"/>
+        <Node id="terms.xhtml" x="650" y="750" zoom="true"/>
+        <Node id="admin/admin_user_edit.xhtml" x="1400" y="150" zoom="true"/>
+        <Node id="admin/admin_user_add.xhtml" x="650" y="900" zoom="true"/>
+        <Node id="user/user_list.xhtml" x="900" y="600" zoom="true"/>
+        <Node id="index.xhtml" x="1900" y="150" zoom="true"/>
+        <Node id="logout.xhtml" x="400" y="300" zoom="true"/>
+        <Node id="user/register_done.xhtml" x="400" y="600" zoom="true"/>
+        <Node id="login/login_change_personal_data.xhtml" x="650" y="300" zoom="true"/>
+        <Node id="user/user_profile.xhtml" x="150" y="1200" zoom="true"/>
+        <Node id="admin/admin_user_unlock.xhtml" x="650" y="600" zoom="true"/>
+        <Node id="imprint.xhtml" x="150" y="750" zoom="true"/>
+        <Node id="user/show_addressbook.xhtml" x="400" y="750" zoom="true"/>
+        <Node id="*" x="900" y="750" zoom="true"/>
+        <Node id="user/login_error.xhtml" x="400" y="1050" zoom="true"/>
+        <Node id="user/show_addressbook_entries.xhtml" x="150" y="900" zoom="true"/>
+        <Node id="login/login_change_email_address.xhtml" x="900" y="150" zoom="true"/>
+        <Node id="user/lost_passwd.xhtml" x="650" y="450" zoom="true"/>
+        <Node id="user/login.xhtml" x="400" y="150" zoom="true"/>
+        <Node id="login/login_edit_user_data.xhtml" x="900" y="300" zoom="true"/>
     </Scope>
     <Scope Scope="All Faces Configurations"/>
 </Scene>
index 38b056917804260eca1b4fe9d0df33d82f400d57..d78b32d1ce13637e7913d3c4ec5898c247554dec 100644 (file)
@@ -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 JobsAdminUserWebSessionBean implements JobsAdminUserWebSessionContr
         */
        private Integer zipCode;
 
+       /**
+        * Regular user controller
+        */
+       @Inject
+       private PizzaUserWebSessionController userController;
+
        /**
         * Default constructor
         */
@@ -201,6 +221,128 @@ public class JobsAdminUserWebSessionBean implements JobsAdminUserWebSessionContr
                }
        }
 
+       @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(PizzaUserWebSessionController.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() >= PizzaUserWebSessionController.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<User> allUsers () {
                // Return it
@@ -461,6 +603,15 @@ public class JobsAdminUserWebSessionBean implements JobsAdminUserWebSessionContr
                this.userList = this.userBean.allUsers();
        }
 
+       /**
+        * Checks if same password is entered and that they are not empty.
+        * <p>
+        * @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
index 24c2dca096b5d6d34507025324665f7de25f79bc..f14ccb9cd42ff327e700ed7d1d7bd90fb1602e2a 100644 (file)
@@ -59,6 +59,13 @@ public interface JobsAdminUserWebSessionController 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
         * <p>
index 1c143ea40e83cc662dd55b3b0b77860e0ab2954c..1c38fc4297d6a9699c2bb092b20c72ea7417d025 100644 (file)
@@ -19,7 +19,6 @@ package org.mxchange.jjobs.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;
@@ -336,12 +335,11 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
                // Update all data ...
                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());
@@ -413,7 +411,6 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
                contact.setContactComment(this.getComment());
 
                // Created timestamp and ownContact
-               contact.setContactCreated(new GregorianCalendar());
                contact.setContactOwnContact(Boolean.TRUE);
 
                // Set contact in user
@@ -421,6 +418,7 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 
                // Trace message
                //this.getLogger().logTrace(MessageFormat.format("createUserInstance: user={0} - EXIT!", user));
+
                // Return it
                return user;
        }
@@ -810,7 +808,7 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 
        @Override
        public boolean isSamePasswordEntered () {
-               return (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat()));
+               return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
        }
 
        @Override
index d455ec6d3262c169622099f7b959613b54e11443..b29c3e22d784ff897c86ed3298b5a20502b13460 100644 (file)
@@ -35,6 +35,11 @@ import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
  */
 public interface JobsUserWebSessionController 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.
index 380624a920ff189a4494fb6b7038341dc0b10f15..4099c69faf0c9e04419635a166e35ad6417780c6 100644 (file)
@@ -136,4 +136,5 @@ public class JobsCountryConverter implements Converter {
                // Return category id
                return String.valueOf(((Country) value).getCountryId());
        }
+
 }
index 250802d1e7361cffa4f14ab2275a630a317818e6..99feb4eb83e9143936d4bf2379e6d4b85eac84c4 100644 (file)
@@ -136,4 +136,5 @@ public class JobsSmsProviderConverter implements Converter {
                // Return category id
                return String.valueOf(((SmsProvider) value).getProviderId());
        }
+
 }
index 6cb876aff82a07acd40274c7c71edf63176126fd..e01330bfcce8dcd8444088e0859d74bbac41fe84 100644 (file)
        </validator>
        <navigation-rule>
                <from-view-id>*</from-view-id>
+               <navigation-case>
+                       <from-outcome>exception</from-outcome>
+                       <to-view-id>/exception.xhtml</to-view-id>
+               </navigation-case>
                <navigation-case>
                        <from-outcome>index</from-outcome>
                        <to-view-id>/index.xhtml</to-view-id>
                        <from-outcome>user_resend_link</from-outcome>
                        <to-view-id>/user/resend_link.xhtml</to-view-id>
                </navigation-case>
-               <navigation-case>
-                       <from-outcome>login_all_applications</from-outcome>
-                       <to-view-id>/login/login_all_applications.xhtml</to-view-id>
-               </navigation-case>
                <navigation-case>
                        <from-outcome>user_list</from-outcome>
                        <to-view-id>/user/user_list.xhtml</to-view-id>
                        <to-view-id>/admin/admin_country_edit.xhtml</to-view-id>
                </navigation-case>
        </navigation-rule>
+       <!--
+       <factory>
+               <exception-handler-factory>
+                       org.mxchange.jcoreee.exceptions.CustomExceptionHandlerFactory
+               </exception-handler-factory>
+       </factory>
+       //-->
 </faces-config>
diff --git a/web/exception.xhtml b/web/exception.xhtml
new file mode 100644 (file)
index 0000000..cbb6ce5
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+         xmlns:ui="http://java.sun.com/jsf/facelets"
+         xmlns:h="http://xmlns.jcp.org/jsf/html"
+         xmlns:f="http://xmlns.jcp.org/jsf/core"
+         >
+
+       <ui:composition template="/WEB-INF/templates/guest/guest_base.tpl">
+               <ui:define name="guest_title">#{msg.PAGE_TITLE_EXCEPTION_THROWN}</ui:define>
+
+               <ui:define name="content_header">
+                       #{msg.CONTENT_TITLE_EXCEPTION_THROWN}
+               </ui:define>
+
+               <ui:define name="content">
+                       Unfortunately an unexpected error has occurred.
+               </ui:define>
+       </ui:composition>
+</html>