es.alvsanand.webpage.web.beans.session.RegistrationBean.java Source code

Java tutorial

Introduction

Here is the source code for es.alvsanand.webpage.web.beans.session.RegistrationBean.java

Source

/*
 * Copyright 2008-2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package es.alvsanand.webpage.web.beans.session;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.security.NoSuchAlgorithmException;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.primefaces.event.FileUploadEvent;

import com.google.appengine.api.datastore.Blob;

import es.alvsanand.webpage.AlvsanandException;
import es.alvsanand.webpage.common.FacesUtils;
import es.alvsanand.webpage.common.Globals;
import es.alvsanand.webpage.common.Logger;
import es.alvsanand.webpage.common.MessageResources;
import es.alvsanand.webpage.model.Avatar;
import es.alvsanand.webpage.model.Role;
import es.alvsanand.webpage.model.User;
import es.alvsanand.webpage.model.UserState;
import es.alvsanand.webpage.model.security.GrantedAuthorityImpl;
import es.alvsanand.webpage.services.ServiceException;
import es.alvsanand.webpage.services.security.CryptographyService;
import es.alvsanand.webpage.services.security.CryptographyServiceImpl;
import es.alvsanand.webpage.services.session.UserService;
import es.alvsanand.webpage.services.session.UserServiceImpl;

/**
 * This bean process the flow for the user operations
 * 
 * @author alvaro.santos
 * @date 18/11/2009
 * 
 */
@SessionScoped
@ManagedBean(name = "registrationBean")
public class RegistrationBean implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1602676211690700905L;

    private transient static final Logger logger = new Logger(RegistrationBean.class);

    private transient static final String END_REGISTRATION_VIEW_ID = "/xhtml/session/endRegistration.jsf";

    private transient static final String END_RESET_PASSWORD_VIEW_ID = "/xhtml/session/endResetPassword.jsf";

    private transient static final String MODIFY_PERSONAL_DATA_VIEW_ID = "/xhtml/secured/modifyPersonalData.jsf";

    private transient CryptographyService cryptographyService;

    private transient UserService userService;

    private String loginName;

    private String name;

    private String password;

    private String rePassword;

    private String surname;

    private String email;

    private String recaptcha;

    private boolean privacy;

    private transient UIInput passwordComponent;

    private String registrationHash;

    private boolean savedPersonalData;

    private byte[] photoData;

    private String photoMediaType;

    private boolean showFileUpload;

    public RegistrationBean() {
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRePassword() {
        return rePassword;
    }

    public void setRePassword(String rePassword) {
        this.rePassword = rePassword;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getRecaptcha() {
        return recaptcha;
    }

    public void setRecaptcha(String recaptcha) {
        this.recaptcha = recaptcha;
    }

    public UIInput getPasswordComponent() {
        return passwordComponent;
    }

    public void setPasswordComponent(UIInput passwordComponent) {
        this.passwordComponent = passwordComponent;
    }

    public boolean isPrivacy() {
        return privacy;
    }

    public void setPrivacy(boolean privacy) {
        this.privacy = privacy;
    }

    public String getRegistrationHash() {
        return registrationHash;
    }

    public void setRegistrationHash(String registrationHash) {
        this.registrationHash = registrationHash;
    }

    public boolean isSavedPersonalData() {
        return savedPersonalData;
    }

    public void setSavedPersonalData(boolean savedPersonalData) {
        this.savedPersonalData = savedPersonalData;
    }

    public byte[] getPhotoData() {
        return photoData;
    }

    public void setPhotoData(byte[] photoData) {
        this.photoData = photoData;
    }

    public String getPhotoMediaType() {
        return photoMediaType;
    }

    public void setPhotoMediaType(String photoMediaType) {
        this.photoMediaType = photoMediaType;
    }

    public UserService getUserService() {
        if (userService == null) {
            userService = new UserServiceImpl();
        }

        return userService;
    }

    public CryptographyService getCryptographyService() {
        if (cryptographyService == null) {
            cryptographyService = new CryptographyServiceImpl();
        }
        return cryptographyService;
    }

    public boolean isShowFileUpload() {
        return showFileUpload;
    }

    public void setShowFileUpload(boolean showFileUpload) {
        this.showFileUpload = showFileUpload;
    }

    // JSF methods

    public void create() {
        logger.info("Launched RegistrationBean.create");

        loginName = null;
        name = null;
        password = null;
        rePassword = null;
        surname = null;
        email = null;
        recaptcha = null;
        privacy = false;
        registrationHash = null;
        photoData = null;
        photoMediaType = null;
        showFileUpload = false;
    }

    public String save() throws AlvsanandException {
        logger.info("Launched RegistrationBean.save[" + loginName + "]");

        User user = new User();

        user.setLoginName(loginName);
        user.setPassword(password);
        user.setName(loginName);
        user.setSurname(surname);
        user.setEmail(email);

        Role role = new Role();
        role.setName(GrantedAuthorityImpl.ROLE_GENERIC_USER.getAuthority());
        user.setRole(role);
        user.setState(UserState.REGISTERED.getValue());

        if (user != null && user.getPassword() != null) {
            try {
                String passwordDigested = new String(
                        Base64.encodeBase64(getCryptographyService().digest(user.getPassword().getBytes())));

                user.setPassword(passwordDigested);

                String registrationHash = es.alvsanand.webpage.common.StringUtils.generateRandomString();

                user.setRegistrationHash(registrationHash);
            } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
            }
        }

        getUserService().saveUser(user);

        getUserService().sendActivationEmail(user);

        FacesMessage message = new FacesMessage();
        message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.end.completed.detail", null));
        message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.end.completed.summary", null));
        message.setSeverity(FacesMessage.SEVERITY_INFO);

        FacesContext.getCurrentInstance().addMessage(null, message);

        return END_REGISTRATION_VIEW_ID;
    }

    public void validateRePassword(FacesContext context, UIComponent validate, Object value) {
        logger.info("Launched RegistrationBean.validateRePassword");

        String rePassword = (String) value;

        String password = (String) getPasswordComponent().getLocalValue();

        if (StringUtils.isEmpty(rePassword) || !rePassword.equals(password)) {
            ((UIInput) validate).setValid(false);
            FacesMessage message = new FacesMessage();
            message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.form.validation.validateRePassword.detail", null));
            message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.form.validation.validateRePassword.summary", null));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);

            throw new ValidatorException(message);
        }
    }

    public void validateName(FacesContext context, UIComponent validate, Object value) throws AlvsanandException {
        logger.info("Launched RegistrationBean.validateName");

        String name = (String) value;

        if (!StringUtils.isEmpty(name)) {
            int count = 0;
            try {
                count = getUserService().getUserCount(name);
            } catch (ServiceException ex) {
                throw ex;
            }

            if (count > 0) {
                ((UIInput) validate).setValid(false);

                FacesMessage message = new FacesMessage();
                message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                        "error.form.validation.validateUserName.detail", null));
                message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                        "error.form.validation.validateUserName.summary", null));
                message.setSeverity(FacesMessage.SEVERITY_ERROR);

                throw new ValidatorException(message);
            }
        }
    }

    public void activate() throws AlvsanandException {
        logger.info("Launched RegistrationBean.activate[" + registrationHash + "]");

        User user = getUserService().getUserByRegistrationHash(registrationHash);

        if (user == null) {
            FacesMessage message = new FacesMessage();
            message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.activate.registrationHash.detail", null));
            message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.activate.registrationHash.summary", null));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);

            FacesContext.getCurrentInstance().addMessage(null, message);
            return;
        }
        if (user.getState() != UserState.REGISTERED.getValue()) {
            FacesMessage message = new FacesMessage();
            message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.activate.activated.detail", null));
            message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.activate.activated.summary", null));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null, message);
            return;
        }

        user.setState(UserState.ACCEPTED.getValue());

        getUserService().saveUser(user);

        FacesMessage message = new FacesMessage();
        message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.activation.completed.detail", null));
        message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.activation.completed.summary", null));
        message.setSeverity(FacesMessage.SEVERITY_INFO);

        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public String resetPassword() throws AlvsanandException {
        logger.info("Launched RegistrationBean.resetPassword[" + loginName + "]");

        User user = getUserService().getUserByLoginName(loginName);

        if (user == null) {
            FacesMessage message = new FacesMessage();
            message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.resetPassword.loginName.detail", null));
            message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.resetPassword.loginName.summary", null));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);

            FacesContext.getCurrentInstance().addMessage(null, message);
            return END_RESET_PASSWORD_VIEW_ID;
        }

        String plainPassword = es.alvsanand.webpage.common.StringUtils.generateRandomString();

        try {
            String passwordDigested = new String(
                    Base64.encodeBase64(getCryptographyService().digest(plainPassword.getBytes())));

            user.setPassword(passwordDigested);
        } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
        }

        getUserService().saveUser(user);

        getUserService().sendResetPasswordEmail(user, plainPassword);

        FacesMessage message = new FacesMessage();
        message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.resetPassword.activation.completed.detail", null));
        message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.resetPassword.activation.completed.summary", null));
        message.setSeverity(FacesMessage.SEVERITY_INFO);

        FacesContext.getCurrentInstance().addMessage(null, message);

        return END_RESET_PASSWORD_VIEW_ID;
    }

    public void loadPersonalData() throws AlvsanandException {
        User actualUser = (User) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                .get(Globals.SES_USER);

        logger.info("Launched RegistrationBean.loadPersonalData[" + actualUser + "]");

        User user = getUserService().getUser(actualUser);

        name = user.getName();
        surname = user.getSurname();
        email = user.getEmail();
        password = null;
        rePassword = null;
        savedPersonalData = false;
    }

    public String savePersonalData() throws AlvsanandException {
        User actualUser = (User) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                .get(Globals.SES_USER);

        logger.info("Launched RegistrationBean.savePersonalData[" + actualUser + "]");

        savedPersonalData = true;

        User user = getUserService().getUser(actualUser);

        user.setPassword(password);
        user.setName(name);
        user.setSurname(surname);
        user.setEmail(email);

        if (photoData != null && StringUtils.isNotEmpty(photoMediaType)) {
            Avatar avatar = new Avatar();
            avatar.setDate(new Date());
            avatar.setUser(actualUser);
            avatar.setMediaType(photoMediaType);
            avatar.setData(new Blob(photoData));

            user.setAvatar(avatar);

            photoData = null;
            photoMediaType = null;
        }

        if (user != null && user.getPassword() != null) {
            try {
                String passwordDigested = new String(
                        Base64.encodeBase64(getCryptographyService().digest(user.getPassword().getBytes())));

                user.setPassword(passwordDigested);
            } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
            }
        }

        getUserService().saveUser(user);

        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(Globals.SES_USER, user);

        FacesMessage message = new FacesMessage();
        message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.modifyPersonalData.completed.detail", null));
        message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME,
                "registration.modifyPersonalData.completed.summary", null));
        message.setSeverity(FacesMessage.SEVERITY_INFO);

        FacesContext.getCurrentInstance().addMessage(null, message);

        password = null;
        rePassword = null;
        showFileUpload = false;

        return MODIFY_PERSONAL_DATA_VIEW_ID;
    }

    public void toggleFileUpload() throws AlvsanandException {
        logger.info("Launched RegistrationBean.toggleFileUpload");

        showFileUpload = !showFileUpload;
    }

    public void handleFileUpload(FileUploadEvent fileUploadEvent) {
        logger.info("Uploaded: {" + fileUploadEvent.getFile().getFileName() + "}");

        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent fileUploadComponent = FacesUtils.findComponent(context.getViewRoot(), "fileUpload");

        InputStream inputStream = null;
        try {
            inputStream = fileUploadEvent.getFile().getInputstream();

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            byte[] buf = new byte[1024];

            int length;

            while ((length = inputStream.read(buf)) > 0) {
                outputStream.write(buf, 0, length);
            }

            inputStream.close();

            photoData = outputStream.toByteArray();

            outputStream.close();

            FileNameMap fileNameMap = URLConnection.getFileNameMap();

            photoMediaType = fileNameMap.getContentTypeFor(fileUploadEvent.getFile().getFileName());

            showFileUpload = false;
        } catch (IOException e1) {
            FacesMessage message = new FacesMessage();
            message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.modifyPersonalData.fileUpload.detail", null));
            message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME,
                    "error.modifyPersonalData.fileUpload.summary", null));
            message.setSeverity(FacesMessage.SEVERITY_ERROR);

            FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message);

            showFileUpload = false;
            return;
        }
    }
}