<Scene Scope="Project" version="2">
<Scope Scope="Faces Configuration Only"/>
<Scope Scope="Project">
- <Node id="login/login_shared_addressbooks.xhtml" x="1150" y="150" zoom="true"/>
- <Node id="admin/admin_country_list.xhtml" x="1650" y="300" zoom="true"/>
- <Node id="admin/admin_user_delete.xhtml" x="400" y="750" zoom="true"/>
- <Node id="login/login_change_password.xhtml" x="1400" y="300" zoom="true"/>
- <Node id="privacy.xhtml" x="1150" y="600" zoom="true"/>
- <Node id="admin/index.xhtml" x="900" y="150" zoom="true"/>
- <Node id="basket.xhtml" x="900" y="750" zoom="true"/>
- <Node id="login/login_data_saved.xhtml" x="1400" y="600" zoom="true"/>
- <Node id="admin/admin_country_delete.xhtml" x="400" y="150" zoom="true"/>
- <Node id="login/login_start_sharing_addressbook.xhtml" x="650" y="750" zoom="true"/>
- <Node id="user/register.xhtml" x="400" y="450" zoom="true"/>
- <Node id="admin/admin_country_edit.xhtml" x="150" y="750" zoom="true"/>
- <Node id="user/resend_link.xhtml" x="150" y="450" zoom="true"/>
- <Node id="login/login_index.xhtml" x="400" y="900" zoom="true"/>
- <Node id="login/login_add_addressbook.xhtml" x="150" y="1050" zoom="true"/>
- <Node id="login/login_own_addressbooks.xhtml" x="650" y="450" zoom="true"/>
- <Node id="admin/admin_user_list.xhtml" x="400" y="600" zoom="true"/>
- <Node id="admin/admin_logout.xhtml" x="400" y="300" zoom="true"/>
- <Node id="terms.xhtml" x="1650" y="150" zoom="true"/>
- <Node id="admin/admin_user_add.xhtml" x="900" y="600" zoom="true"/>
- <Node id="admin/admin_user_edit.xhtml" x="1900" y="300" zoom="true"/>
- <Node id="user/user_list.xhtml" x="900" y="300" zoom="true"/>
- <Node id="errorHandler.xhtml" x="650" y="150" zoom="true"/>
- <Node id="index.xhtml" x="650" y="300" zoom="true"/>
- <Node id="logout.xhtml" x="1650" y="450" zoom="true"/>
- <Node id="user/register_done.xhtml" x="1900" y="150" zoom="true"/>
- <Node id="login/login_change_personal_data.xhtml" x="150" y="300" zoom="true"/>
- <Node id="user/user_profile.xhtml" x="1400" y="150" zoom="true"/>
- <Node id="admin/admin_user_unlock.xhtml" x="650" y="900" zoom="true"/>
- <Node id="imprint.xhtml" x="150" y="900" zoom="true"/>
- <Node id="user/show_addressbook.xhtml" x="400" y="1050" zoom="true"/>
- <Node id="*" x="150" y="1200" zoom="true"/>
- <Node id="user/login_error.xhtml" x="650" y="600" zoom="true"/>
- <Node id="login/login_other_addressbooks.xhtml" x="1150" y="300" zoom="true"/>
- <Node id="user/show_addressbook_entries.xhtml" x="900" y="450" zoom="true"/>
- <Node id="login/login_change_email_address.xhtml" x="1400" y="450" zoom="true"/>
- <Node id="user/lost_passwd.xhtml" x="150" y="600" zoom="true"/>
- <Node id="user/login.xhtml" x="1150" y="450" zoom="true"/>
- <Node id="login/login_list_sharing_addressbooks.xhtml" x="2150" y="150" zoom="true"/>
- <Node id="login/login_edit_user_data.xhtml" x="150" y="150" zoom="true"/>
+ <Node id="login/login_shared_addressbooks.xhtml" x="1048" y="32" zoom="true"/>
+ <Node id="admin/admin_country_list.xhtml" x="7861" y="32" zoom="true"/>
+ <Node id="admin/admin_user_delete.xhtml" x="2763" y="32" zoom="true"/>
+ <Node id="privacy.xhtml" x="3409" y="32" zoom="true"/>
+ <Node id="login/login_change_password.xhtml" x="7439" y="32" zoom="true"/>
+ <Node id="admin/index.xhtml" x="10625" y="32" zoom="true"/>
+ <Node id="basket.xhtml" x="785" y="32" zoom="true"/>
+ <Node id="login/login_data_saved.xhtml" x="4684" y="32" zoom="true"/>
+ <Node id="exception.xhtml" x="5059" y="32" zoom="true"/>
+ <Node id="admin/admin_country_delete.xhtml" x="13542" y="32" zoom="true"/>
+ <Node id="login/login_start_sharing_addressbook.xhtml" x="8253" y="32" zoom="true"/>
+ <Node id="user/register.xhtml" x="3933" y="32" zoom="true"/>
+ <Node id="admin/admin_country_edit.xhtml" x="5342" y="32" zoom="true"/>
+ <Node id="user/resend_link.xhtml" x="7108" y="32" zoom="true"/>
+ <Node id="login/login_add_addressbook.xhtml" x="9941" y="32" zoom="true"/>
+ <Node id="login/login_index.xhtml" x="12549" y="32" zoom="true"/>
+ <Node id="login/login_own_addressbooks.xhtml" x="9510" y="32" zoom="true"/>
+ <Node id="admin/admin_user_list.xhtml" x="9140" y="32" zoom="true"/>
+ <Node id="terms.xhtml" x="6399" y="32" zoom="true"/>
+ <Node id="admin/admin_logout.xhtml" x="11116" y="32" zoom="true"/>
+ <Node id="admin/admin_user_add.xhtml" x="34" y="32" zoom="true"/>
+ <Node id="admin/admin_user_edit.xhtml" x="409" y="32" zoom="true"/>
+ <Node id="user/user_list.xhtml" x="5740" y="32" zoom="true"/>
+ <Node id="index.xhtml" x="3157" y="32" zoom="true"/>
+ <Node id="logout.xhtml" x="3673" y="32" zoom="true"/>
+ <Node id="user/register_done.xhtml" x="6050" y="32" zoom="true"/>
+ <Node id="user/user_profile.xhtml" x="13208" y="32" zoom="true"/>
+ <Node id="login/login_change_personal_data.xhtml" x="11472" y="32" zoom="true"/>
+ <Node id="admin/admin_user_unlock.xhtml" x="1982" y="32" zoom="true"/>
+ <Node id="user/show_addressbook.xhtml" x="2376" y="32" zoom="true"/>
+ <Node id="imprint.xhtml" x="10361" y="32" zoom="true"/>
+ <Node id="*" x="10924" y="32" zoom="true"/>
+ <Node id="user/login_error.xhtml" x="12881" y="32" zoom="true"/>
+ <Node id="login/login_other_addressbooks.xhtml" x="13958" y="32" zoom="true"/>
+ <Node id="user/show_addressbook_entries.xhtml" x="4240" y="32" zoom="true"/>
+ <Node id="login/login_change_email_address.xhtml" x="6654" y="32" zoom="true"/>
+ <Node id="user/lost_passwd.xhtml" x="11926" y="32" zoom="true"/>
+ <Node id="login/login_list_sharing_addressbooks.xhtml" x="1499" y="32" zoom="true"/>
+ <Node id="user/login.xhtml" x="12264" y="32" zoom="true"/>
+ <Node id="login/login_edit_user_data.xhtml" x="8741" y="32" zoom="true"/>
</Scope>
<Scope Scope="All Faces Configurations"/>
</Scene>
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;
/**
*/
private Integer zipCode;
+ /**
+ * Regular user controller
+ */
+ @Inject
+ private AddressbookUserWebSessionController userController;
+
/**
* Default constructor
*/
}
}
+ @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<User> allUsers () {
// Return it
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
*/
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>
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;
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());
contact.setContactComment(this.getComment());
// Created timestamp and ownContact
- contact.setContactCreated(new GregorianCalendar());
contact.setContactOwnContact(Boolean.TRUE);
// Set contact in user
// Trace message
//this.getLogger().logTrace(MessageFormat.format("createUserInstance: user={0} - EXIT!", user));
+
// Return it
return user;
}
}
@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
@Override
public boolean isSamePasswordEntered () {
- return (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat()));
+ return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
}
@Override
*/
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.
// Return category id
return String.valueOf(((Country) value).getCountryId());
}
+
}
// Return category id
return String.valueOf(((SmsProvider) value).getProviderId());
}
+
}
<to-view-id>/basket.xhtml</to-view-id>
</navigation-case>
<navigation-case>
- <from-outcome>item_not_changed</from-outcome>
- <to-view-id>/errorHandler.xhtml</to-view-id>
+ <from-outcome>exception</from-outcome>
+ <to-view-id>/exception.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>admin_delete_user</from-outcome>
<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>
--- /dev/null
+<?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>