/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki.core.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OrderBy; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.Version; import org.hibernate.validator.Email; import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; import org.hibernate.validator.Pattern; @Entity @Table(name = "USERS") @org.hibernate.annotations.BatchSize(size = 20) public class User implements Serializable { public static final String GUEST_USERNAME = "guest"; public static final String ADMIN_USERNAME = "admin"; @Id @GeneratedValue(generator = "wikiSequenceGenerator") @Column(name = "USER_ID") private Long id = null; @Version @Column(name = "OBJ_VERSION", nullable = false) private int version = 0; @Column(name = "FIRSTNAME", length = 63, nullable = false) @NotNull @Length(min = 1, max = 63) @Pattern( regex="[^\\t\\n\\r\\f\\a\\e]+", message="#{messages['lacewiki.entity.NameMustNotContainSpecialCharacters']}" ) private String firstname; @Column(name = "LASTNAME", length = 63, nullable = false) @NotNull @Length(min = 1, max = 63) @Pattern( regex="[^\\t\\n\\r\\f\\a\\e]+", message="#{messages['lacewiki.entity.NameMustNotContainSpecialCharacters']}" ) private String lastname; @Column(name = "USERNAME", length = 16, nullable = false, unique = true) @NotNull @Length(min = 1, max = 16) @Pattern( regex="[a-zA-Z]?[a-zA-Z0-9]+", message="#{messages['lacewiki.entity.UsernameMustStartWithALetterAndOnlyContainLetters']}" ) private String username; // Unique and immutable @Column(name = "PASSWORDHASH", length = 255, nullable = false) private String passwordHash; @Column(name = "EMAIL", length = 255, nullable = false) @NotNull @Email private String email; @Column(name = "ACTIVATED", nullable = false) private boolean activated = false; @Column(name = "ACTIVATION_CODE", length = 255, nullable = true) private String activationCode; @Column(name = "CREATED_ON", nullable = false, updatable = false) private Date createdOn = new Date(); @Column(name = "LAST_LOGIN_ON", nullable = true) private Date lastLoginOn = new Date(); @Column(name = "REGISTERED_ADDRESS", length = 255, nullable = true) private String registeredAddress; @Transient private Date previousLastLoginOn = new Date(); @ManyToMany(fetch = FetchType.LAZY) // Lazy so our @OrderBy works @JoinTable( name = "USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID") ) @OrderBy("accessLevel desc, displayName asc") @org.hibernate.annotations.ForeignKey(name = "USER_ROLE_USER_ID", inverseName = "USER_ROLE_ROLE_ID") private List<Role> roles = new ArrayList<Role>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MEMBER_HOME_WIKI_DIRECTORY_ID", nullable = true, unique = true) @org.hibernate.annotations.ForeignKey(name = "FK_USER_MEMBER_HOME_WIKI_DIRECTORY_ID") private WikiDirectory memberHome; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name = "USER_PROFILE_ID", nullable = false, unique = true) @org.hibernate.annotations.ForeignKey(name = "FK_USER_USER_PROFILE_ID") private UserProfile profile = new UserProfile(); @Transient private long ratingPoints = 0; public User() {} public User(String firstname, String lastname, String username, String passwordHash, String email) { this.firstname = firstname; this.lastname = lastname; this.username = username; this.passwordHash = passwordHash; this.email = email; } // Immutable properties public Integer getVersion() { return version; } public Date getCreatedOn() { return createdOn; } // Mutable properties public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getFullname() { return getFirstname() + " " + getLastname(); } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasswordHash() { return passwordHash; } public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public boolean isActivated() { return activated; } public void setActivated(boolean activated) { this.activated = activated; } public Date getLastLoginOn() { return lastLoginOn; } public void setLastLoginOn(Date lastLoginOn) { this.lastLoginOn = lastLoginOn; } public Date getPreviousLastLoginOn() { return previousLastLoginOn; } public void setPreviousLastLoginOn(Date previousLastLoginOn) { this.previousLastLoginOn = previousLastLoginOn; } public String getActivationCode() { return activationCode; } public void setActivationCode(String activationCode) { this.activationCode = activationCode; } public String getRegisteredAddress() { return registeredAddress; } public void setRegisteredAddress(String registeredAddress) { this.registeredAddress = registeredAddress; } public WikiDirectory getMemberHome() { return memberHome; } public void setMemberHome(WikiDirectory memberHome) { this.memberHome = memberHome; } public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } public UserProfile getProfile() { return profile; } public void setProfile(UserProfile profile) { this.profile = profile; } public long getRatingPoints() { return ratingPoints; } public void setRatingPoints(long ratingPoints) { this.ratingPoints = ratingPoints; } // Misc methods public boolean isGuest() { return GUEST_USERNAME.equals(getUsername()); } public boolean isAdmin() { return ADMIN_USERNAME.equals(getUsername()); } public String toString() { return getUsername(); } }