User.java 7.85 KB
package fi.insomnia.bortal.model;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
import org.eclipse.persistence.annotations.PrivateOwned;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.enums.Gender;
import fi.insomnia.bortal.utilities.PasswordFunctions;

/**
 * 
 */
@Entity
@Table(name = "users")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class User extends GenericEntity implements IUser {
    public static final String ANONYMOUS_LOGINNAME = "anonymous";
    private static final long serialVersionUID = -1632200627103418206L;

    @Column(name = "created", nullable = false, updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar created = Calendar.getInstance();

    @NotNull
    @Column(name = "login", unique = true, nullable = false)
    private String login = "";

    @Column(name = "active", nullable = false, columnDefinition = "boolean default true")
    private boolean active = true;

    @Column(name = "password")
    private String password;

    @Column(name = "lastname")
    private String lastname = "";

    @Column(name = "firstnames")
    private String firstnames = "";

    @Column(name = "birthday")
    @Temporal(TemporalType.TIMESTAMP)
    private Date birthday;

    @Column(name = "nick")
    private String nick = "";

    @Column(name = "email")
    private String email = "";

    @Column(name = "address")
    private String address = "";

    @Column(name = "zip")
    private String zip = "";

    @Column(name = "postal_town")
    private String postalTown = "";

    @Column(name = "town")
    private String town = "";

    @Column(name = "phone")
    private String phone = "";

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "current_image_id", referencedColumnName = "id")
    private UserImage currentImage;

    @Enumerated(EnumType.STRING)
    @Column(name = "gender", nullable = false)
    private Gender gender = Gender.UNDEFINED;

    /**
     * hash generated for password reset..
     */
    @Column(name = "confirm_hash")
    private String confirmHash;

    @Column(name = "confirm_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar confirmTime;

    @Column(name = "superadmin")
    private boolean superadmin = false;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    @OrderBy
    @PrivateOwned
    private List<UserImage> userImageList;

    @Transient
    private static final Logger logger = LoggerFactory.getLogger(User.class);

    @Override
    public Calendar getCreated() {
        return created;
    }

    @Override
    public void setCreated(Calendar created) {
        this.created = created;
    }

    @Override
    public boolean getActive() {
        return active;
    }

    @Override
    public void setActive(boolean active) {
        this.active = active;
    }

    @Override
    public String getPassword() {
        logger.warn("Directly reading raw User password");
        return password;
    }

    @Override
    public void setPassword(String password) {
        logger.warn("Directly settings raw User password");
        this.password = password;
    }

    @Override
    public String getWholeName() {
        String ret = new StringBuilder().append(firstnames).append(" ").append(lastname).toString().trim();
        if (ret.isEmpty()) {
            ret = login;
        }
        return ret;
    }

    @Override
    public String getLastname() {
        return lastname;
    }

    @Override
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    @Override
    public String getFirstnames() {
        return firstnames;
    }

    @Override
    public void setFirstnames(String firstnames) {
        this.firstnames = firstnames;
    }

    @Override
    public Date getBirthday() {
        return birthday;
    }

    @Override
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String getNick() {
        return nick;
    }

    @Override
    public void setNick(String nick) {
        this.nick = nick;
    }

    @Override
    public String getEmail() {
        return email;
    }

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

    @Override
    public String getAddress() {
        return address;
    }

    @Override
    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String getZip() {
        return zip;
    }

    @Override
    public void setZip(String zip) {
        this.zip = zip;
    }

    @Override
    public String getTown() {
        return town;
    }

    @Override
    public void setTown(String town) {
        this.town = town;
    }

    @Override
    public String getPhone() {
        return phone;
    }

    @Override
    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String getLogin() {
        return login;
    }

    @Override
    public void setLogin(String login) {
        // Do not allow anonymous userchange
        if (!isAnonymous()) {
            if (login != null) {
                this.login = login.trim().toLowerCase();
            } else {
                login = null;
            }
        }

    }

    @Override
    public List<UserImage> getUserImageList() {
        return userImageList;
    }

    @Override
    public void setUserImageList(List<UserImage> userImageList) {
        this.userImageList = userImageList;
    }

    @Override
    public String getConfirmHash() {
        return confirmHash;
    }

    @Override
    public void setConfirmHash(String confirmHash) {
        this.confirmHash = confirmHash;
    }

    @Override
    public Calendar getConfirmTime() {
        return confirmTime;
    }

    @Override
    public void setConfirmTime(Calendar confirmTime) {
        this.confirmTime = confirmTime;
    }

    @Override
    public void resetPassword(String password) {
        String newEncryptedPassword = PasswordFunctions.getEncryptedPassword(password);
        this.password = newEncryptedPassword; // Bypass setter
    }

    @Override
    public boolean checkPassword(String plainPassword) {
        boolean matches = PasswordFunctions.checkPlainPassword(plainPassword, this.password);
        return matches;
    }

    @Override
    public void setSuperadmin(boolean superadmin) {
        this.superadmin = superadmin;
    }

    @Override
    public boolean isSuperadmin() {
        return superadmin;
    }

    @Override
    public void setPostalTown(String postalTown) {
        this.postalTown = postalTown;
    }

    @Override
    public String getPostalTown() {
        return postalTown;
    }

    @Override
    public void setGender(Gender gender) {
        this.gender = gender;
    }

    @Override
    public Gender getGender() {
        return gender;
    }

    @Override
    public void setCurrentImage(UserImage currentImage) {
        this.currentImage = currentImage;
    }

    @Override
    public UserImage getCurrentImage() {
        return currentImage;
    }

    @Transient
    private Boolean isAnon;

    @Override
    public boolean isAnonymous() {
        if (isAnon == null) {
            isAnon = ANONYMOUS_LOGINNAME.equals(login);
        }
        return isAnon;
    }

}